首页 > 代码库 > WinForm特效:拦截窗体上各个部位的点击

WinForm特效:拦截窗体上各个部位的点击

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

[csharp] view plaincopy
  1. using System;  
  2.   
  3. using System.Windows.Forms;  
  4.   
  5. namespace WindowsApplication42  
  6.   
  7. {  
  8.   
  9.     public partial class Form1 : Form  
  10.   
  11.     {  
  12.   
  13.         public Form1() { InitializeComponent(); this.Text = "双击左上角图标关闭窗体"; }  
  14.   
  15.         //拦击标题栏鼠标位置事件    
  16.   
  17.         const int WM_NCHITTEST = 0x84;  
  18.   
  19.         protected override void WndProc(ref Message m)  
  20.   
  21.         {  
  22.   
  23.             base.WndProc(ref m); if (m.Msg == WM_NCHITTEST)  
  24.   
  25.             {  
  26.   
  27.                 switch (m.Result.ToInt32())  
  28.   
  29.                 {  
  30.   
  31.                     case 1://客户区    
  32.   
  33.                         m.Result = new IntPtr(2); break;  
  34.   
  35.                     case 2://标题栏    
  36.   
  37.                         m.Result = new IntPtr(1); break;  
  38.   
  39.                     case 20: m.Result = new IntPtr(0); break;  
  40.   
  41.                     default: Console.WriteLine(m); break;  
  42.   
  43.                 }  
  44.   
  45.             }  
  46.   
  47.         }  
  48.   
  49.     }  
  50.   
  51. }  

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

[html] view plaincopy
  1. { WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes }  
  2.   
  3.   {$EXTERNALSYM HTERROR}  
  4.   
  5.   HTERROR = -2;  
  6.   
  7.   {$EXTERNALSYM HTTRANSPARENT}  
  8.   
  9.   HTTRANSPARENT = -1;  
  10.   
  11.   {$EXTERNALSYM HTNOWHERE}  
  12.   
  13.   HTNOWHERE = 0;  
  14.   
  15.   {$EXTERNALSYM HTCLIENT}  
  16.   
  17.   HTCLIENT = 1;  
  18.   
  19.   {$EXTERNALSYM HTCAPTION}  
  20.   
  21.   HTCAPTION = 2;  
  22.   
  23.   {$EXTERNALSYM HTSYSMENU}  
  24.   
  25.   HTSYSMENU = 3;  
  26.   
  27.   {$EXTERNALSYM HTGROWBOX}  
  28.   
  29.   HTGROWBOX = 4;  
  30.   
  31.   {$EXTERNALSYM HTSIZE}  
  32.   
  33.   HTSIZE = HTGROWBOX;  
  34.   
  35.   {$EXTERNALSYM HTMENU}  
  36.   
  37.   HTMENU = 5;  
  38.   
  39.   {$EXTERNALSYM HTHSCROLL}  
  40.   
  41.   HTHSCROLL = 6;  
  42.   
  43.   {$EXTERNALSYM HTVSCROLL}  
  44.   
  45.   HTVSCROLL = 7;  
  46.   
  47.   {$EXTERNALSYM HTMINBUTTON}  
  48.   
  49.   HTMINBUTTON = 8;  
  50.   
  51.   {$EXTERNALSYM HTMAXBUTTON}  
  52.   
  53.   HTMAXBUTTON = 9;  
  54.   
  55.   {$EXTERNALSYM HTLEFT}  
  56.   
  57.   HTLEFT = 10;  
  58.   
  59.   {$EXTERNALSYM HTRIGHT}  
  60.   
  61.   HTRIGHT = 11;  
  62.   
  63.   {$EXTERNALSYM HTTOP}  
  64.   
  65.   HTTOP = 12;  
  66.   
  67.   {$EXTERNALSYM HTTOPLEFT}  
  68.   
  69.   HTTOPLEFT = 13;  
  70.   
  71.   {$EXTERNALSYM HTTOPRIGHT}  
  72.   
  73.   HTTOPRIGHT = 14;  
  74.   
  75.   {$EXTERNALSYM HTBOTTOM}  
  76.   
  77.   HTBOTTOM = 15;  
  78.   
  79.   {$EXTERNALSYM HTBOTTOMLEFT}  
  80.   
  81.   HTBOTTOMLEFT = 16;  
  82.   
  83.   {$EXTERNALSYM HTBOTTOMRIGHT}  
  84.   
  85.   HTBOTTOMRIGHT = 17;  
  86.   
  87.   {$EXTERNALSYM HTBORDER}  
  88.   
  89.   HTBORDER = 18;  
  90.   
  91.   {$EXTERNALSYM HTREDUCE}  
  92.   
  93.   HTREDUCE = HTMINBUTTON;  
  94.   
  95.   {$EXTERNALSYM HTZOOM}  
  96.   
  97.   HTZOOM = HTMAXBUTTON;  
  98.   
  99.   {$EXTERNALSYM HTSIZEFIRST}  
  100.   
  101.   HTSIZEFIRST = HTLEFT;  
  102.   
  103.   {$EXTERNALSYM HTSIZELAST}  
  104.   
  105.   HTSIZELAST = HTBOTTOMRIGHT;  
  106.   
  107.   {$EXTERNALSYM HTOBJECT}  
  108.   
  109.   HTOBJECT = 19;  
  110.   
  111.   {$EXTERNALSYM HTCLOSE}  
  112.   
  113.   HTCLOSE = 20;  
  114.   
  115.   {$EXTERNALSYM HTHELP}  
  116.   
  117.   HTHELP = 21;  

WinForm特效:拦截窗体上各个部位的点击