2009-05-29 17 views
23

Bueno, estoy codificando el evento OnPaint para mi propio control y es muy necesario que lo haga preciso como un píxel.Borde en DrawRectangle

Tengo un pequeño problema con los bordes de los rectángulos.

Ver la imagen:

eliminado ImageShack vínculo roto

Estos dos rectángulos se elaboraron con los mismos parámetros de ubicación y tamaño, pero utilizando diferentes tamaños de la pluma. ¿Ves lo que pasó? Cuando el borde se hizo más grande, se ha comido el espacio libre antes del rectángulo (a la izquierda).

Me pregunto si existe algún tipo de propiedad que haga que el borde se dibuje dentro del rectángulo, de modo que la distancia al rectángulo sea siempre la misma. Gracias.

Respuesta

44

Usted puede hacer esto mediante la especificación de PenAlignment

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

Esta debería ser la respuesta aceptada –

+0

De acuerdo, esta es la respuesta correcta a la pregunta original –

0

supongo que no ... pero es posible mover la posición de dibujo mitad del tamaño de la pluma a la parte inferior derecha

1

Esta no es una respuesta directa a la pregunta, pero es posible que desee considerar el uso del método ControlPaint.DrawBorder . Puede especificar el estilo de borde, el color y varias otras propiedades. También creo que se encarga de ajustar los márgenes para usted.

+0

Aunque dibuja el borde de la manera correcta, para algunos lectores esta función usa mucho más tiempo de procesador que DrawRectangle. – undsoft

+0

@undsoft: Sí, no me sorprendería demasiado. No estoy seguro de cómo funciona detrás de las escenas, pero sin duda es mucho más complicado que DrawRectangle, dado que es capaz de dibujar bordes en 3D y otros estilos, entre otras cosas. – Noldorin

6

Si desea que los límites externos del rectángulo a estar limitadas en todas las direcciones que tendrá que calcular de nuevo en relación con el ancho de la pluma:

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