WinForms GroupBox 控件不支持 MouseMove(或者至少不支持),我不明白为什么。

由于它是 Control 的后代,它确实有一个 MouseMove 事件,但是 GroupBox 使用 Browsable(false) 明确地重新引入了它,因此它没有显示在属性网格中。您可以在运行时 Hook MouseMove 事件,有时它会起作用——只要 FlatStyle 保留在 Standard 状态。如果 GroupBox 的 FlatStyle 设置为 System,则根本不会触发 MouseMove 事件。

Reflector 没有给我任何线索。 GroupBox 构造函数似乎没有设置任何奇怪的控件样式,并且 GroupBox 不会做任何愚蠢的事情,例如覆盖 MouseMove 并且无法调用 base。

这似乎也是 WinForms 特定的限制,因为 Delphi 组框支持 OnMouseMove 就好了。更正:与 Delphi 的比较无效。 Delphi 分组框实际上并不是标准的 BM_GROUPBOX 控件;它们只是被画成 看起来像 像分组框,实际上没有继承这样奇怪的分组框行为。所以这很可能是 Windows groupbox 控件的一个限制,尽管我没有在任何地方看到它的记录。

为什么 WinForms GroupBox 不支持 MouseMove?

最佳答案

根据 this thread ,标准 Windows groupbox(即具有 BS_GROUPBOX 样式的 BUTTON 控件)似乎返回 HTTRANSPARENT 以响应 WM_NCHITTEST。由于控件声称是透明的,因此 Windows 将鼠标移动事件发送到其父窗口。

该线程确认,如果您自己处理 WM_NCHITTEST 并返回 HTCLIENT,那么 groupbox 将获得鼠标移动事件。他们正在使用 MFC,但它可能也适用于 WinForms。

不清楚的是为什么Windows默认返回HTTRANSPARENT,但至少这个问题已经被独立确认了。

关于winforms - 为什么 GroupBox 没有 MouseMove 事件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1710795/

10-15 17:00