开发者

Outline a path with GDI+ in .Net

How does one outline a graphicspath using GDI+? For example, I add two intersecting rectangles to a GraphicsPath. I want to draw the outline of this resulting graphicspath only.

Note that I don't want to fill the area, I just want to draw the开发者_StackOverflow社区 outline.

Example:

Outline a path with GDI+ in .Net


There is no managed way to do the outline. However, GDI+ does have an function called GdipWindingModeOutline that can do exactly this. Here is the MSDN reference This code does the trick:

// Declaration required for interop
[DllImport(@"gdiplus.dll")]
public static extern int GdipWindingModeOutline( HandleRef path, IntPtr matrix, float flatness );

void someControl_Paint(object sender, PaintEventArgs e)
{
    // Create a path and add some rectangles to it
    GraphicsPath path = new GraphicsPath();
    path.AddRectangles(rectangles.ToArray());

    // Create a handle that the unmanaged code requires. nativePath private unfortunately
    HandleRef handle = new HandleRef(path, (IntPtr)path.GetType().GetField("nativePath", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(path));
    // Change path so it only contains the outline
    GdipWindingModeOutline(handle, IntPtr.Zero, 0.25F);
    using (Pen outlinePen = new Pen(Color.FromArgb(255, Color.Red), 2))
    {
        g.DrawPath(outlinePen, path);
    }
}


I cannot try it myself, but I think you should create a Region object with your shapes' intersections and then use the FrameRgn API.
Here is its pinvoke signature:

[DllImport("gdi32.dll")]
static extern bool FrameRgn(
    IntPtr hdc, 
    IntPtr hrgn, 
    IntPtr hbr, 
    int nWidth,
    int nHeight);

P.S: please post your solution if this works, I'm curious :)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜