在实际的项目中总会遇到一些需要动态加载一些控件,并且加载控件的响应事件的代码。现在写一个简单的例子,主要说一下里面的一些关键点:
①使用鼠标在窗体上的图片框中动态的添加按钮 。动态的去加载事件,肯定是需要使用对象类动态的生成。
②动态事件,必须要使用委托去实现。
环境:Visual Studio 2010, .Net FrameWork 3.5
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
Button btn = new Button();
btn.Size = new System.Drawing.Size(20, 20);
Point Pointlocation = new Point();
btn.Location = new Point(e.X, e.Y);
btn.Location = Pointlocation;
pictureBox1.Controls.Add(btn);
btn.Click += new EventHandler(delegate{Message();});
}
private void Message()
{
MessageBox.Show("动态触发事件");
}
知识点一: 输入坐标和输出坐标
本示例中输入已经将坐标为(e.x,e.y)不需要在做转换,然而很多时候坐标是需要转换的。比如GIS的二次开发中我们会用到屏幕坐标,设备坐标还有逻辑坐标。如下图,先将器关系稍微说明一下。
如果本示例中要用到设备坐标,使用方法PointToClient(point) 将输入坐标转化。代买则会变成
Pointlocation = pictureBox1.PointToClient(new Point(e.X, e.Y));
Pointlocation.X += pictureBox1.Parent.Location.X;
Pointlocation.Y += pictureBox1.Parent.Location.Y + 32;
btn.Location = Pointlocation;
将坐标转换后还需要加上另pictureBox1.Parent.Location.X(窗体的其实坐标),这样保证了在最小化的时候生成的按钮,在对应的位置。
另外设备坐标系坐标原点为黄色区域左上角,X轴方向从左到右;Y轴方向从上到下;坐标单位为像素;
除此之外还有很多坐标系,如屏幕坐标系,世界坐标系等,需要之间进行互相转换的时候可以使用GDI+ 去做转换。
知识点二:动态添加按钮
动态添加按钮是使用Button对象类动态的生成,核心代码其实就是下面两句
Button btn = new Button();
pictureBox1.Controls.Add(btn);
初始化类后直接将其添加到相应的容器对象中即可。
知识点三: 动态事件
动态事件需要使用委托,很明显这个事件不能再窗体运行的时候去写click事件,所以只能是调用某个方法做作为委托事件,下面的代买为事件委托内容
btn.Click += new EventHandler(delegate{Message();});
private void Message()
{
MessageBox.Show("动态触发事件");
}
根据不同的需求可以写不同的事件。
源码下载地址点击进入下载页面