在winfrom窗体中,用ArrayList类实现当鼠标左键按下后,拖动鼠标可以在窗体上画出一系列点来,鼠标抬起则停止;利用菜单设置线的颜色和粗细,利用菜单实现线条的擦除。请给出详细代码
时间: 2024-05-09 15:21:52 浏览: 34
好的,我会给你提供详细的代码实现。首先我们需要在窗体上添加一个 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 类来实现画线段的功能,同时实现线的颜色和宽度设置,以及擦除功能。