2009-05-29 8 views
23

私は自分のコントロールのためにOnPaintイベントをコーディングしています。ピクセル精度にするのは非常に厄介です。DrawRectangleのボーダー

長方形の枠に少し問題があります。

参照画像:

削除死んImageShackのリンク

これらの2つの長方形は同じ位置とサイズのパラメータで描かれますが、ペンの異なるサイズを使用していました。何が起こったのか見てください境界線が大きくなると、矩形の前の空き領域(左)が食べられました。

矩形の内側に罫線を描くような性質があるかと思いますので、矩形との距離は常に同じになります。ありがとう。

答えて

44

あなたはPenAlignment

Pen pen = new Pen(Color.Black, 2); 
pen.Alignment = PenAlignment.Inset; //<-- this 
g.DrawRectangle(pen, rect); 
を指定することでこれを行うことができます
+5

これは受け入れられた回答である必要があります –

+0

合意しました。これは元の質問に対する正解です –

0

私はないと思います...しかし、あなたは右

1

この質問への直接の答えではないですが、ControlPaint.DrawBorderメソッドを使用して検討する必要があります下に描画位置の半分のペンサイズを移動させてもよいです。境界線スタイル、色、およびその他のさまざまなプロパティを指定できます。私もと信じてあなたのために余白を調整します。

+0

境界線を適切に描画しますが、一部の読み取りでは、この関数はDrawRectangleよりもかなり長いプロセッサ時間を使用します。 – undsoft

+0

@undsoft:そうですね、あまりにも驚きません。私はそれが舞台裏でどのように動作するかはわかりませんが、確かにDrawRectangleよりもはるかに複雑です。それは3Dや他のスタイルの枠線を描くことができるからです。 – Noldorin

6

あなたは長方形の外側の境界がすべての方向に拘束されるようにしたい場合は、ペンの幅に関連して、それを再計算する必要があります。

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