Outline a path with GDI+ in .Net

前端 未结 2 425
囚心锁ツ
囚心锁ツ 2021-01-02 22:36

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 o

相关标签:
2条回答
  • 2021-01-02 23:10

    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);
        }
    }
    
    0 讨论(0)
  • 2021-01-02 23:14

    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 讨论(0)
提交回复
热议问题