WM_NCLBUTTONDBLCLK 和 双击最大化/还原

禁止双击最大化处理方式(2选1都可以):

1. 拦截 WM_NCLBUTTONDBLCLK 消息 

case WM_NCLBUTTONDBLCLK:  return 0; 

2. 窗口样式去掉 WS_MAXIMIZEBOX

SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_MAXIMIZEBOX );

 

禁止贴边自动最大化

SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_THICKFRAME);

 

参考: https://www.cnblogs.com/chechen/p/5912721.html

<think>好的,用户的问题是在C#中如何实现无标题栏窗体可调节大小。首先,我需要回忆一下WinForms中窗体自定义的相关知识。用户提到的无标题栏通常是通过设置Form的FormBorderStyle为None来实现的,但这样会去掉所有边框,导致窗体无法调整大小。这时候需要手动处理窗口的消息,比如WM_NCHITTEST,来让系统知道用户是在拖动边框调整大小。 根据引用[3][4],用户可能需要通过重写WndProc方法,处理特定的Windows消息。比如,当鼠标移动到窗体边缘时,返回对应的区域标识(如HTLEFT,HTRIGHT等),这样系统就会允许调整大小。另外,引用[3]中还提到如何处理双击标题栏的事件,但这里用户需要的是调整大小而不是移动窗口,所以可能需要不同的处理。 接下来需要考虑如何结合这些引用中的方法。比如,在无标题栏的情况下,如何让窗体边缘可以被拖动。可能需要定义不同的区域,比如左边框、右边框、左上角等,并在WM_NCHITTEST消息中返回对应的值。同时,引用[4]中的方法可能涉及到创建用户控件来模拟边框,或者直接处理消息来改变光标形状并允许拖动调整。 还需要注意,当FormBorderStyle设置为None时,窗体默认没有边框,因此需要自己绘制或处理边缘区域。通过处理WM_NCHITTEST消息,可以告诉系统鼠标所在的位置属于哪个可调整大小的区域,这样用户拖动时就能调整大小。 可能的步骤包括: 1. 设置FormBorderStyle为None。 2. 重写WndProc方法,处理WM_NCHITTEST消息,根据鼠标位置返回对应的HT值(如HTLEFT, HTRIGHT等)。 3. 可能需要处理其他消息,如WM_NCLBUTTONDBLCLK来防止双击标题栏的动作,但在这个场景下可能不需要,因为标题栏已经被移除。 需要验证这些步骤是否正确,并确保代码示例准确。同时,要检查是否有遗漏的HT值,或者是否需要处理其他消息来确保调整大小的功能正常。另外,引用[2]提到FixedToolWindow可以固定大小,但用户需要的是可调节,所以可能需要相反的方法。 最后,根据用户提供的引用,特别是引用[3][4],整合出一个示例代码,展示如何通过处理消息来实现无标题栏窗体的调整大小。需要确保代码正确,语法无误,并且注释清晰,让用户能够理解每个部分的作用。</think>在C#中实现无标题栏窗体可调节大小需要通过Windows API消息处理机制实现,具体步骤如下: ### 实现步骤 1. **隐藏标题栏** 设置`FormBorderStyle = FormBorderStyle.None`移除标题栏边框,此时窗体默认无法调整大小。 2. **重写消息处理方法** 在窗体类中重写`WndProc`方法,通过响应`WM_NCHITTEST`消息判断鼠标位置,并返回对应的窗口区域标识: ```csharp const int WM_NCHITTEST = 0x84; const int HTLEFT = 10, HTRIGHT = 11, HTTOP = 12, HTBOTTOM = 15; const int HTTOPLEFT = 13, HTTOPRIGHT = 14, HTBOTTOMLEFT = 16, HTBOTTOMRIGHT = 17; protected override void WndProc(ref Message m) { if (m.Msg == WM_NCHITTEST) { int borderWidth = 8; // 边缘响应区域宽度 Point cursor = PointToClient(Cursor.Position); // 判断鼠标是否在边缘区域 if (cursor.X <= borderWidth && cursor.Y <= borderWidth) m.Result = (IntPtr)HTTOPLEFT; else if (cursor.X >= Width - borderWidth && cursor.Y <= borderWidth) m.Result = (IntPtr)HTTOPRIGHT; else if (cursor.X <= borderWidth && cursor.Y >= Height - borderWidth) m.Result = (IntPtr)HTBOTTOMLEFT; else if (cursor.X >= Width - borderWidth && cursor.Y >= Height - borderWidth) m.Result = (IntPtr)HTBOTTOMRIGHT; else if (cursor.X <= borderWidth) m.Result = (IntPtr)HTLEFT; else if (cursor.X >= Width - borderWidth) m.Result = (IntPtr)HTRIGHT; else if (cursor.Y <= borderWidth) m.Result = (IntPtr)HTTOP; else if (cursor.Y >= Height - borderWidth) m.Result = (IntPtr)HTBOTTOM; else base.WndProc(ref m); return; } base.WndProc(ref m); } ``` 3. **添加窗体移动支持(可选)** 若需支持拖动窗体移动,可扩展`WM_NCHITTEST`处理: ```csharp const int HTCLIENT = 1, HTCAPTION = 2; // 在WM_NCHITTEST判断后添加: if (m.Result == (IntPtr)HTCLIENT) m.Result = (IntPtr)HTCAPTION; // 将客户区点击视为标题栏拖动 ``` ### 原理解析 - `WM_NCHITTEST`消息用于检测鼠标在非客户区的位置 - 返回特定`HT*`值告知系统该区域支持调整大小操作[^3][^4] - 通过设置8像素的边缘响应区域,模拟标准窗体的边框行为
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值