本文實例講述了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中摘?。?/p>
{ 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;
希望本文所述對大家的C#程序設計有所幫助。
新聞熱點
疑難解答