zoukankan      html  css  js  c++  java
  • WinForm特效:拦截窗体上各个部位的点击

    windows窗体的标题栏无法直接通过一些默认的事件来控制,需要了解和WM_NCHITTEST相关的windows消息。 以下示例演示了最简单的效果片断: 他会把客户区和标题栏的效果互换,比如无法按住标题栏拖动窗体而是改为了安抓客户区拖动,并禁用了关闭按钮。 其中m.Result从-2到21都有定义,分别度应了整个窗体的各个部位,比如1代表客户区,8代表最小化按钮等等。

    using System;
    
    using System.Windows.Forms;
    
    namespace WindowsApplication42
    
    {
    
        public partial class Form1 : Form
    
        {
    
            public Form1() { InitializeComponent(); this.Text = "双击左上角图标关闭窗体"; }
    
            //拦击标题栏鼠标位置事件  
    
            const int WM_NCHITTEST = 0x84;
    
            protected override void WndProc(ref Message m)
    
            {
    
                base.WndProc(ref m); if (m.Msg == WM_NCHITTEST)
    
                {
    
                    switch (m.Result.ToInt32())
    
                    {
    
                        case 1://客户区  
    
                            m.Result = new IntPtr(2); break;
    
                        case 2://标题栏  
    
                            m.Result = new IntPtr(1); break;
    
                        case 20: m.Result = new IntPtr(0); break;
    
                        default: Console.WriteLine(m); break;
    
                    }
    
                }
    
            }
    
        }
    
    }
    
    
    
    

    下面是各个常量的意义:从Delphi7 VCL中摘取:

    { WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes }
    
      {$EXTERNALSYM HTERROR}
    
      HTERROR = -2;
    
      {$EXTERNALSYM HTTRANSPARENT}
    
      HTTRANSPARENT = -1;
    
      {$EXTERNALSYM HTNOWHERE}
    
      HTNOWHERE = 0;
    
      {$EXTERNALSYM HTCLIENT}
    
      HTCLIENT = 1;
    
      {$EXTERNALSYM HTCAPTION}
    
      HTCAPTION = 2;
    
      {$EXTERNALSYM HTSYSMENU}
    
      HTSYSMENU = 3;
    
      {$EXTERNALSYM HTGROWBOX}
    
      HTGROWBOX = 4;
    
      {$EXTERNALSYM HTSIZE}
    
      HTSIZE = HTGROWBOX;
    
      {$EXTERNALSYM HTMENU}
    
      HTMENU = 5;
    
      {$EXTERNALSYM HTHSCROLL}
    
      HTHSCROLL = 6;
    
      {$EXTERNALSYM HTVSCROLL}
    
      HTVSCROLL = 7;
    
      {$EXTERNALSYM HTMINBUTTON}
    
      HTMINBUTTON = 8;
    
      {$EXTERNALSYM HTMAXBUTTON}
    
      HTMAXBUTTON = 9;
    
      {$EXTERNALSYM HTLEFT}
    
      HTLEFT = 10;
    
      {$EXTERNALSYM HTRIGHT}
    
      HTRIGHT = 11;
    
      {$EXTERNALSYM HTTOP}
    
      HTTOP = 12;
    
      {$EXTERNALSYM HTTOPLEFT}
    
      HTTOPLEFT = 13;
    
      {$EXTERNALSYM HTTOPRIGHT}
    
      HTTOPRIGHT = 14;
    
      {$EXTERNALSYM HTBOTTOM}
    
      HTBOTTOM = 15;
    
      {$EXTERNALSYM HTBOTTOMLEFT}
    
      HTBOTTOMLEFT = 16;
    
      {$EXTERNALSYM HTBOTTOMRIGHT}
    
      HTBOTTOMRIGHT = 17;
    
      {$EXTERNALSYM HTBORDER}
    
      HTBORDER = 18;
    
      {$EXTERNALSYM HTREDUCE}
    
      HTREDUCE = HTMINBUTTON;
    
      {$EXTERNALSYM HTZOOM}
    
      HTZOOM = HTMAXBUTTON;
    
      {$EXTERNALSYM HTSIZEFIRST}
    
      HTSIZEFIRST = HTLEFT;
    
      {$EXTERNALSYM HTSIZELAST}
    
      HTSIZELAST = HTBOTTOMRIGHT;
    
      {$EXTERNALSYM HTOBJECT}
    
      HTOBJECT = 19;
    
      {$EXTERNALSYM HTCLOSE}
    
      HTCLOSE = 20;
    
      {$EXTERNALSYM HTHELP}
    
      HTHELP = 21;
  • 相关阅读:
    KMP算法
    Java中的字段和属性
    Java的垃圾回收机制
    一个初学所了解的jquery事件
    jQuery选择器
    hide(1000)跟show(1000)
    show/hide
    点击消失功能
    Java中集合Set的用法
    oracle的nvl和sql server的isnull
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6204912.html
Copyright © 2011-2022 走看看