在.Net中使用GDI+绘制路径的概述

6
如何使用GDI+绘制图形路径的轮廓?例如,我将两个相交的矩形添加到GraphicsPath中。我只想绘制这个结果图形路径的轮廓。
请注意,我不想填充区域,我只想绘制轮廓。
示例: http://i.stack.imgur.com/IAVft.png
2个回答

10

没有一种托管的方法来做轮廓。然而,GDI+有一个名为GdipWindingModeOutline的函数可以做到这一点。 这里是MSDN参考链接 以下代码可以实现此功能:

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

0

我自己无法尝试,但我认为您应该使用您的形状交集创建一个区域对象,然后使用FrameRgn API。
这是它的pinvoke签名

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

附言:如果这个方法有效,请发布您的解决方案,我很好奇 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接