CFA LogoCFA Logo Computer
Новости Статьи Магазин Драйвера Контакты
Новости
RSS канал новостей
В конце марта компания ASRock анонсировала фирменную линейку графических ускорителей Phantom Gaming. ...
Компания Huawei продолжает заниматься расширением фирменной линейки смартфонов Y Series. Очередное ...
Компания Antec в своем очередном пресс-релизе анонсировала поставки фирменной серии блоков питания ...
Компания Thermalright отчиталась о готовности нового высокопроизводительного процессорного кулера ...
Компания Biostar сообщает в официальном пресс-релизе о готовности флагманской материнской платы ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2003 ГОД

Мысли о Паскале

Владислав ДЕМЬЯНИШИН nitromanit@mail.ru

Продолжение, начало см. в МК №46, 51-52, 4, 6-7, 10, 12-13, 16-18, 22, 24, 29, 34, 41, 46, 4, 6, 17, 21, 23, 28, 30 (165, 170-171, 175, 177-178, 181, 183-184, 187-189, 193, 195, 200, 205, 212, 217, 227, 229, 240, 244, 246, 251, 253).

Спрашивали? Отвечаю…

Дружба с Микки Маусом

Продолжаем тему работы на Паскале с манипулятором «мышь».

Осталось рассмотреть две немаловажные процедуры, которые помогут настраивать область перемещения курсора мыши в зависимости от разрешения экрана. Все дело в драйвере мыши, который предполагает, что по умолчанию установлено разрешение 640400, то есть если на самом деле режим экрана будет с разрешением 640480, то вертикальные координаты курсора мыши будут варьироваться в пределах 0..399, а нижние 80 строк будут для него недоступны. Или если ширина экрана 800 точек, то будут доступны лишь столбцы 0..639, а правые столбцы — 640..799 — нет. Надо добавить, что в текстовом режиме, например 8025, реальное пиксельное разрешение считается 640x400 (размер символа 8x16). А так как текстовые режимы VESA имеют большее разрешение, соответственно, понадобится корректировать область перемещения курсора мыши.

Чтобы откорректировать область перемещения курсора, нужно просто установить минимальные и максимальные значения по горизонтали и вертикали в соответствии с экранным разрешением, будь то текстовый или графический режим. Это можно сделать при помощи процедур Ms_SetMinMaxX и Ms_SetMinMaxY. Первая устанавливает диапазон перемещения курсора по горизонтали, то есть ограничивает его движение экранными столбцами Min..Max включительно. Для этого регистр CX загружается параметром Min, а регистр DX —Max и вызывается функция 7 драйвера.

Аналогично действует процедура Ms_SetMinMaxY, но применительно к вертикальной области перемещения курсора, и вызывает функцию 8 драйвера.

Хотя драйвер мыши предоставляет гораздо больший функциональный набор, я могу сказать, что рассмотренных функций вполне достаточно, чтобы осуществить удобный интерфейс разрабатываемой программы. Следует учесть, что данный модуль MSMOUSE является универсальным. Т.е. содержит все основные возможности общения с мышью. Для обеспечения работы с мышью в конкретных текстовых или графических режимах следует создать модуль-надстройку, переопределив некоторые подпрограммы в соответствии с условиями работы. Сейчас мы этим и займемся.

Поддержка мыши в текстовых режимах VESA

Ввиду того, что драйвер мыши не знает, как корректно перемещать и отображать курсор в текстовых режимах VESA, возникает необходимость отключить его и вместо него эмулировать, инвертируя атрибут символа в позиции курсора. Помимо этого, драйвер мыши всегда принимает и возвращает положение курсора в экранных пикселях (точках), что применительно к тестовому режиму не очень удобно. Поэтому создадим небольшой модуль-надстройку TXTMOUSE.PAS, который будет обеспечивать нормальную работу с интерфейсом мыши в текстовых режимах, рассмотренного ранее модуля VESACRT. Начнем, как обычно, с заголовка Unit. В объявлении Uses сошлемся на модули VesaCrt и MsMouse, которые рассматривались в предыдущих статьях.

Объявим переменные Ms_Old_X и Ms_Old_Y для хранения устаревших координат курсора мыши и переменную Ms_Visible, отражающую видимость курсора мыши.

Работу программы, как и прежде, следует начинать с вызова функции Ms_Init модуля MSMOUSE, поэтому переопределять эту функцию нет необходимости. Но функцию установки текстового режима следует переопределить так, чтобы она устанавливала не только нужный текстовый режим по индексу, но и соответствующую область перемещения курсора мыши. Значит, функции Ms_SetTextMode — быть!

Ее можно вызывать вместо функции SetTextMode модуля VESACRT, где индексами шести текстовых режимов могут быть константы VesaDefault..Vesa132x60, объявленные в VESACRT (этот модуль уже рассматривался в МК №41, 6 (212, 229).

Далее опишем внутреннюю процедуру инвертирования атрибута символа в позиции экрана (X,Y), при этом бит мерцания затронут не будет, чтобы не нервировать пользователя. Процедура InvertSimbol нужна для рисования текстового курсора мыши в заданной позиции, а при перемещении курсора следует выполнить эту же процедуру для устаревших координат курсора мыши.

После инициализации мыши не следует вызывать процедуру Ms_CurShow, так как это будет мешать правильному отображению курсора мыши. Вместо нее объявим процедуру Ms_Show, которая правильно отобразит курсор в заданной позиции (X, Y). Координаты следует задавать в символах, а не в точках.

Если нужно выключить курсор мыши, то ни в коем случае нельзя вызывать процедуру Ms_CurHide. На смену ей объявим процедуру Ms_Hide, которая восстановит атрибут символа в устаревшей позиции курсора мыши.

Для определения положения курсора мыши в символьных позициях достаточно воспользоваться функциями Ms_GetX и Ms_GetY.

Если текст на экране долгое время остается неизменным, а курсор нужно перемещать в соответствии с его новыми координатами, то в некотором цикле следует вызывать процедуру Ms_CurMove, которая восстановит атрибут символа в устаревшей позиции курсора и отобразит курсор уже в новой позиции. Новые координаты (X,Y) следует задавать в символах.

И завершить модуль следует инициализацией переменных:

Хочу заметить, что если на экране постоянно перерисовываются некоторые строки, то при использовании процедуры Ms_CurMove будет наблюдаться шлейф в виде еще одного инвертированного символа в устаревшей позиции курсора мыши — процедура Ms_CurMove не подозревает, что текст в устаревшей позиции был обновлен и что его восстанавливать не нужно. Поэтому, если изображение на экране постоянно обновляется (весь экран), то лучше использовать процедуру Ms_Show, которая будет просто отображать курсор на экране. Вот код небольшой программы, которая иллюстрирует совместную работу модулей TXTMOUSE и VESACRT:

В данной программе текстовый курсор скрыт, но если в нем будет необходимость, его можно включить командой CursorShow, реализованной в модуле VESACRT. Также вместе с модулями VESACRT и TXTMOUSE можно использовать модуль KEYBOARD, который был рассмотрен в МК №17 (240).

Как вы могли заметить, в последнем примере после инициализации драйвера мыши для установки необходимого текстового режима используется функция Ms_SetTextMode модуля TXTMOUSE, а перед завершением программы выполняется функция SetTextMode модуля VESACRT. Это допустимо, так как не имеет значения, как будет установлен стандартный для MS-DOS текстовый режим 8025, потому что при установке этого режима драйвер мыши сам сможет корректно определить область перемещения курсора мыши. И все будет тип-топ :-).

Еще хочу обратить внимание на применение процедуры TextOut модуля VESACRT, которая в отличие от стандартной команды Writeln не способна преобразовывать числовое значение в текстовое представление, поэтому предварительно параметры Ms_GetX, Ms_GetY, Ms_Old_X, Ms_Old_Y и другие обрабатываются функцией IntToStr. Функция IntToStr использует стандартную процедуру

Str служит для преобразования численного значения в эквивалентное текстовое представление, после чего полученное строковое значение пригодно для вывода на экран процедурой TextOut.

Как видите, при помощи рассмотренных модулей легко можно заставить программу повиноваться пользователю. Как по мановению волшебной палочки — роль которой в данном случае исполняет манипулятор «мышь».

Исходный код модулей и примеров к ним можно с легкостью найти на вышеуказанном сайте. Там же можно скачать резидентную справочную систему Norton Guide, которая поможет узнать много интересного об устройстве ОС MS-DOS и драйверов к ней как на английском языке, так и на русском.

Мавр сделал свое дело. Мавр может уходить…

(Продолжение следует)

Литература

Диалоговая справочная система Norton Guide.

Рекомендуем ещё прочитать:






Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы или вычислите пример: *
captcha
Обновить





Хостинг на серверах в Украине, США и Германии. © sector.biz.ua 2006-2015 design by Vadim Popov