WinForm实现拦截窗体上各个部位的点击特效实例
本文实例讲述了WinForm实现拦截窗体上各个部位的点击特效,是一个非常实用的技巧。分享给大家供大家参考。具体分析如下:
一般来说,windows窗体的标题栏无法直接通过一些默认的事件来控制,需要了解和WM_NCHITTEST相关的windows消息。
以下示例演示了最简单的效果片断:他会把客户区和标题栏的效果互换,比如无法按住标题栏拖动窗体而是改为了按住客户区拖动,并禁用了关闭按钮。其中m.Result从-2到21都有定义,分别对应了整个窗体的各个部位,比如1代表客户区,8代表最小化按钮等等。
具体功能代码如下:
usingSystem; usingSystem.Windows.Forms; namespaceWindowsApplication42 { publicpartialclassForm1:Form { publicForm1(){InitializeComponent();this.Text="双击左上角图标关闭窗体";} //拦击标题栏鼠标位置事件 constintWM_NCHITTEST=0x84; protectedoverridevoidWndProc(refMessagem) { base.WndProc(refm);if(m.Msg==WM_NCHITTEST) { switch(m.Result.ToInt32()) { case1://客户区 m.Result=newIntPtr(2);break; case2://标题栏 m.Result=newIntPtr(1);break; case20:m.Result=newIntPtr(0);break; default:Console.WriteLine(m);break; } } } } }
下面是各个常量的意义:从Delphi7VCL中摘取:
{WM_NCHITTESTandMOUSEHOOKSTRUCTMousePositionCodes} {$EXTERNALSYMHTERROR} HTERROR=-2; {$EXTERNALSYMHTTRANSPARENT} HTTRANSPARENT=-1; {$EXTERNALSYMHTNOWHERE} HTNOWHERE=0; {$EXTERNALSYMHTCLIENT} HTCLIENT=1; {$EXTERNALSYMHTCAPTION} HTCAPTION=2; {$EXTERNALSYMHTSYSMENU} HTSYSMENU=3; {$EXTERNALSYMHTGROWBOX} HTGROWBOX=4; {$EXTERNALSYMHTSIZE} HTSIZE=HTGROWBOX; {$EXTERNALSYMHTMENU} HTMENU=5; {$EXTERNALSYMHTHSCROLL} HTHSCROLL=6; {$EXTERNALSYMHTVSCROLL} HTVSCROLL=7; {$EXTERNALSYMHTMINBUTTON} HTMINBUTTON=8; {$EXTERNALSYMHTMAXBUTTON} HTMAXBUTTON=9; {$EXTERNALSYMHTLEFT} HTLEFT=10; {$EXTERNALSYMHTRIGHT} HTRIGHT=11; {$EXTERNALSYMHTTOP} HTTOP=12; {$EXTERNALSYMHTTOPLEFT} HTTOPLEFT=13; {$EXTERNALSYMHTTOPRIGHT} HTTOPRIGHT=14; {$EXTERNALSYMHTBOTTOM} HTBOTTOM=15; {$EXTERNALSYMHTBOTTOMLEFT} HTBOTTOMLEFT=16; {$EXTERNALSYMHTBOTTOMRIGHT} HTBOTTOMRIGHT=17; {$EXTERNALSYMHTBORDER} HTBORDER=18; {$EXTERNALSYMHTREDUCE} HTREDUCE=HTMINBUTTON; {$EXTERNALSYMHTZOOM} HTZOOM=HTMAXBUTTON; {$EXTERNALSYMHTSIZEFIRST} HTSIZEFIRST=HTLEFT; {$EXTERNALSYMHTSIZELAST} HTSIZELAST=HTBOTTOMRIGHT; {$EXTERNALSYMHTOBJECT} HTOBJECT=19; {$EXTERNALSYMHTCLOSE} HTCLOSE=20; {$EXTERNALSYMHTHELP} HTHELP=21;
希望本文所述对大家的C#程序设计有所帮助。