【发布时间】:2021-10-11 21:03:18
【问题描述】:
我学习 C# 的时间不长,想知道是否可以从另一个类创建鼠标事件?
其目的是当鼠标按下时,会在面板上绘制一些东西。我想从不同的班级做这一切这可能吗?
这是我已经尝试过的:
class Circle: Form1
{
Graphics g;
Pen pen = new Pen(Color.Black);
// Making a event ?
public event EventHandler<MouseEventArgs> MouseDown;
protected void OnClick(MouseEventArgs e)
{
EventHandler<MouseEventArgs> handler = MouseDown;
if (handler != null)
{
handler(this, e);
}
}
public Circle()
{
g = this.panel1.CreateGraphics();
}
public void Mouse_Down(object sender, MouseEventArgs e)
{
// Draw something
g.DrawLine(pen, 0, 0, 50, 50);
}
}
}
因此,我不想在此类中调用 panel1_MouseDown 事件,而是想从 circle 类中调用它:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
// So instead of calling the panel1_MouseDown event in this class I want to call it from the circle class
}
}
}
【问题讨论】:
-
为什么你认为你必须调用事件?
Circle派生自Form1,所以它是一个 Form。这是故意的,即,这是你真正想做的吗? -- 为什么要在基类中订阅MouseDown 事件? -- 顺便说一句,这是非常错误的:Graphics g; [...] g = this.panel1.CreateGraphics();:您需要使用 Panel 的 Paint 事件在其表面上绘制东西。您还应该避免使用 Panel 类来绘制,而是使用 PictureBox (本身是双缓冲的,Panel 类不是)。或从Control派生的自定义控件(较少开销)启用双缓冲 -
我的意图是从circle类打开事件,但我不知道该怎么做
-
您确定圆是一种形式,并且圆有一个面板吗?难道你不想设计你的表单有一个画圆的面板吗?
-
如果圆是在面板上绘制的,那么没有理由在表格中放上绘制代码。这将使代码难以在另一种形式中重用,因为您必须重复在每种形式中绘制的代码。事实上,面板应该是一个用户控件,您可以将它放到其他地方(编译代码后从工具窗口中)。了解 DRY(不要重复自己)原则。