2009-05-29 7 views
23

Eh bien, je suis en train de coder l'événement OnPaint pour mon propre contrôle et il est très important pour moi de le rendre précis au pixel près.Frontière dans DrawRectangle

J'ai un petit problème avec les bordures de rectangles.

Voir image:

lien mort ImageShack enlevé

Ces deux rectangles ont été dessinés avec les mêmes paramètres de l'emplacement et la taille, mais en utilisant différentes tailles du stylo. Voyez ce qui s'est passé? Quand la frontière est devenue plus grande, elle a mangé l'espace libre avant le rectangle (à gauche).

Je me demande s'il existe une sorte de propriété qui fait que la bordure est dessinée à l'intérieur du rectangle, de sorte que la distance au rectangle sera toujours la même. Merci.

Répondre

44

Vous pouvez le faire en spécifiant PenAlignment

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

Ceci devrait être la réponse acceptée –

+0

D'accord, ceci est la bonne réponse à la question originale –

0

Je suppose que non ... mais vous pouvez déplacer la position de dessin la moitié de la taille d'un stylo en bas à droite

1

Ce n'est pas une réponse directe à la question, mais vous voudrez peut-être envisager d'utiliser la méthode ControlPaint.DrawBorder . Vous pouvez spécifier le style de bordure, la couleur et diverses autres propriétés. Je aussi crois il gère l'ajustement des marges pour vous.

+0

Bien qu'il dessine la bordure correctement, pour certains readon, cette fonction utilise considérablement plus de temps processeur que DrawRectangle. – undsoft

+0

@undsoft: Oui, je ne serais pas trop surpris. Je ne sais pas comment cela fonctionne dans les coulisses, mais c'est certainement beaucoup plus compliqué que DrawRectangle, étant donné qu'il est capable de dessiner des bordures de style 3D et autres, entre autres choses. – Noldorin

6

Si vous voulez que les limites extérieures du rectangle à contraintes dans toutes les directions, vous devrez recalculer par rapport à la largeur de la plume:

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 
    } 
} 
Questions connexes