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及其所有愚蠢的框架一起迅速消亡。