Bordure dans DrawRectangle

Eh bien, je code l’événement OnPaint pour mon propre contrôle et il est très nécessaire pour moi de le rendre précis au pixel près.

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

Voir l’image:

lien mort ImageShack supprimé

Ces deux rectangles ont été dessinés avec les mêmes parameters d’emplacement et de taille, mais en utilisant une taille de plume différente. Voir ce qui est arrivé Lorsque la bordure est devenue plus grande, l’espace libre a été dévoré avant le rectangle (à gauche).

Je me demande s’il existe une 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.

Vous pouvez le faire en spécifiant PenAlignment

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

Si vous souhaitez que les limites extérieures du rectangle soient contraintes dans toutes les directions, vous devrez le recalculer en fonction de 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 } } 

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

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