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

  1. using System;
  2. using System.Windows.Forms;
  3. namespace WindowsApplication42
  4. {
  5. public partial class Form1 : Form
  6. {
  7. public Form1() { InitializeComponent(); this.Text = "双击左上角图标关闭窗体"; }
  8. //拦击标题栏鼠标位置事件
  9. const int WM_NCHITTEST = 0x84;
  10. protected override void WndProc(ref Message m)
  11. {
  12. base.WndProc(ref m); if (m.Msg == WM_NCHITTEST)
  13. {
  14. switch (m.Result.ToInt32())
  15. {
  16. case 1://客户区
  17. m.Result = new IntPtr(2); break;
  18. case 2://标题栏
  19. m.Result = new IntPtr(1); break;
  20. case 20: m.Result = new IntPtr(0); break;
  21. default: Console.WriteLine(m); break;
  22. }
  23. }
  24. }
  25. }
  26. }

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

  1. { WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes }
  2. {$EXTERNALSYM HTERROR}
  3. HTERROR = -2;
  4. {$EXTERNALSYM HTTRANSPARENT}
  5. HTTRANSPARENT = -1;
  6. {$EXTERNALSYM HTNOWHERE}
  7. HTNOWHERE = 0;
  8. {$EXTERNALSYM HTCLIENT}
  9. HTCLIENT = 1;
  10. {$EXTERNALSYM HTCAPTION}
  11. HTCAPTION = 2;
  12. {$EXTERNALSYM HTSYSMENU}
  13. HTSYSMENU = 3;
  14. {$EXTERNALSYM HTGROWBOX}
  15. HTGROWBOX = 4;
  16. {$EXTERNALSYM HTSIZE}
  17. HTSIZE = HTGROWBOX;
  18. {$EXTERNALSYM HTMENU}
  19. HTMENU = 5;
  20. {$EXTERNALSYM HTHSCROLL}
  21. HTHSCROLL = 6;
  22. {$EXTERNALSYM HTVSCROLL}
  23. HTVSCROLL = 7;
  24. {$EXTERNALSYM HTMINBUTTON}
  25. HTMINBUTTON = 8;
  26. {$EXTERNALSYM HTMAXBUTTON}
  27. HTMAXBUTTON = 9;
  28. {$EXTERNALSYM HTLEFT}
  29. HTLEFT = 10;
  30. {$EXTERNALSYM HTRIGHT}
  31. HTRIGHT = 11;
  32. {$EXTERNALSYM HTTOP}
  33. HTTOP = 12;
  34. {$EXTERNALSYM HTTOPLEFT}
  35. HTTOPLEFT = 13;
  36. {$EXTERNALSYM HTTOPRIGHT}
  37. HTTOPRIGHT = 14;
  38. {$EXTERNALSYM HTBOTTOM}
  39. HTBOTTOM = 15;
  40. {$EXTERNALSYM HTBOTTOMLEFT}
  41. HTBOTTOMLEFT = 16;
  42. {$EXTERNALSYM HTBOTTOMRIGHT}
  43. HTBOTTOMRIGHT = 17;
  44. {$EXTERNALSYM HTBORDER}
  45. HTBORDER = 18;
  46. {$EXTERNALSYM HTREDUCE}
  47. HTREDUCE = HTMINBUTTON;
  48. {$EXTERNALSYM HTZOOM}
  49. HTZOOM = HTMAXBUTTON;
  50. {$EXTERNALSYM HTSIZEFIRST}
  51. HTSIZEFIRST = HTLEFT;
  52. {$EXTERNALSYM HTSIZELAST}
  53. HTSIZELAST = HTBOTTOMRIGHT;
  54. {$EXTERNALSYM HTOBJECT}
  55. HTOBJECT = 19;
  56. {$EXTERNALSYM HTCLOSE}
  57. HTCLOSE = 20;
  58. {$EXTERNALSYM HTHELP}
  59. HTHELP = 21;

WinForm特效:拦截窗体上各个部位的点击的更多相关文章

  1. WinForm窗体上两个panel,怎么实现一个panel固定漂浮在另一个panel之上

    问题:winform窗体,要实现一个panel漂浮在另一个panel之上,但是运行的时候移动鼠标或者其他操作,上面那个panel就会消失?即只能显示一个panel. 原因:在窗体上拖放控件肉眼观察是平 ...

  2. 小数运算需要注意什么? 接口和抽象类 WinForm窗体上两个panel,怎么实现一个panel固定漂浮在另一个panel之上

    小数运算需要注意什么? 1. 生活中0.1+0.2=0.3, 计算机中可不是这样,为什么呢? 大家都知道计算机类型都是有数据范围的.整形int范围是 正负21亿左右,小数类型同样也是有范围的,但是即使 ...

  3. C#WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置

    C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...

  4. C#自定义Winform无边框窗体

    C#自定义Winform无边框窗体 在实际项目中,WinForm窗体或者控件不能满足要求,所以就需要自己设计窗体等,当然设计界面可以用的东西很多,例如WPF.或者一些第三方的库等.本例中将采用WinF ...

  5. WinForm无边框窗体移动方法

    C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...

  6. C#WinForm无边框窗体移动----模仿鼠标单击标题栏移动窗体位置

    C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...

  7. .NET混合开发解决方案12 网页JS调用C#方法访问WinForm或WPF窗体

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

  8. Dynamics AX 2012 R2 窗体系列 - 在窗体上修改字段时所触发的方法及其顺序

        在这个系列里,Reinhard将和大家一起探索在AX的窗体上执行操作时,都会触发窗体.窗体数据源和表上的哪些方法,并且是以怎样的顺序触发的.     这次,我们来看看在窗体上修改或录入数据的情 ...

  9. winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体

    winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体,搜集了几个方法,列举如下: 一 . 所有权法 父窗体,名称为“fuForm”,在父窗体中有个公共刷新方法,也就是窗体数据初始 ...

随机推荐

  1. C#开源框架(整理)

    http://www.cnblogs.com/chinanetwind/p/3715809.html http://www.cnblogs.com/chinanetwind/p/3715813.htm ...

  2. 网易实习笔试真题C/C++

    刚做的时候根本就没有想到解题思路,刚好看到了别人的思路,自己写了一下.里面对unordered_map及vector二维数组的建立很灵活,另外区别了一下map,unordered_map,hash_m ...

  3. Linux环境变量(小马哥推荐)

    /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置. /etc/bashrc:为每一 ...

  4. 微软Azure云主机测试报告

    http://www.cnblogs.com/sennly/p/4135658.html 1. 测试目的 本次测试的目的在于对微软云主机做性能测试,评估其是否能够满足我们业务的需求. 2. 测试项目 ...

  5. 【转】17种常用的JS正则表达式 非负浮点数 非负正数.

    <input type='text' id='SYS_PAGE_JumpPage' name='SYS_PAGE_JumpPage' size='3' maxlength='5' onkeyup ...

  6. 第三百五十四天 how can I 坚持

    你的问题主要在于:读书不多而买书太多:读书太少又特爱思考,还话唠.. 2012年毕业,辗转无锡,上海,最后来到了北京,逛了北京, 2013年,清明去爬了长城,从天通苑搬到了甜水园, 2014年,爬了泰 ...

  7. 第二百二十六天 how can I 坚持

    今天弟弟生日,只是简单的说了句生日快乐,幸亏看了下日历,要不又忘了. 在家待了一天. 明天还想去爬山,八大处太远了,该去哪呢. 不想在家待着. 日复一日,啊,年复一年啊.想想好可怕,人生,太快.该如何 ...

  8. Hadoop概念学习系列之分布式数据集的容错性(二十七)

    一般来说,分布式数据集的容错性有两种方式: 1.数据检查点 2.记录数据的更新 我们面向的是大规模数据分析,数据检查点操作成本很高:需要通过数据中心的网络连接在机器之间复制庞大的数据集,而网络带宽往往 ...

  9. Struts – Wildcards example

    Struts wildcards can helps to reduce the repetition in your struts-config.xml file, as long as your ...

  10. labview事件结构

    等待事件发生,并执行相应条件分支,处理该事件.事件结构 包括一个或多个子程序框图或事件分支,结构处理时间时,仅有一个子程序框图或分支在执行.等待事件通知时,该结构可超时. 连线边框左上角的“超时”接线 ...