如何擦掉上一条绘制的线
时间: 2023-12-04 11:03:44 浏览: 14
您可以使用CPen和CBrush来绘制线条和背景,然后使用CDC的FillRect方法来擦除上一条线。
下面是一个示例代码,假设您已经创建了一个名为m_dc的CDC对象,并且在上面绘制了一条直线:
```
// 创建一个白色画刷
CBrush brush(RGB(255, 255, 255));
// 选择该画刷
m_dc.SelectObject(&brush);
// 创建一个白色画笔
CPen pen(PS_SOLID, 1, RGB(255, 255, 255));
// 选择该画笔
m_dc.SelectObject(&pen);
// 使用画刷填充线条下方的矩形区域
CRect rect(x1, y1, x2, y2);
m_dc.FillRect(&rect, &brush);
```
其中,x1、y1、x2、y2是线条的起点和终点坐标。
这样,上一条线就会被覆盖并擦除掉。注意,如果您想要擦除多条线,需要先保存之前每条线条的坐标信息。
相关问题
为什么“先用pDC对象从mPointOrign点绘制一条线到mPointOld点,这相当于擦除了之前的线。”
这是因为在MFC框架下,绘制图形是通过GDI(图形设备接口)实现的。每次绘制都会将图形绘制在设备上,如果想要擦除之前的图形,需要将设备上的图形擦除掉。
在这段代码中,使用pDC对象从mPointOrign点绘制一条线到mPointOld点,实际上是在设备上绘制了一条白色的线,将之前的线覆盖掉,从而实现了擦除旧线的效果。然后再使用pDC对象从mPointOrign点绘制一条线到point点,就相当于在设备上绘制了一条新的线,从而实现了画出新线的效果。
需要注意的是,在每次绘制之前,需要将pDC对象的绘图颜色设置为白色,这样才能擦除之前的线。具体代码如下:
```
CPen pen(PS_SOLID, 1, RGB(255, 255, 255)); // 创建一个白色画笔
pDC->SelectObject(&pen); // 选择该画笔
pDC->MoveTo(mPointOrign); // 设置起点
pDC->LineTo(mPointOld); // 绘制白色线,相当于擦除旧线
```
这样就可以实现擦除旧线并画出新线的效果了。
在winfrom窗体中,用ArrayList类实现当鼠标左键按下后,拖动鼠标可以在窗体上画出一系列点来,鼠标抬起则停止;利用菜单设置线的颜色和粗细,利用菜单实现线条的擦除。请给出详细代码
好的,我会给你提供详细的代码实现。首先我们需要在窗体上添加一个 MouseDown 事件,以响应鼠标左键按下的操作。然后可以使用 ArrayList 存储用户在窗体上绘制的点的信息,最后在绘制这些点。
在窗体的构造函数中添加如下代码:
```csharp
public partial class Form1 : Form
{
private ArrayList points = new ArrayList(); // 存储所有点的集合
private Point startPoint; // 记录鼠标按下时的起点坐标
public Form1()
{
InitializeComponent();
this.MouseDown += new MouseEventHandler(Form1_MouseDown);
this.MouseMove += new MouseEventHandler(Form1_MouseMove);
this.MouseUp += new MouseEventHandler(Form1_MouseUp);
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
startPoint = e.Location; // 记录起点坐标
}
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
points.Add(e.Location); // 添加当前点的坐标
this.Invalidate(); // 刷新窗体,使之重新绘制
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
points.Clear(); // 清空所有点的集合
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
int penWidth = 1; // 线宽
Color penColor = Color.Black; // 线的颜色
// 遍历所有点,依次连接相邻的点,形成线段
for (int i = 0; i < points.Count - 1; i++)
{
Point p1 = (Point)points[i];
Point p2 = (Point)points[i + 1];
using (Pen pen = new Pen(penColor, penWidth))
{
g.DrawLine(pen, p1, p2);
}
}
}
}
```
上述代码中,我们定义了一个 points 变量用于存储所有绘制的点的坐标,另外也定义了一个 startPoint 变量用于记录鼠标按下时的起点坐标。鼠标按下时,我们在 startPoint 变量中记录当前点的坐标,鼠标移动时在 points 变量中添加当前点的坐标,并且调用窗体的 Invalidate 方法来通知窗体重新绘制。
窗体绘制时,我们遍历 points 变量中所有的点,依次连接相邻的点,从而形成线段,并且使用 Pen 类设置线的颜色和线宽。最后当鼠标抬起时,我们清空 points 变量以便下次重新绘制。
接下来我们添加一个菜单用于设置线的颜色和线宽,以及一个菜单用于实现线条的擦除。
在窗体的构造函数中添加如下代码:
```csharp
public Form1()
{
InitializeComponent();
// ...
// 添加设置颜色和线宽的菜单
ToolStripMenuItem colorMenu = new ToolStripMenuItem("颜色");
ToolStripMenuItem widthMenu = new ToolStripMenuItem("线宽");
colorMenu.DropDownItemClicked += new ToolStripItemClickedEventHandler(colorMenu_DropDownItemClicked);
widthMenu.DropDownItemClicked += new ToolStripItemClickedEventHandler(widthMenu_DropDownItemClicked);
colorMenu.DropDownItems.Add("黑色");
colorMenu.DropDownItems.Add("红色");
colorMenu.DropDownItems.Add("绿色");
colorMenu.DropDownItems.Add("蓝色");
widthMenu.DropDownItems.Add("1");
widthMenu.DropDownItems.Add("2");
widthMenu.DropDownItems.Add("3");
widthMenu.DropDownItems.Add("4");
widthMenu.DropDownItems.Add("5");
// 添加擦除的菜单
ToolStripMenuItem eraseMenu = new ToolStripMenuItem("擦除");
eraseMenu.Click += new EventHandler(eraseMenu_Click);
// 添加菜单到主菜单栏
menuStrip1.Items.Add(colorMenu);
menuStrip1.Items.Add(widthMenu);
menuStrip1.Items.Add(eraseMenu);
}
```
上述代码中,我们定义了两个菜单项 colorMenu 和 widthMenu,它们分别用于设置线的颜色和线宽。当用户选择颜色或线宽时,我们分别响应菜单上的事件并设置相应的变量(penColor 和 penWidth)。我们还在窗体的构造函数中为菜单项添加了相应的事件处理函数。在菜单项上添加子菜单可以通过 DropDownItemClicked 事件来实现。
我们还添加了一个 eraseMenu 菜单项用于擦除所有线条。当用户单击擦除菜单项时,我们调用 Invalidate 方法来通知窗体重新绘制,同时清空 points 变量以便下次重新绘制。
最后,我们还需要在事件处理函数中实现修改线条颜色和宽度、擦除所有线条的功能。在窗体中添加如下代码:
```csharp
private Color penColor = Color.Black; // 线的颜色
private int penWidth = 1; // 线宽
private void colorMenu_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
switch (e.ClickedItem.Text)
{
case "黑色":
penColor = Color.Black;
break;
case "红色":
penColor = Color.Red;
break;
case "绿色":
penColor = Color.Green;
break;
case "蓝色":
penColor = Color.Blue;
break;
}
}
private void widthMenu_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
penWidth = int.Parse(e.ClickedItem.Text);
}
private void eraseMenu_Click(object sender, EventArgs e)
{
points.Clear();
this.Invalidate();
}
```
上述代码中,我们分别为颜色和线宽菜单项的 DropDownItemClicked 事件和擦除菜单项的 Click 事件添加相应的处理函数。当用户在颜色菜单上选择了一个颜色,我们根据菜单项的 Text 属性设置相应的颜色值;当用户在线宽菜单上选择了一个线宽,我们将其转换成 int 类型并设置给 penWidth 变量;当用户单击擦除菜单时,我们清空 points 变量并调用 Invalidate 方法。
至此,我们就完成了在 WinForms 窗体中用 ArrayList 类来实现画线段的功能,同时实现线的颜色和宽度设置,以及擦除功能。