2011-04-09 242 views
2

我有一个带有许多控件(树形视图,备忘录,列表框,面板等)的窗体。鼠标滚轮事件

我想在鼠标悬停在组件上并滚动滚轮时自动移动这些控件的滚动条。

正如rad工作室检查员酒吧,工具箱,项目经理工作。

而且这是无法通行的键入每个相同的代码,每个控件(超过11个控制到现在)

[编辑]

感谢所有的答案,但

控件像按钮没有 滚动条,所以他们的父母(如 面板,框架)必须移动,当 鼠标滚轮移动按钮(孩子控制)

+1

所以你想覆盖默认行为(最常见的是,该控件也需要键盘焦点)? – 2011-04-09 17:38:34

+1

Duplicate:http://stackoverflow.com/questions/2251019/how-to-direct-the-mouse-wheel-input-to-control-under-cursor可能的重复:http://stackoverflow.com/questions/4172307/wmmousewheel-not-working-in-delphi – 2011-04-10 03:04:11

+0

另外我想改变键盘焦点到鼠标控制 – VibeeshanRC 2011-04-10 09:39:34

回答

4

添加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; 
+0

鼠标滚轮事件进入 窗口,输入焦点不在光标下的 窗口。 – 2011-04-09 22:32:55

+1

@David:是的,我们都知道。这也是为什么OP首先提出了他的问题。 (如果反驳是真的,OP就不会问他的问题)。我不认为改变这种行为是一个好主意,但仅仅提供了关于如何去做的技术细节,因为那是确切的问题的一点。如果你想降低评分,我建议你降低OP的问题,而不是(严格地说)对问题的正确答案。 – 2011-04-09 22:48:03

+0

(Delphi 2009 IDE的行为如下:当旋转轮子时,光标下方的控件会滚动,而不考虑键盘焦点。) – 2011-04-09 22:50:39