鼠标滚轮事件
我有一个带有许多控件(树形视图,备忘录,列表框,面板等)的窗体。鼠标滚轮事件
我想在鼠标悬停在组件上并滚动滚轮时自动移动这些控件的滚动条。
正如rad工作室检查员酒吧,工具箱,项目经理工作。
而且这是无法通行的键入每个相同的代码,每个控件(超过11个控制到现在)
[编辑]
感谢所有的答案,但
控件像按钮没有 滚动条,所以他们的父母(如 面板,框架)必须移动,当 鼠标滚轮移动按钮(孩子控制)
添加TApplicationEvents
到窗体,并添加OnMessage
处理程序:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
var
pnt: TPoint;
ctrl: TWinControl;
begin
if Msg.message = WM_MOUSEWHEEL then
begin
if not GetCursorPos(pnt) then Exit;
ctrl := FindVCLWindow(pnt);
if Assigned(ctrl) then
begin
SendMessage(ctrl.Handle, Msg.message, Msg.wParam, Msg.lParam);
Handled := true; // or maybe Msg.message := WM_NULL;
end;
end;
end;
更新
大卫·赫弗南[查看评论]想出了一个巧妙的方法改进此代码:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
var
pnt: TPoint;
ctrl: TWinControl;
begin
if Msg.message = WM_MOUSEWHEEL then
begin
if not GetCursorPos(pnt) then Exit;
ctrl := FindVCLWindow(pnt);
if Assigned(ctrl) then
Msg.hwnd := ctrl.Handle;
end;
end;
鼠标滚轮事件进入 窗口,输入焦点不在光标下的 窗口。 – 2011-04-09 22:32:55
@David:是的,我们都知道。这也是为什么OP首先提出了他的问题。 (如果反驳是真的,OP就不会问他的问题)。我不认为改变这种行为是一个好主意,但仅仅提供了关于如何去做的技术细节,因为那是确切的问题的一点。如果你想降低评分,我建议你降低OP的问题,而不是(严格地说)对问题的正确答案。 – 2011-04-09 22:48:03
(Delphi 2009 IDE的行为如下:当旋转*时,光标下方的控件会滚动,而不考虑键盘焦点。) – 2011-04-09 22:50:39
所以你想覆盖默认行为(最常见的是,该控件也需要键盘焦点)? – 2011-04-09 17:38:34
Duplicate:http://*.com/questions/2251019/how-to-direct-the-mouse-wheel-input-to-control-under-cursor可能的重复:http://*.com/questions/4172307/wmmousewheel-not-working-in-delphi – 2011-04-10 03:04:11
另外我想改变键盘焦点到鼠标控制 – VibeeshanRC 2011-04-10 09:39:34