2011-06-25 21 views
1

GDI +でDrawArc関数を使用すると、小さな丸い四角形を描くときにあまり正確ではないので、代わりにRoundRectを使用しています。CreatePenを使用して中空矩形を描画するにはどうすればよいですか?

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) 
    Dim hDC As IntPtr = e.Graphics.GetHdc 
    Dim rc As New Rectangle(10, 10, 64, 24) 
    Dim hPen As IntPtr = Win32.CreatePen(Win32.PenStyle.PS_SOLID, 0, _ 
             ColorTranslator.ToWin32(Color.Green)) 
    Dim hOldPen As IntPtr = Win32.SelectObject(hDC, hPen) 
    Call Win32.RoundRect(hDC, rc.Left, rc.Top, rc.Right, rc.Bottom, 10, 10) 
    Win32.SelectObject(hDC, hOldPen) 
    Win32.DeleteObject(hPen) 
    e.Graphics.ReleaseHdc(hDC) 
    MyBase.OnPaint(e)  
End Sub 

これは素敵な丸い四角形を描画しますが、それはまた私が消去されているにしたくないものを消去し、白いブラシでそれを記入します。

矩形の内側を消去しないでこれを描画するにはどうすればよいですか?

+0

なぜ、pinvokeとGDI + APIを使用していますか。なぜ、.net Graphicオブジェクトで提供されるメソッドを使用するだけではありませんか? –

答えて

6

長方形を描画する前に、ストック、中空ブラシを選択するだけで済みます。 GetStockObjectをHOLLOW_BRUSHで呼び出し、ペンを選択したのと同じ方法でデバイスコンテキストに選択します。

1

このような方法を使用します。私のためにうまく動作します。

private static GraphicsPath CreateRoundRectranglePath(Rectangle rect, Size rounding) 
{ 
    var path = new GraphicsPath(); 
    var l = rect.Left; 
    var t = rect.Top; 
    var w = rect.Width; 
    var h = rect.Height; 
    var rx = rounding.Width; 
    var dx = rounding.Width << 1; 
    var ry = rounding.Height; 
    var dy = rounding.Height << 1; 
    path.AddArc(l, t, dx, dy, 180, 90); // topleft 
    path.AddLine(l + rx, t, l + w - rx, t); // top 
    path.AddArc(l + w - dx, t, dx, dy, 270, 90); // topright 
    path.AddLine(l + w, t + ry, l + w, t + h - ry); // right 
    path.AddArc(l + w - dx, t + h - dy, dx, dy, 0, 90); // bottomright 
    path.AddLine(l + w - rx, t + h, l + rx, t + h); // bottom 
    path.AddArc(l, t + h - dy, dx, dy, 90, 90); // bottomleft 
    path.AddLine(l, t + h - ry, l, t + ry); // left 
    path.CloseFigure(); 
    return path; 
} 
関連する問題