2011-06-25 50 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

您只需在繪製矩形之前選擇一個股票,空心筆刷。使用HOLLOW_BRUSH調用GetStockObject,然後以與選擇筆相同的方式將其選入設備上下文中。

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