2009-09-28 9 views
9

sto disegnando un grafico su un controllo, ma 0,0 è nell'angolo superiore sinistro mano del controllo. C'è un modo per capovolgere le coordinate in modo che 0,0 sia nell'angolo in basso a sinistra del controllo?vibrazione coordinate nell'elaborazione per controllare

+0

Si sta utilizzando WinForms o WPF? Potresti voler aggiornare i tag sulla tua domanda. –

risposta

13

Se si sta utilizzando WinForms, allora si potrebbe scoprire che si può capovolgere l'asse Y con 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... 
} 

Hai solo bisogno di includere l'inizio/chiamate contenitore finale, se si vuole fare ulteriore disegno usando anche il sistema di coordinate regolari. Ulteriori informazioni sui contenitori grafici sono available on MSDN.

Come accennato da Tom nei commenti, questo approccio richiede il valore Height a essere disponibili con un valore corretto. Se provi questo e non vedi nulla di essere disegnato, assicurati che il valore sia corretto in un debugger.

+0

È necessario aggiungere anche la traduzione affinché funzioni correttamente. – Eric

+0

Grazie Eric. Ho aggiornato la mia risposta e incluso informazioni sull'utilizzo di contenitori grafici per isolare queste trasformazioni da altre modifiche. –

+0

Non ha funzionato per me. Non sono ancora un wiz WinForms. Come risulta "Altezza" non si riferisce al controllo corrente. Ho chiamato questo nel mio pannello.OnPaint e niente è stato dipinto. Menzionare che si presume che tu stia attingendo al modulo stesso potrebbe risparmiare un po 'di tempo, poiché potrebbe avermi risparmiato un po' di tempo di debug;) – Tom

0

No, ma utilizzando le proprietà Size (o Height) del controllo, è facile calcolare le coordinate capovolte: Basta disegnare su Height-y.

0

Non che io sappia, ma se si utilizza (x, Control.Height-y) si ottiene lo stesso effetto.

-1

insomma no, se sto disegnando sui controlli molto ho alcune funzioni che mi aiutano:

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

questo modo mantengo tutto la conversione in un unico luogo, senza preoccuparsi di cose come y - this.Height sparsi per il codice.

+0

perché il voto negativo? – Pondidum

1

Ecco un semplice controllo utente che dimostra come eseguire questa operazione:

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); 
    } 
} 
Problemi correlati