我有一个包含许多控件的表单(树视图,备忘录,列表框,面板等)。
我想在鼠标悬停在组件上并滚动滚轮时自动移动这些控件的滚动条。
就像rad studio检查员栏,工具箱,项目管理员一样。
在每个控件上输入相同的代码是不可能的(到目前为止超过11个控件)
[被修改]
感谢您的所有答案,但
像按钮这样的控件没有 滚动条,所以他们的父母(像 面板,框架)必须移动 鼠标滚轮在按钮(子控件)上移动
答案 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;