2013-07-28 3 views
-2

Что касается компонента TMemo, я не могу найти способ обнаружить, когда пользователь выпустил кнопку WHEEL на своей мыши. Стандартное событие OnMouseUp не реагирует на кнопку колеса мыши.Delphi: Обнаружение кнопки колеса мыши нажмите

Mouse wheel button scroll glyph

+1

Обычно (я думаю) настроен как * средняя кнопка *, и в этом случае не должно быть никаких проблем. Возможно, ваша мышь делает что-то еще. –

+0

Что-то еще, или вообще ничего. Работает ли кнопка в других приложениях? Если да, то что он делает? – GolezTrol

+0

Либо пометьте конкретную версию delphi, либо вообще ничего. Не просто пометить много из них по уважительной причине. –

ответ

3

Этот маленький круг вверх-вниз стрелки является панорамирование окно из VCL, который обеспечивает функциональные возможности прокрутки при нажатии средней кнопки.

Окно панорамирования по умолчанию, TPanningWindow, фиксирует мышь в своем методе StartPanning, чтобы иметь возможность следить за движением мыши и не отпускать ее до тех пор, пока панорамирование не остановится - это вызвано другим щелчком. Вот почему в записке никогда не появляется сообщение средней кнопки, поэтому событие OnMouseUp не запускается.

Вы можете обнаружить сообщение кнопки до того, как оно будет отправлено в окно панорамирования, в обработчике OnMessage «Приложения». Ниже пример кода находится в обработчике событий OnMessage компонента TApplicationEvents, проверяет, извлекается ли сообщение, когда окно панорамирования панорамируется для «Memo1».

uses 
    imouse; 

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; 
    var Handled: Boolean); 
begin 
    if (Msg.message = WM_MBUTTONUP) and Assigned(Mouse.PanningWindow) and 
    (Mouse.PanningWindow.HandleAllocated) and 
    (Msg.hwnd = Mouse.PanningWindow.Handle) and 
    (Mouse.PanningWindow is TPanningWindow) and 
    (TPanningWindow(Mouse.PanningWindow).PanControl = Memo1) then 

    // perform what's required 

end; 


В качестве альтернативы, вы можете зарегистрировать свой собственный класс окна панорамирования с Mouse.PanningWindowClass, которые могли бы предупредить, что это пан управления для некоторых сообщений. Вот пример:

uses 
    imouse; 

type 
    TMyPanningWindow = class(TPanningWindow) 
    protected 
    procedure WndProc(var Msg: TMessage); override; 
    end; 

{ TMyPanningWindow } 

procedure TMyPanningWindow.WndProc(var Msg: TMessage); 
begin 
    inherited; 
    if (Msg.Msg = WM_MBUTTONUP) and (Assigned(PanControl)) then 
    PanControl.Perform(Msg.Msg, Msg.WParam, Msg.LParam); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Mouse.PanningWindowClass := TMyPanningWindow; 
end; 
+0

Спасибо, однако, модуль imouse.pas недоступен с Delphi 7. – user1527613

+1

@user - Добро пожаловать! Перед тем, как они были очищены, были всевозможные теги Delphi. Я тестировал вышеуказанный код с D2007, D7 настолько стар, что существует много отличий от текущего продукта. Вы должны пометить вопрос определенной версией, если вам нужно запустить код этой версии. Если вам нужно запустить код во многих версиях, укажите это требование в самом вопросе (в этом случае я, вероятно, не стал бы вникать в него). –

Смежные вопросы