我有一個帶有許多控件(樹形視圖,備忘錄,列表框,面板等)的窗體。鼠標滾輪事件
我想在鼠標懸停在組件上並滾動滾輪時自動移動這些控件的滾動條。
正如rad工作室檢查員酒吧,工具箱,項目經理工作。
而且這是無法通行的鍵入每個相同的代碼,每個控件(超過11個控制到現在)
[編輯]
感謝所有的答案,但
控件像按鈕沒有 滾動條,所以他們的父母(如 面板,框架)必須移動,當 鼠標滾輪移動按鈕(孩子控制)
我有一個帶有許多控件(樹形視圖,備忘錄,列表框,面板等)的窗體。鼠標滾輪事件
我想在鼠標懸停在組件上並滾動滾輪時自動移動這些控件的滾動條。
正如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://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
另外我想改變鍵盤焦點到鼠標控制 – VibeeshanRC 2011-04-10 09:39:34