Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在GraphicsPath上绘制边框或轮廓?_C#_.net_Paint_Gdi+ - Fatal编程技术网

C# 在GraphicsPath上绘制边框或轮廓?

C# 在GraphicsPath上绘制边框或轮廓?,c#,.net,paint,gdi+,C#,.net,Paint,Gdi+,我正在制作一个地图绘制程序,其行为非常类似于典型的“绘制”程序。我希望我的海岸线突出,因此在我绘制的路径周围添加一个边框/轮廓,如下图所示,是我的目标: 当用户绘制“土地”时,边界应实时显示 现在,我的软件的行为如下: 目前,我的绘画使用的是Graphics.DrawLine(),但我猜我需要将线条添加到GraphicsPath,并在路径上以某种方式跟踪轮廓,以获得所需的效果 这是我代码的重要部分。所有绘图都是在我制作的画布对象中完成的,它只是一个图片盒,带有一些自定义逻辑: private

我正在制作一个地图绘制程序,其行为非常类似于典型的“绘制”程序。我希望我的海岸线突出,因此在我绘制的路径周围添加一个边框/轮廓,如下图所示,是我的目标:

当用户绘制“土地”时,边界应实时显示

现在,我的软件的行为如下:

目前,我的绘画使用的是
Graphics.DrawLine()
,但我猜我需要将线条添加到
GraphicsPath
,并在路径上以某种方式跟踪轮廓,以获得所需的效果

这是我代码的重要部分。所有绘图都是在我制作的
画布
对象中完成的,它只是一个
图片盒
,带有一些自定义逻辑:

private void Canvas_MouseMove(object sender, MouseEventArgs e)
        {
            if (isMouseDown) // if a mouse button is being pressed
            {
                if (currentTool == Tools.LandWater) // if the current tool is the land placing tool
                {
                    SetupGraphics(); // pretty much just gr = this.CreateGraphics();

                    Brush penBrush = null;

                    if (IsTextureBrush) // if the canvas object is going to use a texture brush or solid brush
                    {
                        Image texture = this.PaperTexture;
                        if (e.Button == MouseButtons.Left) texture = this.LandTexture1;
                        else if (e.Button == MouseButtons.Right) texture = this.WaterTexture; // if user right clicks, water is placed

                        penBrush = new TextureBrush(texture);
                    }
                    else
                    {
                        penBrush = new SolidBrush(BrushColour);
                    }

                    using (Pen p = new Pen(penBrush, this.BrushSize))
                    {
                        p.StartCap = System.Drawing.Drawing2D.LineCap.Round;
                        p.EndCap = System.Drawing.Drawing2D.LineCap.Round;
                        p.Alignment = System.Drawing.Drawing2D.PenAlignment.Inset;

                        gr.DrawLine(p, lastMouseLocation, e.Location);

                    }

                    lastMouseLocation = e.Location; // originally set in MouseDown as e.Location       
                }
            }


        }

有人知道我可以从哪里开始吗?我查看了一些Win32 API调用和其他东西,但没有一个能按预期工作。

这是WinForms吗?你犯的一个大错误是试图在你的MouseMoved事件中画图。不要那样做;找出鼠标移动改变了画布的哪个区域,使其无效,并在Paint事件处理程序中绘制所有图形。@DourHighArch我可以从MouseMove中移动代码,但目前我的首要任务是绘制此轮廓。有什么想法吗?在鼠标下键时创建一个位置列表,从单击的点开始。当鼠标移动时,将新位置添加到列表中,并使从上一位置到当前位置的矩形无效。在绘制处理程序中,使用海岸笔绘制列表中的所有线。当检测到已越过列表中点之间的线时,停止绘制,整体填充图形内部,并使列表的边界框无效。这是大量的工作;幸运的是,网络上有很多这样做的例子。@DanByström如果我理解正确,你是说我应该扫描位图中的每个像素,直到我到达一个非普通像素(表示“land”)并在该位置绘制一个点?如果每次鼠标移动都要这样做,计算成本不是很高吗?@Pangamma已经2年了,我从来没有想到这一点。我抛弃了Winforms,尝试使用Electron和一个JS库来进行绘图,结果很接近。我没有进一步讨论它,因为我讨厌web开发,Electron,imo,是一种疾病,它应该与Javascript及其所有愚蠢的框架一起迅速消亡。这是WinForms吗?你犯的一个大错误是试图在你的MouseMoved事件中画图。不要那样做;找出鼠标移动改变了画布的哪个区域,使其无效,并在Paint事件处理程序中绘制所有图形。@DourHighArch我可以从MouseMove中移动代码,但目前我的首要任务是绘制此轮廓。有什么想法吗?在鼠标下键时创建一个位置列表,从单击的点开始。当鼠标移动时,将新位置添加到列表中,并使从上一位置到当前位置的矩形无效。在绘制处理程序中,使用海岸笔绘制列表中的所有线。当检测到已越过列表中点之间的线时,停止绘制,整体填充图形内部,并使列表的边界框无效。这是大量的工作;幸运的是,网络上有很多这样做的例子。@DanByström如果我理解正确,你是说我应该扫描位图中的每个像素,直到我到达一个非普通像素(表示“land”)并在该位置绘制一个点?如果每次鼠标移动都要这样做,计算成本不是很高吗?@Pangamma已经2年了,我从来没有想到这一点。我抛弃了Winforms,尝试使用Electron和一个JS库来进行绘图,结果很接近。我没有进一步讨论它,因为我讨厌web开发,Electron,imo,是一种疾病,它应该与Javascript及其所有愚蠢的框架一起迅速消亡。