2013-06-20 2 views
1

Je suis en train de convertir du code Delphi alors que nous réécrivons une application Delphi 6.0 (VCL) dans .Net. Je ne suis pas sûr et ne pouvais pas comprendre la comparaison entre 2 points Delphi (x, y) avec celui de C# Point (x, y). J'essaye de tracer une ligne entre 2 points mais comme je n'ai aucune idée de comment Delphi la dessine, je ne suis pas capable de lui donner les coordonnées C#.Conversion de Delphi TPoint en C# Point

Le code Delphi est simple:

Canvas.MoveTo(x, y - 128);  
Canvas.LineTo(x, y); 

Je sais sur le C# coordonnées si environ 72 points par pouce et ont besoin de calculer la densité de pixels. Mais je ne suis pas sûr du PPI Delphi.

Tout serait apprécié. Merci.

Edit: Si quelqu'un se demande ce que TPoint Je parle quand il n'y a pas dans mon extrait de code, Canvas.MoveTo définit la propriété PenPos de la toile qui est de type TPoint.

+1

Les raisons pour les votes vers le bas seraient appréciées. S'il vous plaît ne faites pas de vote parce que vous n'avez pas aimé la question. Ou ne l'a pas compris. –

+1

+1; C'est une question valide. –

Répondre

4

Je ne suis pas sûr de savoir quelle est la question exacte qui est posée ici. Vous n'avez pas de Delphi TPoint dans votre extrait de code; vous avez simplement les coordonnées logiques du client.

L'origine est à X = 0, Y = 0, qui est le coin supérieur gauche de la zone client. Augmenter X déplace la position vers la droite, et l'augmentation de Y déplace la position vers le bas. Les unités logiques sont des pixels, donc à partir de l'origine de 0, 0, un Canvas.MoveTo(10, 10) définirait la nouvelle position de dessin à partir du bord gauche de 10 pixels et en bas des 10 premiers pixels, et un Canvas.LineTo(20, 20) à partir de là tracerait une ligne à partir du point 10, 10 à 20, 20.

TCanvas.MoveTo et TCanvas.LineTo enveloppent simplement autour des fonctions de Windows GDI sous-jacente MoveToEx (avec un troisième paramètre toujours NULL) et LineTo.

En ce qui concerne l'équivalent C#, si vous faites référence à System.Drawing.Point, les unités utilisées sont exactement les mêmes (même si je ne suis pas sûr d'où l'origine est basée par défaut). Étant donné une origine de 0, 0, System.Drawing.Point(10, 10) devrait être la même position décrite ci-dessus - 10 pixels du bord gauche et 10 pixels du bord supérieur.

Une vérification rapide confirme que l'origine dans une application WinForms est en fait le coin supérieur gauche de la zone client, en utilisant:

// Delphi code 
procedure TForm3.FormPaint(Sender: TObject); 
begin 
    Canvas.Pen.Color := clRed; 
    Canvas.MoveTo(0, 0); 
    Canvas.LineTo(100, 100); 
end; 

// C# code 
private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    Pen newPen = new System.Drawing.Pen(Color.Red); 
    e.Graphics.DrawLine(newPen, new Point(0, 0), new Point(100, 100)); 
} 

Ceci produit la sortie suivante:

Side by side output comparison

+0

Pour autant que je sache, la méthode Graphics en C# dépend de la densité de pixels de l'écran ou de la zone client et diffère d'un périphérique à l'autre. Ce que je sais, c'est que l'appareil serait distribué à des points où la densité est de 72 points par pouce. Cependant, en ce moment je vais avec l'explication que vous avez fournie. S'il vous plaît mettre à jour au cas où vous rencontrez d'autres informations à cet égard. Merci pour votre effort. –

+0

Aussi, juste pour expliquer à propos de TPoint, TCanvas.MoveTo, définit la propriété PenPos du canevas qui est un TPoint. –

+0

Vous pouvez définir e.Graphics.PageUnit = GraphicsUnit.Pixel pour qu'il fonctionne sur pixel, quel que soit DPI ou PPI. – HeartWare