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

  • 相关阅读:
    tracteroute路由追踪
    搭建Weblogic服务器
    Logview_pro破解版
    Spring Boot 如何在类中应用配置文件
    使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)
    springboot 项目中控制台打印日志以及每天生成日志文件
    springboot输出日志到指定目录,简单粗暴,springboot输出mybatis日志
    spring boot 发布成包所需插件
    spring注解
    Multicast注册中心
  • 原文地址:https://www.cnblogs.com/seabluescn/p/676778.html
Copyright © 2011-2022 走看看