2009-08-27 5 views
11

Je dois tracer une ligne d'un pouce de long sur n'importe quel appareil donné une référence Graphics à celui-ci. J'ai besoin d'être un pouce de long, indépendamment de ce que Transform est réglé. Supposons que le facteur d'échelle de la transformée soit donné par scale dans les directions horizontale et verticale.GDI +: Comment tracer une ligne d'un pouce de long sur un périphérique sur lequel il est dessiné?

Certains C++/CLI Code:

g->DrawLine(Pens::Black, 50.0f, 50.0f, 50.0f + oneInchEquivalent/scale, 50.0f); 

Maintenant que n'a pas été difficile du tout! Maintenant tout ce que nous devons faire est de calculer oneInchEquivalent.

g->DpiX me donne une distance de ce qui ressemble à un pouce sur l'écran, mais pas sur l'imprimante. Il semble que sur les imprimantes, dessiner une ligne de 100 unités avec g->PageUnit mis à GraphicsUnit :: Display me donnera une ligne d'un pouce de long. Mais, j'ai vraiment besoin que cela fonctionne quel que soit le paramètre PageUnit. En fait, changer PageUnit va changer la largeur du stylo !!

Éditer: J'ai provisoirement accepté la seule réponse ici car elle est assez proche de ce que je recherche.

+0

J'ai mis à jour ma réponse maintenant avec un échantillon d'impression –

Répondre

12

La réponse est devenue assez longue après quelques modifications, voici donc le résultat final:

Définition de la propriété PageUnit de l'objet Graphics-GraphicsUnit.Pixel et en prenant en multipliant les coordonnées avec les valeurs Dpix et DpiY rendra la résultat attendu sur les périphériques d'affichage et d'imprimante.

private static void DrawInchLine(Graphics g, Color color, Point start, Point end) 
{ 
    GraphicsUnit originalUnit = g.PageUnit; 
    g.PageUnit = GraphicsUnit.Pixel; 
    using (Pen pen = new Pen(color, 1)) 
    { 
     g.DrawLine(pen, 
      start.X * g.DpiX, 
      start.Y * g.DpiY, 
      end.X * g.DpiX, 
      end.Y * g.DpiY); 
    } 
    g.PageUnit = originalUnit; 
} 

Vous pouvez avoir la peinture sur un formulaire (ou un certain contrôle):

using (Graphics g = this.CreateGraphics()) 
{ 
    Point start = new Point(1, 1); 
    Point end = new Point(2, 1); 
    DrawInchLine(g, Color.Black, start, end); 
} 

... ou envoyer la sortie à une imprimante:

PrintDialog dialog = new PrintDialog(); 
if (dialog.ShowDialog() == DialogResult.OK) 
{ 
    PrintDocument pd = new PrintDocument(); 
    pd.PrinterSettings = dialog.PrinterSettings; 
    pd.PrintPage += (psender, pe) => 
    { 
     Point start = new Point(1, 1); 
     Point end = new Point(2, 1); 
     DrawInchLine(pe.Graphics, Color.Black, start, end); 
     pe.HasMorePages = false; 
    }; 

    pd.Print(); 
} 

Cela ne, cependant , comptez sur le réglage PageUnit.

+0

Vous pouvez essayer CutePDF pour un émulateur d'imprimante. Vous pouvez voir les différences là-bas. –

+0

Je viens de réaliser que j'ai une imprimante debout ici; essayé d'imprimer dessus; est sorti à exactement un pouce. Mettra à jour avec le code. –

+0

Merci Fredrik, mais je dois le faire en utilisant Math seul, sans changer le paramètre PageUnit. Changer PageUnit affectera la largeur du stylo. Voir la dernière partie de ma question. –

Questions connexes