2011-08-15 100 views
3

我有一個TSCrollBar在OnScroll事件中有一個代碼。如何使用鼠標滾輪滾動TScrollbar?

我想使用鼠標滾輪滾動它,但轉動鼠標滾輪不會滾動滾動條,也不會觸發OnScroll事件。

有什麼想法?

+3

什麼不行? –

+1

考慮到你的代表,現在你應該知道,如果你沒有向我們展示你的代碼,並告訴我們你已經嘗試了什麼以及它沒有工作(你期望什麼和實際發生了什麼),我們大多數人都做不了多少事情。 –

+2

我讀到這個時會產生一個更廣泛的問題。我一直在做一個攔截鼠標滾輪消息以獲得TListBox等「正常工作」的mod。我仍然在XE中這樣做。這是正確的嗎?爲什麼XE沒有「正確」的行爲?這是出於傳統原因嗎? 「它不起作用。」 –

回答

0

我不知道這是否會有很大幫助,但以下是如何使用TMemo實現的。滾動條必須是一個類似的過程,除非有其他更好的方法比我的Delphi版本更適用。

procedure TForm1.Memo1WindowProc(var msg: TMessage); 
    var 
    ticks: ShortInt; 
    ScrollMsg: TWMVScroll; 
    begin 
    if msg.Msg = WM_MOUSEWHEEL then 
     begin 
     ScrollMsg.Msg := WM_VSCROLL; 
     ticks := HiWord(msg.wparam); 
     if ticks > 0 then 
      ScrollMsg.ScrollCode := sb_LineUp 
     else 
      ScrollMsg.ScrollCode := sb_LineDown; 
     ScrollMsg.Pos:=0; 
     Memo1.Dispatch(ScrollMsg) ; 
     end 
    else 
     OldMemo1(msg); 
    end; 

procedure TForm1.FormCreate(Sender: TObject); 
// save old window proc, assign mine. 
    begin 
    OldMemo1 := Memo1.WindowProc; 
    Memo1.WindowProc := Memo1WindowProc; 
    end; 

HTH一些。

4

默認TScrollBar組件確實似乎沒有OnMouseWheel *事件存在。但是,你可以簡單地將它們分配如下:

type 
    TForm1 = class(TForm) 
    ScrollBar1: TScrollBar; 
    procedure FormCreate(Sender: TObject); 
    procedure ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; 
     var ScrollPos: Integer); 
    private 
    procedure ScrollBarMouseWheel(Sender: TObject; Shift: TShiftState; 
     WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); 
    end; 

... 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ScrollBar1.OnMouseWheel := ScrollBarMouseWheel; 
end; 

procedure TForm1.ScrollBarMouseWheel(Sender: TObject; Shift: TShiftState; 
    WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); 
var 
    NewScrollPos: Integer; 
begin 
    NewScrollPos := ScrollBar1.Position - WheelDelta; 
    //Trigger the OnScroll event: 
    ScrollBar1.Scroll(scPosition, NewScrollPos); 
    //Scroll the bar into the new position: 
    ScrollBar1.Position := NewScrollPos; 
    Handled := True; 
end; 

你可以自由地實現這個一些更有創意:

if WheelDelta > 0 then 
    NewScrollPos := ScrollBar1.Position - ScrollBar1.PageSize 
    else 
    NewScrollPos := ScrollBar1.Position + ScrollBar1.PageSize; 

而且你可以夾着TScrollBar類,以防止事件在運行時分配:

type 
    TScrollBar = class(StdCtrls.TScrollBar) 
    protected 
    function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; 
     MousePos: TPoint): Boolean; override; 
    end; 

function TScrollBar.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; 
    MousePos: TPoint): Boolean; 
var 
    NewScrollPos: Integer; 
begin 
    NewScrollPos := Position - WheelDelta; 
    Scroll(scPosition, NewScrollPos); 
    Position := NewScrollPos; 
    Result := True; 
end; 
15
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; 
    WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); 
var 
    I: Integer; 
begin 
    Handled := PtInRect(ScrollBox1.ClientRect, ScrollBox1.ScreenToClient(MousePos)); 
    if Handled then 
    for I := 1 to Mouse.WheelScrollLines do 
    try 
     if WheelDelta > 0 then 
     ScrollBox1.Perform(WM_VSCROLL, SB_LINEUP, 0) 
     else 
     ScrollBox1.Perform(WM_VSCROLL, SB_LINEDOWN, 0); 
    finally 
     ScrollBox1.Perform(WM_VSCROLL, SB_ENDSCROLL, 0); 
    end; 
end; 
+1

-1這是關於一個ScrollBar,而不是一個ScrollBox。此外,僅對VCL內部的/執行作品。 – NGLN

+0

這與ScrollBox一起工作。謝謝。 – SAMPro

+0

也與我一起工作,謝謝 –

0
procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState; 
    MousePos: TPoint; var Handled: Boolean); 
begin 
    ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position + 20; 
end; 

procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState; 
    MousePos: TPoint; var Handled: Boolean); 
begin 
    ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position - 20; 
end; 
+0

你應該閱讀關於格式化代碼並修復你的答案。閱讀起來會更容易。 http://stackoverflow.com/help/formatting – Michas

+1

問題是關於一個ScrollBar,而不是一個ScrollBox。 – NGLN

-1

舊帖子,但我找到解決方案。只需做

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; 
    WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); 
begin 
    inherited; 

    ScrollBox1.ScrollBy(WheelDelta, 0); 
end; 

適合我。

+1

問題是關於一個ScrollBar,而不是一個ScrollBox。 – NGLN

+1

除了關於ScrollBar的事實之外,使用ScrollBy可以滾動包含滾動條本身的完整控件並水平滾動。通過使用「ScrollBox1.VertScrollBar.Position:= ScrollBox1.VertScrollBar.Position - WheelDelta;」可以獲得更好的結果。處理也應設置爲true。 – Mike

1

這太容易了,只需增加位置值即可。

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; 
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); 
begin 
self.VertScrollBar.Position := self.VertScrollBar.Position + WheelDelta; 
end; 
+0

這對我來說只是改變了+ - 一個 - 否則它倒退「倒卷」大聲笑 – Troz