Найти в Дзене
Sevens Sevensis

Пример использования скроллера Genius NetScroll в среде MS-DOS.

DOS умер? Ничего подобного! Никто ему еще смертного приговора не подписывал. А то обстоятельство, что власть над PC захватили разномастные версии Windows, только укрепляет дух подполья. Вот только без поддержки современных аппаратных средств DOS-программерам будет довольно сложно писать конкурентноспособные продукты. Вот я и решил внести посильный вклад в наше правое дело.
   Например, такое явление, как плавный скроллинг. В современных программах под Windows он частенько дается на откуп драйверу мыши, ежели оная мышь, как говорят, "с колесом". А что делается с этим колесом вне Windows? Неужто нельзя каким-либо образом спросить напрямую у устройства, чего это у него там крутится?
   Естественно, можно! Не Святой же Дух сообщает системе, как именно пользователь обращается с тем или иным устройством. Кабель-то у мыши один. И подключен к одному порту. В моем случае - это COM1 (03F8h). Круче было бы, конечно, для PS/2, но та машина, на которой я это писал - ноутбук AST 386SX2-25. Даже б

DOS умер? Ничего подобного! Никто ему еще смертного приговора не подписывал. А то обстоятельство, что власть над PC захватили разномастные версии Windows, только укрепляет дух подполья. Вот только без поддержки современных аппаратных средств DOS-программерам будет довольно сложно писать конкурентноспособные продукты. Вот я и решил внести посильный вклад в наше правое дело.
   Например, такое явление, как плавный скроллинг. В современных программах под Windows он частенько дается на откуп драйверу мыши, ежели оная мышь, как говорят, "с колесом". А что делается с этим колесом вне Windows? Неужто нельзя каким-либо образом спросить напрямую у устройства, чего это у него там крутится?
   Естественно, можно! Не Святой же Дух сообщает системе, как именно пользователь обращается с тем или иным устройством. Кабель-то у мыши один. И подключен к одному порту. В моем случае - это COM1 (03F8h). Круче было бы, конечно, для PS/2, но та машина, на которой я это писал - ноутбук AST 386SX2-25. Даже без PCMCIA. (Кроме шуток, я на этой технике Free-direction texture mapping делал. На TPascal 6.0).
   И вот, что выяснилось. Даже с не совсем подходящим драйвером мышь Genius NetScroll+ вполне четко пишет в COM1 данные о направлении вращения колеса. 15 (dec), если вверх и 1 - вниз. Вот, вроде бы и все - бери эти данные, да пользуйся.
   Но не тут-то было. Только я попробовал вставить этот фокус в свой проект, как наткнулся на два безобразия.
   Безобразие первое. Так как ни 1, ни 15 не являются исключительными индикаторами вращения именно колеса, а иногда генерируются и счетчиком позиций, частенько случалось, что лезу я куда-нибудь в меню, а у меня текст в окошке начинает крутиться, как бешеный. Для ликвидации этой проблемы возможны два подхода:
  1) проверять, не двигается ли при получении этих цифр мышь, и
  2) вести скроллинг только с нажатой кнопкой+колесо.
   Первый подход хорош, но не всегда срабатывает. Во-первых, никто не гарантирует, что юзер не будет смещать мышку в момент прокрутки, а значит, работать она будет с перебоями. А во-вторых, то ли я тупой ламер, то ли черт знает что, но у меня этот подход вообще не прошел. Как бесился скроллинг, так и не перестал. Так что, плюнул я на это и взял за основу второй вариант. Индикатором скроллинга я выбрал правую кнопку, и получилось все недурно (в конце статьи я привел выдранный с кровью кусок из своего проекта, отвечающий как раз за обработку колеса).
   Безобразие второе. По каким-то темным и неизвестным причинам мой драйвер мыши (gmouse.com) совершенно не хочет замечать того момента, когда я уже давным-давно отпустил колесо, закурил, выпил три бутылки пива, сходил к девчонкам и заснул. Мышь все это время продолжает подавать в COM1 или 1 или 15! Кстати сказать, при движении, кажется, эти числа суммируются с показаниями счетчика координат и индикаторами кнопок (только что пришло в голову, еще не проверял). Но это так, к слову. Но над этим моментом я особо не раздумывал - в моей программе скроллинг заканчивается сразу же после отпускания правой кнопки. Так что вот еще пища для раздумий. Может быть, стоит попробовать периодически сбрасывать состояние порта и смотреть, что за этим последует?
   Таким вот образом здесь рассмотрена возможность осуществления любых операций, для которых удобно использовать скроллер. Причем, исключительно под управлением ОС MS-DOS.
Happy coding!

   А теперь привожу тот самый кусок, выдернутый из программы без тестирования и гарантий. Кроме того, в программировании я профессионалом не являюсь (аптекарь по образованию), так что, если что не так, нижайше прошу прощения...

  ...

   Mouse.Handle;
   If (Port[$3F8]=15) And (Mouse.Buttons=2) Then Begin
     Mouse.Hide;
     If VScrolled>0 Then VScrolled:=VScrolled-1;
     Draw(1,1);
     StoreDOSScreen(CScr);
     Mouse.Show;
   End;
   If (Port[$3F8]=1) And (Mouse.Buttons=2) Then Begin
     Mouse.Hide;
     If VScrolled<MaxVScroll-H+2 Then VScrolled:=VScrolled+1;
     Draw(1,1);
     StoreDOSScreen(CScr);
     Mouse.Show;
   End;

  ...
   Где Mouse - это управляемый int 33h объект, отражающий все необходимые функции мыши. Так как он здесь представлен почти человеческим языком, пояснять, я думаю, не стоит. Ключевой момент - опрос порта, одновременно с опросом состояния правой кнопки (значение 2). А то, что заключено в программных скобках Begin...End, есть та самая кровь, с которой я вырезал этот фрагмент, и отвечает она за изменение поля VScrolled объекта окна. Т.е., как раз и обеспечивает скроллинг в зависимости от направления вращения колеса. Надеюсь, сработает и у вас.