私はこれらのコードとのリンクを持っています:
マウスが 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 つのバリアントすべてをチェックしました。マウスの下で正しいコントロールが得られ、コントロール名が表示されますが、コントロールはホイール メッセージを受信しません。
それを機能させるために欠けているパズルのピースはありますか?