我使用了许多滚动控件:TTreeViews,TListViews,DevExpress cxGrids和cxTreeLists等.当旋转鼠标滚轮时,无论鼠标光标处于何种控制状态,焦点控件都会接收输入.
如何将鼠标滚轮输入指向鼠标光标所在的控制?Delphi IDE在这方面非常有效.
我正在尝试整理我的代码,因为Delphi XE2可用 - 我的代码可以追溯到Borland Pascal 7所以有很多'老'(但工作!)Win32技术,我自然也考虑到了平台独立性.在此之前已经提出了对鼠标滚轮的支持,其中有几个先前的问题1 2和3.与其中一些答案一样,我自己的解决方案是使用TApplicationEvents组件进行简单的鼠标消息拦截:
procedure TForm6.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
procedure ProcessMouseWheelMessage;
begin
Msg.message := WM_KEYDOWN;
Msg.lParam := 0;
If Integer(Msg.wParam) > 0 then
Msg.wParam := VK_UP
else
Msg.wParam := VK_DOWN;
Handled := False;
end;
begin
Case Msg.message of
WM_MOUSEWHEEL :
ProcessMouseWheelMessage;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我今天重新访问了这段代码,因为'Msg.wParam'现在是NativeInt,在上面的代码中使用了负的Msg.wParam值,除非你使用Integer(Msg.wParam).它让我注意到我没有看到任何真正明确使用鼠标滚轮的Delphi代码 - 当所有鼠标现在都有轮子并且Delphi再次处于'前沿'时可怕!我本来期望一个属性,一个组件或一些其他更"暴露"的解决方案,以及Fire Monkey车轮支持怎么样?
我是继续使用我的解决方案还是有更好的方法?