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. Http相应代码及获取方法

    1xx(临时响应)用于表示临时响应并需要请求者执行操作才能继续的状态代码. 代码 说明 100(继续) 请求者应当继续提出请求.服务器返回此代码则意味着,服务器已收到了请求的第一部分,现正在等待接收其 ...

  2. android 性能优化大纲

    性能优化系列 分为三个部分:视图篇 逻辑篇  和代码规范篇 . ------2016/9/6  视图篇      主要涵盖视图树层级优化.自定义视图.图片优化,常用布局性能缺陷等多个方面 .把平常经常 ...

  3. 【DWT笔记】傅里叶变换与小波变换

    [DWT笔记]傅里叶变换与小波变换 一.前言 我们经常接触到的信号,正弦信号,余弦信号,甚至是复杂的心电图.脑电图.地震波信号都是时域上的信号,我们也成为原始信号,但是通常情况下,我们在原始信号中得到 ...

  4. scrollTop

    scrollTop 表示滚动的高度,默认从position:0;开始向下滚,scrollTop(offset)的offset表示相对顶部的偏移,以像素计,<br/> scrollTop() ...

  5. C++11 之 &quot; = delete &quot;

    1  缺省函数 设计一个类,没有成员函数 (member function),只有成员数据 (member data) class DataOnly { private: std::string st ...

  6. 【24点游戏】cocos2dx 源码

    1.  4个数字 24点判断 double Calc(double a, double b, string oper) { double result = 0; const char *p = ope ...

  7. 了解JBoss Drools Engine

    说一个自己比较喜欢的开源产品JBoss Drools, 很多企业内部大型项目都在使用的规则引擎该怎么理解规则引擎,到底是个什么东西,我好像没听过,我们能用么. 它是配有内置算法及对应数据结构的计算容器 ...

  8. leetcode@ [146] LRU Cache (TreeMap)

    https://leetcode.com/problems/lru-cache/ Design and implement a data structure for Least Recently Us ...

  9. Oracle创建删除用户,角色,表空间,导入导出数据库命令总结(转载)

    无意间看到一篇文章,觉得对于ORACLE的新手很实用,特转载,原文出处这里 说明:在创建数据库时输入的密码,是修改系统默认的密码,以system和sysman等系统默认身份登录时要输入的密码就是修改后 ...

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

    三言诗,把自己的心情,想要说的话用三句话诗意的表达出来.像: 烦===>好想睡一觉,待日落,盼天明. 愁====>待到花开花落,闲庭信步,蹋碎一世忧愁. 三句话,可以表达的很好. 老是感觉 ...