-1

我相信这是可能的,但没有看到这样的情况。我想让矩形(一些水平的和一些垂直的)像这样:拿第一个,把它放在第二个旁边,当线条接触时,创建一个没有内线的“L”。这将是一个基本的 CAD 绘图。

该项目将使用带有框架 4 的 c# 中的 Visual Studio 2010 Ultimate 创建。

如果有人有教程的线索或路径,我将不胜感激。

谢谢 !

编辑:有我的尝试。

System.Drawing.Rectangle rectangle1 = new System.Drawing.Rectangle(30, 40, 50, 200);          System.Drawing.Rectangle rectangle2 = new System.Drawing.Rectangle(30, 190, 200, 50);
e.Graphics.DrawRectangle(Pens.Blue, rectangle1);
e.Graphics.DrawRectangle(Pens.GreenYellow, rectangle2);
System.Drawing.Rectangle rectangle3 = System.Drawing.Rectangle.Intersect(rectangle1, rectangle2);
e.Graphics.DrawRectangle(Pens.White, rectangle3);
4

1 回答 1

1

将您的 Rectangles 添加到 GraphicsPath,然后使用 GdipWindingModeOutline() API 将其转换为仅在此SO问题中的轮廓。

GraphicsPath 的 L 形轮廓

具体来说,以您的示例为例:

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

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

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Rectangle rectangle1 = new Rectangle(30, 40, 50, 200); 
        Rectangle rectangle2 = new Rectangle(30, 190, 200, 50);

        GraphicsPath gp = new GraphicsPath();
        gp.AddRectangle(rectangle1);
        gp.AddRectangle(rectangle2);

        HandleRef handle = new HandleRef(gp, (IntPtr)gp.GetType().GetField("nativePath", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(gp));
        GdipWindingModeOutline(handle, IntPtr.Zero, 0.25F);

        e.Graphics.DrawPath(Pens.Blue, gp);
    }

}
于 2013-10-18T15:35:50.643 回答