当鼠标不在标题栏上方时隐藏窗体的客户区(但让标题栏可见)
我正在寻找一种开发方法:
(来源:hostingpics.net)
在表单的标题栏(图片上的矩形 1)上方,表单内容(矩形 2)可见并且可见。当鼠标未悬停时,它会消失,但矩形 1 必须保持可见!
我怎样才能做到这一点?
提前致谢
I'm looking for a way to develop this:
(source: hostingpics.net)
When the mouse is over the form's title bar (rectange 1 on the picture) the form content (the rectangle 2) is visible & when the mouse is not over, it disappears but the rectangle 1 must remain visible!
How could i manage to do that ?
Thanks in advance
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
有一些与表单非客户区相关的鼠标事件(
WM_NCMOUSEMOVE
、WM_NCMOUSELEAVE
...)可用于此目的。但这并不简单,因为它们不包含在 Windows 窗体中。要使用此事件,您应该覆盖表单的WndProc
。捕获WM_NCMOUSEMOVE
事件在某种程度上很简单,但WM_NCMOSUELEAVE
有点棘手。 Windows 通常不会向窗口发送鼠标离开事件,除非它们使用TrackMouseEvent
函数显式请求。下面是完全符合您要求的完整代码:
将此代码部分放入您的表单类中,这样就可以处理所有事情。
通过重写
WndProc
,我们正在处理所需的鼠标事件。在WM_NCMOUSEMOVE
事件中,我们调用一个方法来通知操作系统我们对WM_NCMOUSELEAVE
事件感兴趣,并且我们还显示表单的客户区(如果不可见) .在
WM_NCMOUSELEAVE
事件中,我们隐藏表单的客户区(如果光标不在表单上)。每次调用WM_NCMOUSELEAVE
事件时,TrackMouseEvent
请求的所有跟踪事件都会被取消,因此我们必须在中每次调用
。TrackMouseEvent
函数>WM_NCMOUSEMOVE请注意,此代码中未考虑最大化表单,您应该以某种方式处理它。
There are some mouse events related to the non-client area of the forms (
WM_NCMOUSEMOVE
,WM_NCMOUSELEAVE
, ...) that can be used for this purpose. But this is not simple, because they are not included in Windows Forms. To use this events, you should overrideWndProc
of your form. CatchingWM_NCMOUSEMOVE
event is somehow simple, butWM_NCMOSUELEAVE
is a little tricky. Windows normally does not send mouse leave events to windows, unless they request it explicitly usingTrackMouseEvent
function.Here is the complete code that does exactly what you want:
Put this code section in your form class, and that takes care of everything.
By overriding
WndProc
we are handling required mouse events. InWM_NCMOUSEMOVE
event, we call a method to inform the operating system that we are interested inWM_NCMOUSELEAVE
event, and also we show the client area of the form (if not visible).In
WM_NCMOUSELEAVE
event we hide the client area of the form (if the cursor is not on the form). Every time theWM_NCMOUSELEAVE
event is called, all tracking events requested byTrackMouseEvent
are canceled, so we must call theTrackMouseEvent
function every time inWM_NCMOUSEMOVE
.Be aware that maximizing the form is not considered in this code and you should handle it somehow.
我建议您制作一个无边框表单,并使用停靠在顶部的自定义控件作为标题栏。然后它就变得像在 MouseEnter 和 MouseLeave 事件上更改表单的高度一样简单!
希望有帮助!
I suggest that you make a borderless form and use a custom control docked to the top as the title bar. Then it becomes as simple as changing the height of the form on MouseEnter and MouseLeave events!
Hope that helps!
知道您的 Form BorderStyle 设置为 None,您可以根据鼠标的位置和矩形的大小来开发一些内容,因此您必须使用 MouseEnter 和 MouseLeave 事件,如 Digvijay 所说>。
这是我的示例代码:
Knowing that your Form BorderStyle is set on None, you can develop something based on the position of the mouse and the size of your rectangles, so you must use the MouseEnter and MouseLeave event as said Digvijay.
Here is my sample code: