Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Мышкино колёсико


Автор: EKoshelev 13.10.2004, 15:59
У меня Delphi 5
Хотелось бы знать как отловить вращение колёсика мышки. По факьюшкам, помнится, рылся, дак там только его наличие можно было выявить. А ещё я тут глумлюсь над StringGrid'ом и мне не нужно чтобы маркер ползал от колеса. Может быть его и перехватить можно как-нибудь?

Всем заранее спасибо.

Автор: Akella 13.10.2004, 16:44
здается мне, что нужно добавлять событие к компоненте TStringGrid OnMouseWheel, такое как в DBGrid`е

Автор: Snowy 13.10.2004, 16:47
Какие ужасные проблеммы... В Delphi 7 есть стандастные события: OnMouseWheel, OnMouseWheelUp, OnMouseWheelDown.

Если конечно хочется помучиться, то придется отслеживать сообщения форме.
Ждать сообщения WM_MOUSEWHEEL. Оно тебе заодно и скажет, куда крутить: вверх или вниз. Только оно работает не во всех версиях Win. В >=2k работает точно. Про остальные не скажу.

Автор: Akella 13.10.2004, 16:49
Цитата
Какие ужасные проблеммы... В Delphi 7 есть стандастные события: OnMouseWheel, OnMouseWheelUp, OnMouseWheelDown.

в TStingGrid нету

Автор: bartram 13.10.2004, 16:51
Snowy, зарегистрируйся раз такие полезные сообщения даёшь! smile.gif

Автор: Snowy 13.10.2004, 17:06
Точно, поправочка. У StringGreed нет OnMouseWheel. Есть только OnMouseWheelUp, OnMouseWheelDown. Хотя это не многое меняет. Однако было бы полезно ловить именно сообщения формы, а не грида, т.к. грид и сам по колесу двигает ползунок, а вот, если фокус не на гриде, то в данном случае скролить область грида, а не позицию. Хотя можно совместить полезное с приятным и просто посадить на форму TApplicationEvents. А у него уже следить, что:

if Msg.Message=WM_MOUSEWHEEL then
if Msg.lParam<0 then вверх
else вниз;

В данном случае будет работать везде.

Автор: z-END 8.2.2005, 19:26
Цитата(Snowy @ 13.10.2004, 17:06)
if Msg.Message=WM_MOUSEWHEEL then
if Msg.lParam<0 then вверх
else вниз;

Это точно рабочий пример?! нет, я не-то чтобы не верю Snowy, просто щас на компе проверял, там lParam меняется только если координаты гызуна сдвинулсь, а реально данные находятся в wParam с точночтью до наоборот т.е. <0 значит вниз >0 наверх.
Может быть у меня с компом че-то? т.к. уже столкнулся с тем что он как-то неесовсем правильно работает. http://forum.vingrad.ru/index.php?showtopic=39646

Автор: Snowy 9.2.2005, 09:17
Конечно нет. Что-то я ляпнул на скорую руку не подумавши.
Рабочий код такой:
Код

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
 var Handled: Boolean);
begin
 if Msg.Message=WM_MOUSEWHEEL then
   if Msg.wParam>0 then вверх
   else 'вниз';
end;

Автор: BukaKoka 24.10.2009, 13:23
Отловить та отловили всё хорошо.
Но мне надо програмно покрутить им как это сделать. Какие функции здесь нужны?

Спасибо.

Автор: v258 24.10.2009, 19:50
Цитата(BukaKoka @  24.10.2009,  13:23 Найти цитируемый пост)
Но мне надо програмно покрутить им как это сделать. Какие функции здесь нужны?

Я делал так (для Memo)
Код

    procedure WMMouseWheel(var Mes: TWMMouseWheel); message WM_MOUSEWHEEL;

------------------------------------------

{Реакция на прокрутку колесика мыши}
procedure TForm4.WMMouseWheel(var Mes: TWMMouseWheel);
var
  i,j,p: integer;
begin
  if IsCursor then
    {Если курсор находится над текстом, то начать прокрутку}
    begin
      {Определить направление прокрутки}
      if Mes.WheelDelta < 0 then
        p := SB_LINEDOWN else
        p := SB_LINEUP;
      {Определить диапазон прокрутки за один щелчок колесика - системная настройка}
      SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, @j, 0);
      {Если получено значение -1, то прокручивать на целую страницу}
      if j < 0 then
        begin
          j := 1;
          p := p + SB_PAGEUP;
        end;
      {Послать заданное количество сообщений на прокрутку}
      for i := 1  to j do
        Memo1.Perform(WM_VSCROLL,p,0);
    end;
end;

PS: IsCursor - функция для определения положения курсора, над Мемо он находится или нет 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)