2012-10-18 47 views

回答

5

我的滾動框看起來是這樣的:

type 
    TMyScrollBox = class(TScrollBox) 
    protected 
    function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override; 
    procedure WndProc(var Message: TMessage); override; 
    end; 

function TMyScrollBox.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; 
begin 
    Result := inherited DoMouseWheel(Shift, WheelDelta, MousePos); 
    if not Result then begin 
    if Shift*[ssShift..ssCtrl]=[] then begin 
     VertScrollBar.Position := VertScrollBar.Position - WheelDelta; 
     Result := True; 
    end; 
    end; 
end; 

procedure TMyScrollBox.WndProc(var Message: TMessage); 
begin 
    if Message.Msg=WM_MOUSEHWHEEL then begin 
    (* For some reason using a message handler for WM_MOUSEHWHEEL doesn't work. The messages 
     don't always arrive. It seems to occur when both scroll bars are active. Strangely, 
     if we handle the message here, then the messages all get through. Go figure! *) 
    if TWMMouseWheel(Message).Keys=0 then begin 
     HorzScrollBar.Position := HorzScrollBar.Position + TWMMouseWheel(Message).WheelDelta; 
     Message.Result := 0; 
    end else begin 
     Message.Result := 1; 
    end; 
    end else begin 
    inherited; 
    end; 
end; 
+1

大衛,不應該滾動框(孩子)接受'CM_MOUSEWHEEL'而不是'WM_MOUSEHWHEEL'(只是猜測,手頭沒有德爾福)? – TLama

+0

@TLama爲什麼你覺得它應該是不同的? –

+0

是不是'CM_MOUSEWHEEL <> WM_MOUSEHWHEEL'? – TLama

3

可以使用OnMouseWheel事件處理程序:

ScrollBar1.OnMouseWheel := ScrollBoxMouseWheel; 
... 
procedure TFrame1.ScrollBoxMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); 
begin 
    Handled := True; 
    if WheelDelta < 0 then 
    TScrollBox(Sender).VertScrollBar.Position := TScrollBox(Sender).VertScrollBar.Position + TScrollBox(Sender).VertScrollBar.Increment 
    else 
    TScrollBox(Sender).VertScrollBar.Position := TScrollBox(Sender).VertScrollBar.Position - TScrollBox(Sender).VertScrollBar.Increment; 
end; 
+0

做到了。沒有解決。 :( – PSyLoCKe

+0

它爲我工作,但不是這樣。我不得不使用窗體本身的ScrollBoxMouseWheel事件,並用滾動框的名稱替換TScrollBox(發件人)。 – diedie2

相關問題