Подключение мыши в консоли Borland С++ 3.11 и Borland Pascal

ВНИМАНИЕ: Код приведен для Borland Pascal 5.5 и Borland C++ 3.11, поскольку на момент написания материала, именно эти среды были в области интересов автора. Автор не гарантирует работоспособность, полную или частичную, кода в других средах(Например, Ms VS или Qt).

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

С одной стороны - две кнопки(а иногда даже три, пять, семь и колесико;)) едва могут позволить сворачивать горы, с другой - контекстное меню по правой кнопке есть приятная мелочь, позволяющая добратся до часто использовающихся функций одним кликом. Особенно, если не использовать стандартное всплывающее меню предлагаемое ОС Windows, а, скажем, воспользоватся портированным из *nix Блэкбоксом с гибко настраиваимым меню под нужды любого пользователя. Но это из другой оперы и, пожалуй, об этом удобном менеджере я расскажу в следующий раз.

Получить курсор мыши - дело всего четырех строк:

а) Вариант для Borland Pascal. Не надо пробовать в Delphi:)

asm
mov ax,1
intr 33h
end;

б) Вариант для Borland С++ 3.11. Не надо пробовать в старших версиях.

asm{
mov ax,1
int 0x33
}

Выключить мышь таким же способом, только в ax пересылаем двойку, т.е.:

asm
mov
ax,2
intr 33h
end;

Незабываем подключать DOS:)

uses dos; и #include <dos.h> соответственно.

А будет ли работать мышь в графическом режиме? Разумеется! Координаты Х и У лежат в регистрах CX и DX соответственно. Снимать следует после следующего прерывания(приведу код для Borland C++ 3.11, перебросить на паскаль думаю не составит труда):

asm{
mov ax,3
int 0x33
}
///Получить значение Х можно так mov coordX,cx. Более удобный способ
///будет описан ниже.

Хочешь поупражнятся? Попробуй реализовать механизм Drag&Drop. Нарисуй, скажем, зеленый квадрат 50х50. И попробуй сделать так, чтобы можно было таскать этот объект по всему экрану зажав левую кнопку мыши. А отпустив кнопку, объект бросался там, где остановилась мышь.

Я сказал о нажатиях на кнопку мыши, теперь следует понять как понять, что нажата кнопка. Ты-то сразу сообразишь, что кнопка нажалась по характерному щелчку;) А вот компьютеру снова надо дать запрос на прерывание и снять показания.

asm{
mov ax,5
int 0x33
}

И начинаем смотреть, что в AL. Если AL = 1, то нажата левая кнопка мыши, если AL = 2, то правая, если AL = 0, то ничего не нажато. Кстати, отследить где же нажата была кнопка можно просто сняв тут же содержимое регистров CX и DX.

Теперь об обещанном способе попроще. Оказывается совсем необязательно использовать ассемблеровские вставки. Можно пользоватся уже созданными структурами в каждом из этих языков. И это нормально, ведь Borland Pascal к настоящим регистрам процессора совсем не пускает напрямую(это хорошо прежде всего для тебя:)), а Borland C++ не всегда дает ожидаемые результаты при работе ассемблеровских вставок(странно, но факт). Дабы не описывать все, что было выше, дам по одному примеру для рассматриваемых сред, а дальше ты проявишь смекалку и сообразишь:)

а) Для Borland Pascal действуем так:

uses dos; {работа прерываний тут}
var r:registers; {наш ключ к спасению:)}
rx,ry:integer;
begin
r.ax:=3; {захотели получить координаты нахождения}
intr($33,r);
rx:=r.cx; {координата X}
ry:=r.dx; {координата Y}
end

б) Для Borland C++ 3.11 чуточку иначе:

#include<dos.h> //обработка по-прежнему тут;)
REGPACK register_var;
int rx,ry;
void main()
{
register_var.r_ax = 3; //заносим в ax тройку
intr(0x33,&register_var); //выполняем прерывание
rx = register_var.r_cx; //и снимаем
ry = register_var.r_dx; //координаты
}

Конечно, когда за тебя уже все сделано в ОС, ты и не задумываешься, как это все работает и почему тормозит иногда;) Но сейчас-то ты знаешь, что ничего сложного в простоте.

P.S. Заинтересовался прерываниями? Классическим ассемблером? Нагугли книгу, Питер Абель - Ассемблер и программирование для IBM PC:)




Ссылки:

К содержанию

© Copyright 2004-2017 - CMS Made Simple
Сайт работает на CMS Made Simple version 1.4.1

© Все печеньки Break-people.ru принадлежат авторам проекта.

Яндекс цитирования Рейтинг@Mail.ru Яндекс.Метрика