none
Changement d'unité graphique dans une WinForm RRS feed

  • Question

  • Bonjour,

    Dans une fenêtre WinForm sous Framework 4.0, je dessine un rectangle avec des unités en millimètres.

    J'utilise pour ce faire les fonctions graphiques PageUnit et PageScale qui définissent l'unité à appliquer.

    Voici le code où PanView est un panel support du dessin :

        Private Sub PanView_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles PanView.Paint
    
            Dim g As Graphics = e.Graphics
    
            g.PageUnit = GraphicsUnit.Millimeter
            g.PageScale = 1
    
            Dim r As New Rectangle(10, 10, 50, 40)
            g.FillRectangle(Brushes.Beige, r)
    
        End Sub
    

    Sur mon écran s'affiche bien le rectangle souhaité mais, à ma grande surprise, ses dimensions mesurées avec un décimètre posé sur l'écran, ne sont pas parfaitement exactes mais légèrement inférieures aux 50 x 40 mm programmées.

    Quelle peut bien être l'origine de cette erreur ?

    Ceci n'est qu'un exemple. Je voudrais dessiner des choses plus complexe ainsi qu'une échelle graduée en millimètres qui soit exacte.

    Merci de vos réponses.

    Cordialement


    Alain

    samedi 7 septembre 2013 20:05

Réponses

  • Bonjour,

    Le PageUnit en Millimetres est utilisé surtout sur les périphériques d'impression.

    A l'écran il est impossible de dessiner réellement en millimètres car il est nécessaire de connaitre 2 paramètres :

    • La résolution utilisée
    • Le DPI physique (et non Windows) de l'écran (ce qui implique de connaitre la taille physique réelle de l'écran).

    Pour illustrer le problème, prenons 2 écrans : l'un de 15" et l'autre 30". Les 2 écrans sont réglés avec la même résolution et le même DPI au niveau Windows. Dans une telle configuration, l'écran de 15" a une densité 2 fois plus importantes de pixels que l'écran de 30". Cela implique que si vous dessinez une ligne de 100 pixels, elle sera 2 fois plus longue sur l'écran 30" que sur l'écran 15".

    Il est donc impossible de dessiner sur un écran en utilisant les unités millimètres (anglo-saxonnes).

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    • Proposé comme réponse Richard ClarkMVP dimanche 8 septembre 2013 14:47
    • Marqué comme réponse Aurel Bera lundi 9 septembre 2013 06:57
    dimanche 8 septembre 2013 08:54
    Modérateur

Toutes les réponses

  • Bonjour,

    Le PageUnit en Millimetres est utilisé surtout sur les périphériques d'impression.

    A l'écran il est impossible de dessiner réellement en millimètres car il est nécessaire de connaitre 2 paramètres :

    • La résolution utilisée
    • Le DPI physique (et non Windows) de l'écran (ce qui implique de connaitre la taille physique réelle de l'écran).

    Pour illustrer le problème, prenons 2 écrans : l'un de 15" et l'autre 30". Les 2 écrans sont réglés avec la même résolution et le même DPI au niveau Windows. Dans une telle configuration, l'écran de 15" a une densité 2 fois plus importantes de pixels que l'écran de 30". Cela implique que si vous dessinez une ligne de 100 pixels, elle sera 2 fois plus longue sur l'écran 30" que sur l'écran 15".

    Il est donc impossible de dessiner sur un écran en utilisant les unités millimètres (anglo-saxonnes).

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    • Proposé comme réponse Richard ClarkMVP dimanche 8 septembre 2013 14:47
    • Marqué comme réponse Aurel Bera lundi 9 septembre 2013 06:57
    dimanche 8 septembre 2013 08:54
    Modérateur
  • Bonjour Gilles,

    J'avais pensé, un peu naïvement sans doute, que la classe Graphics pouvait gérer les deux paramètres que vous citez, soit la densité de pixels sur le périphérique de sortie !

    Mais, dans le fond, cette question n'est pas très importante dans la mesure où le dessin respecte l'échelle affichée.

    Merci de votre réponse.

    Bien cordialement.


    Alain

    dimanche 8 septembre 2013 14:59
  • Bonjour

    Merci de votre retour, AchLog.

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 9 septembre 2013 06:58