2009-09-28 9 views
9

Je dessine un graphique sur une commande, mais 0,0 se trouve dans le coin supérieur gauche du contrôle. Y at-il un moyen de retourner les coordonnées de sorte que 0,0 est dans le coin inférieur gauche du contrôle?Déplacer les coordonnées lors du dessin à contrôler

+0

Utilisez-vous WinForms ou WPF? Vous aimeriez peut-être mettre à jour les tags sur votre question. –

Répondre

13

Si vous utilisez WinForms, vous trouverez peut-être que vous pouvez faire pivoter l'axe Y à l'aide Graphics.ScaleTransform:

private void ScaleTransformFloat(PaintEventArgs e) 
{ 
    // Begin graphics container 
    GraphicsContainer containerState = e.Graphics.BeginContainer(); 

    // Flip the Y-Axis 
    e.Graphics.ScaleTransform(1.0F, -1.0F); 

    // Translate the drawing area accordingly 
    e.Graphics.TranslateTransform(0.0F, -(float)Height); 

    // Whatever you draw now (using this graphics context) will appear as 
    // though (0,0) were at the bottom left corner 
    e.Graphics.DrawRectangle(new Pen(Color.Blue, 3), 50, 0, 100, 40); 

    // End graphics container 
    e.Graphics.EndContainer(containerState); 

    // Other drawing actions here... 
} 

Vous ne devez inclure begin/conteneur appelle de fin si vous voulez faire le dessin supplémentaire en utilisant le système de coordonnées régulier aussi. Plus d'informations sur les conteneurs graphiques est available on MSDN.

Comme mentionné par Tom dans les commentaires, cette approche nécessite que la valeur Height soit disponible avec une valeur correcte. Si vous essayez ceci et que vous ne voyez rien, assurez-vous que la valeur est correcte dans un débogueur.

+0

Vous devez également ajouter une traduction pour que cela fonctionne correctement. – Eric

+0

Merci Eric. J'ai mis à jour ma réponse et j'ai inclus des informations sur l'utilisation de conteneurs graphiques pour isoler ces transformations des autres changements. –

+0

Ne travaillait pas pour moi. Je ne suis pas encore un wiz WinForms. Il s'avère que "Height" ne correspond pas au contrôle actuel. J'ai appelé cela dans mon panel. On ne peignait rien. Mentionner que vous supposez que vous dessinez sur le formulaire lui-même pourrait sauver un peu de temps aux autres, car cela aurait pu me faire gagner du temps de débogage;) – Tom

0

Non, mais en utilisant les propriétés Size (ou Height) du contrôle, il est facile de calculer les coordonnées inversées: Il suffit de dessiner à Height-y.

0

Pas que je sache mais si vous utilisez (x, Control.Height-y) vous obtenez le même effet.

-1

bref pas, si je dessine sur les contrôles beaucoup j'ai quelques fonctions qui me aident:

Point GraphFromRaster(Point point) {...} 
Point RasterFromGraph(Point point) {...} 

cette façon, je garde toute la conversion en un seul endroit, sans se soucier des choses comme y - this.Height dispersés sur le code.

+0

pourquoi le vote à la baisse? – Pondidum

1

est ici simple UserControl qui montre comment faire:

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true); 

     InitializeComponent(); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     e.Graphics.ScaleTransform(1.0F, -1.0F); 
     e.Graphics.TranslateTransform(0.0F, -(float)Height); 
     e.Graphics.DrawLine(Pens.Black, new Point(0, 0), new Point(Width, Height)); 

     base.OnPaint(e); 
    } 
} 
Questions connexes