鼠标滚轮事件

时间:2011-04-09 17:29:53

标签: windows delphi controls scroll mousewheel

我有一个包含许多控件的表单(树视图,备忘录,列表框,面板等)。

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

就像rad studio检查员栏,工具箱,项目管理员一样。

在每个控件上输入相同的代码是不可能的(到目前为止超过11个控件)

  

[被修改]

     
    

感谢您的所有答案,但

         

像按钮这样的控件没有     滚动条,所以他们的父母(像     面板,框架)必须移动     鼠标滚轮在按钮(子控件)上移动

  

1 个答案:

答案 0 :(得分: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;

<强>更新

David Heffernan [见评论]提出了一种改进此代码的聪明方法:

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;