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

  • 相关阅读:
    20155217 实验四 Android程序设计
    20155217 第十二周课堂测试
    20155217 《Java程序设计》第三次实验报告
    20155217 2016-2017-2 《Java程序设计》第10周学习总结
    20155217 实验二 Java面向对象程序设计 实验报告
    20155217 2016-2017-2 《Java程序设计》第9周学习总结
    20155217 2016-2017-2 《Java程序设计》第8周学习总结
    实验一 Java开发环境的熟悉(Linux+Eclipse)
    Spring阶段性学习总结(一)实现一个简单的HellowWorld
    MySql数据库再学习——使用强化版的自定义连接池连接数据库
  • 原文地址:https://www.cnblogs.com/seabluescn/p/676778.html
Copyright © 2011-2022 走看看