我有这些代码链接:
如果鼠标不在 VirtualTreeView (TVirtualStringTree) 上,如何禁用 MouseWheel
将其翻译为 C++ Builder 但它不起作用:
更新:在缩小问题范围后,WM_MOUSEWHEEL 消息似乎不仅仅适用于未聚焦的TVirtualStringTree
控件,它们适用于其他控件。当焦点在例如TMemo
控件上时,其他TMemo
控件在滚轮上滚动但不是TVirtualStringTree
控件。当焦点位于它上时,TVirtualStringTree
它会滚动TVirtualStringTree
,但不会滚动其他控件。所以问题现在TVirtualStringTree
只针对特定的。
void __fastcall TForm1::ApplicationEventsMessage(tagMSG &Msg, bool &Handled)
{
TPoint Pt;
HWND Wnd;
if (Msg.message == WM_MOUSEWHEEL ||
Msg.message == WM_VSCROLL ||
Msg.message == WM_HSCROLL)
{
if (GetCursorPos(&Pt))
{
Wnd = WindowFromPoint(Pt);
// It must be a VCL control otherwise we could get access violations
if (IsWindowEnabled(Wnd) && FindControl(Wnd) != NULL)
{
Msg.hwnd = Wnd; // change the message receiver to the control under the cursor
}
}
}
}
类似代码的不同版本,也不起作用:
TPoint pnt;
TWinControl *ctrl;
if ((Msg.message == WM_MOUSEWHEEL ||
Msg.message == WM_VSCROLL ||
Msg.message == WM_HSCROLL) &&
GetCursorPos(&pnt))
{
ctrl = FindVCLWindow(pnt);
if (ctrl != NULL)
{
SendMessage(ctrl->Handle, Msg.message, Msg.wParam, Msg.lParam); // No effect
// SendMessage(ctrl->Handle, WM_VSCROLL, 1, 0); // This is the only thing that actually moves scrollbars but this is not exactly the same message like above
// Msg.hwnd = ctrl->Handle; // No effect
this->Caption=ctrl->Name; // This shows correct control name so the message IS GETTING THROUGH!
Handled = true;
}
}
它应该工作,但它没有。也尝试了其他代码。无效 - 鼠标滚轮不会在未聚焦的控件上运行。如您所见,我检查了所有 3 种滚轮消息的变体,它在鼠标下得到了正确的控制,它显示了该控件名称,但该控件没有收到滚轮消息。
任何想法我缺少哪一块拼图才能让它发挥作用?