我想创建一个这样的winform:
通过关注其他问题,我已经完成了视觉效果(如图所示)。但我不能禁止调整表格的大小,因为要有边框,它必须是“Sizeable”。有人建议将最小尺寸和最大尺寸值设置为等于当前表单尺寸。这解决了部分问题,但是当鼠标悬停在边框上时,它仍然显示双端箭头,表明表单是可调整大小的。有什么方法可以禁用此光标更改?我的目标是模仿 Windows 7 中的原始系统托盘弹出窗口,如网络、声音等。
谢谢!
我想创建一个这样的winform:
通过关注其他问题,我已经完成了视觉效果(如图所示)。但我不能禁止调整表格的大小,因为要有边框,它必须是“Sizeable”。有人建议将最小尺寸和最大尺寸值设置为等于当前表单尺寸。这解决了部分问题,但是当鼠标悬停在边框上时,它仍然显示双端箭头,表明表单是可调整大小的。有什么方法可以禁用此光标更改?我的目标是模仿 Windows 7 中的原始系统托盘弹出窗口,如网络、声音等。
谢谢!
示例代码:
private const int WM_NCHITTEST = 0x84;
private const int HTCLIENT = 0x1;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCHITTEST:
m.Result = (IntPtr)HTCLIENT;
return;
}
base.WndProc(ref m);
}
这样,当光标悬停在边框上时,指针不会改变,因为它被视为在表单内部,从而达到预期的效果。
将消息处理程序添加到您的表单并处理 WM_NCHITTEST。当原件返回 HTSIZE(等)时,返回 HTNONE 或 HTCAPTION。
像这样的问题应该让你开始。
解释:
当 Windows 想知道您的窗口使用哪个光标时,它首先会向您发送一条WM_NCHITTEST
消息(非客户端命中测试)。该消息由该WndProc
方法处理。您的窗口应该返回一个HT*
代码来告诉 Windows 鼠标在窗口的哪个部分。例如,返回HTCAPTION
标题区域、HTCLIENT
客户区域或HTSIZENESW
左下角大小。标准窗口的默认消息处理程序(调用base.WndProc
)处理此问题。
我们没有标准的窗口。
我们在这里尝试做的是询问原始窗口鼠标在哪里。如果它返回任何HTSIZE*
值,我们希望将该返回值替换为HTNONE
(对于无操作)或HTCLIENT
(如果您希望光标被视为在窗口内 - 可能不是这个)或HTCAPTION
(如果您希望能够通过边缘拖动窗口 - 可能有用)。