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. mysql安装与配置

    想在个人电脑上安装mysql学习用.在此做下记录 步骤一: MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大 ...

  2. 【转】CentOS 6.3 X64自动安装OpenERP 7.0脚本

    原文地址:OpenERP 7.0安装与配置 #!/bin/bash -e # Modified script from Carlos E. Fonseca Zorrilla # . Add the t ...

  3. strtok和strtok_r

    1.strtok()函数的用法 函数原型:char *strtok(char *s, const char *delim); Function:分解字符串为一组字符串.s为要分解的字符串,delim为 ...

  4. C语言实现strcat

    首先看看代码: #ifndef STRCAT_H #define STRCAT_H /********************************************************* ...

  5. php时间函数

    PHP中的时间函数有这么些:(1)date用法: date(格式,[时间]);如果没有时间参数,则使用当前时间. 格式是一个字符串,其中以下字符有特殊意义:U 替换成从一个起始时间(好象是1970年1 ...

  6. iOS优秀博客收录(持续更新)

    唐巧 王巍 破船之家 NSHipster Limboy 无网不剩 念茜的博客 Xcode Dev Ted’s Homepage txx’s blog KEVIN BLOG 阿毛的蛋疼地 亚庆的 Blo ...

  7. 10本最新的Android开发电子书免费下载

    最新的Android开发电子书大集合,免费下载! 1.The Business of Android Apps Development, 2nd Edition http://ebook.goodfa ...

  8. 使用arm开发板搭建无线mesh网络(二)

    上篇博文介绍了无线mesh网络和adhoc网络的区别,这篇文章将介绍无线mesh网络的骨干网节点的组建过程.首先需要介绍下骨干网节点的设计方案:每个骨干网节点都是由一块友善之臂的tiny6410 ar ...

  9. Yarn中的几种状态机

    1 概述 为了增大并发性,Yarn采用事件驱动的并发模型,将各种处理逻辑抽象成事件和调度器,将事件的处理过程用状态机表示.什么是状态机? 如果一个对象,其构成为若干个状态,以及触发这些状态发生相互转移 ...

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

    在家待了一天,鼓捣了下linux,总算能连上网了,懂得还是少啊. 晚上去华北电力大学跑了会步,十圈,还挺有成就感呢,就是没带手环,哎. 以后学习一定要记笔记,上了这么多年学,都 没学会怎么记笔记,也是 ...