扩充.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,这不是限制了用户扩充其功能吗?不知是何原因。谁知道的话还望赐教。)

posted @ 2007-03-16 09:19  seabluescn  阅读(1218)  评论(0编辑  收藏  举报