2011-04-09 244 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