扩充.NET窗体类(System.Windows.Forms.Form)的事件
扩充.NET窗体类(System.Windows.Forms.Form)的事件
对于做Windows应用程序开发的程序员来说,Form类恐怕用的比较多的。.Net类库提供的Form类大概提供不到100个事件,对于大部分应用来所应该是足够了,但还是不能满足一些特殊程序的功能要求,比如经常有人在论坛提问:如何截获窗口最大化的事件等等。
本文描述的就是如何扩充这些窗口事件。
1.原理:覆写Form类的WndProc事件,筛选需要的事件。
public partial class FrmBase : Form
{
public class MaxmizeEventArgs : System.EventArgs
{
private bool m_Cancel = false;
public bool Cancel
{
get { return m_Cancel; }
set { m_Cancel = value; }
}
}
public delegate void WindowMaxmizeHander(object sender, MaxmizeEventArgs args);
[Category("自定义事件")]
[Description("窗口最大化之前发生")]
public event WindowMaxmizeHander WindowMaxmize = null;
private const Int32 WM_SYSCOMMAND = 0x0112;
private const Int32 SC_MAXMIZE = 0xF030;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_SYSCOMMAND)
{
if (m.WParam.ToInt32() == SC_MAXMIZE)
{
if (this.WindowMaxmize != null)
{
MaxmizeEventArgs args = new MaxmizeEventArgs();
this.WindowMaxmize.Invoke(this, args);
if (args.Cancel)
{
return;
}
}
}
}
base.WndProc(ref m);
}
}
2.使用方法:新建的窗口从FrmBase类继承,属性窗口的事件选项卡内会有WindowMaxmize事件,和其他事件同样使用。或者手工输入事件绑定代码也一样。
public partial class Form1 : FrmBase
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.WindowMaxmize += new WindowMaxmizeHander(Form1_WindowMaxmize);
}
void Form1_WindowMaxmize(object sender, FrmBase.MaxmizeEventArgs args)
{
MessageBox.Show("Form1_WindowMaxmize");
args.Cancel = true;//arg.Cancel=true/false决定系统是否处理该事件
}
}
3.说明:使用同样的方法,你可以扩充任何你想处理的事件。现在你对Windows窗口的控制能力是不是更进一层。(题外话:对现有的一个类进行继承,并覆写其中的一些虚函数,可以大大扩充现有类的功能,但是在.Net类库中,有一些类被定义为密封类,如System.Windows.Forms.MdiClient,这不是限制了用户扩充其功能吗?不知是何原因。谁知道的话还望赐教。)
签名区:
如果您觉得这篇博客对您有帮助或启发,请点击右侧【推荐】支持,谢谢!