2009-05-29 10 views
23

Bene, sto codificando l'evento OnPaint per il mio controllo ed è molto necessario per me renderlo pixel-accurato.Bordo in DrawRectangle

Ho un piccolo problema con i bordi dei rettangoli.

See immagine:

collegamento rimosso ImageShack morti

Questi due rettangoli sono stati elaborati con la stessa posizione e dimensione dei parametri, ma utilizzando diverse dimensioni della penna. Vedi cosa è successo? Quando il confine è diventato più grande ha mangiato lo spazio libero prima del rettangolo (a sinistra).

Mi chiedo se ci sia un qualche tipo di proprietà che faccia disegnare il bordo all'interno del rettangolo, in modo che la distanza dal rettangolo sia sempre la stessa. Grazie.

risposta

44

È possibile farlo specificando PenAlignment

Pen pen = new Pen(Color.Black, 2); 
pen.Alignment = PenAlignment.Inset; //<-- this 
g.DrawRectangle(pen, rect); 
+5

Questa dovrebbe essere la risposta accettata –

+0

Concordato, questa è la risposta corretta alla domanda originale –

0

Credo di no ... ma si può spostare la posizione di disegno metà delle dimensioni penna in basso a destra

1

Questa non è una risposta diretta alla domanda, ma si potrebbe desiderare di considerare l'utilizzo del metodo ControlPaint.DrawBorder . È possibile specificare lo stile del bordo, il colore e varie altre proprietà. Ho anche crediamo che gestisce la regolazione dei margini per voi.

+0

Anche se disegna il bordo in modo corretto, per alcuni readon questa funzione impiega molto più tempo del processore rispetto a DrawRectangle. – undsoft

+0

@undsoft: Sì, non sarei troppo sorpreso. Non sono sicuro di come funzioni dietro le quinte, ma è certamente molto più complicato di DrawRectangle, dato che è in grado di disegnare, oltre ad altri confini di stile, anche il 3D. – Noldorin

6

Se si desidera che i limiti esterni del rettangolo per essere vincolati in tutte le direzioni è necessario ricalcolare in relazione alla larghezza della penna:

private void DrawRectangle(Graphics g, Rectangle rect, float penWidth) 
{ 
    using (Pen pen = new Pen(SystemColors.ControlDark, penWidth)) 
    { 
     float shrinkAmount = pen.Width/2; 
     g.DrawRectangle(
      pen, 
      rect.X + shrinkAmount, // move half a pen-width to the right 
      rect.Y + shrinkAmount, // move half a pen-width to the down 
      rect.Width - penWidth, // shrink width with one pen-width 
      rect.Height - penWidth); // shrink height with one pen-width 
    } 
}