С для профессиональных программистов

       

Ввод информации с помощью "мыши" в программе рисования.


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

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

Прежде, чем "мышь" будет включена как устройство ввода программу рисования, необходимо разработать две подпрограммы,

учитывающие специфику "мыши".  Первая  подпрограмма  -  wait_on()

позволяет  реализовать процесс ожидания отпускания (освобождения)

специфицированной клавиши пользователем.  Анализ  подобного  рода

имеет весьма большое значение, так как соответствующие прерывания

генерируются  постоянно,  пока   клавиша   не   нажата.   (Однако

невозможно  обеспечить  такое  мгновенное  нажатие на клавишу,  в

результате которого сформировалось бы лишь одно  прерывание).  Во

многих  подпрограммах  наоборот  важно  избежать такой ситуации и

поэтому в них каждое нажатие на клавишу генерирует  (точнее будет

сказать  кажется,  что  генерирует)  только одно прерывание за то

время, пока клавиша нажата. В соответствии с этим, ваша программа

должна   обращаться  к  фунции  wait_on(),  представленной  ниже,

непосредственно перед выполнением  и  после  того,  когда  нажата

соответствующая клавиша.

/* Возвращает 1, если специфицированная клавиша не нажата */



void wait_on(button)

int button;

if(button== LEFTB)

while(leftb_pressed());

else

while(rightb_pressed());

Макросы LEFTB и RIGHTB, представленные ниже, используются при обращении к wait_on().

#define LEFTB                     1

#define RIGHTB    2

Второй необходимой вам функцией является mouse_menu(). Эта функция отображает однострочное меню и позволяет пользователю осуществлять выбор из него элементов путем перемещения "мыши" на плоскости (и, соответственно, курсора "мыши" по экрану) и нажатия любой клавиши "мыши". Эта функция может работать только в 4


графическом режиме. Функции передается двумерный массив символов,

который   содержит   элементы   меню   (которые   может   выбрать

пользователь),  значение каждого элемента меню (его код),а  также

координаты  Х  и  У  отображения меню на экране.  Массив символов

определяет  максимальную  длину  каждого  элемента  меню   в   19

символов.   Функция   возвращает   в  качестве  результата  номер

выбранного пользователем элемента меню, начиная с 0, или -1, если

пользователь  не выбрал ни один из элементов меню.  Когда функция

начинает свою работу,  то она вначале вычисляет длину в  пикселах

(элементах растра) каждого элемента меню,  после чего резервирует

пространство по начальной и конечной  точке  растра  для  каждого

элемента  меню,  одновременно  запоминая эту информацию в массиве

len. (В четвертом графическом режиме каждый символ имеет высоту в

8 точек растра и ширину в 16 точек растра.) После этих вычислений, функция переходит в состояние ожидаения прерывания от клавиш "мыши". При этом осуществляется анализ нажата или нет клавиша "мыши" в момент нахождения ее курсора в области меню, и, если да, то в месте расположения какого элемента меню. Функция mouse_menu() приведена ниже.

/* Отображает однострочное меню для "мыши" и возвращает

код выбранного пользователем элемента меню                                                   */

mouse_menu(count, item, x, y)

int count;                                       /* количество элементов меню */

char item[][20];                                /* элементы меню */

int x, y;                                        /* позиции отображения */

int i, len[MENU_MAX][2], t;

int mousex, mousey;

goto_xy(x, y);

t = 0;

for(i=0; i<count; i++)

printf("%s   ", item[i]);

len[i][0] = t;

/* каждый символ имеет ширину в 16 точек растра */ len[i][1] = t + strlen(item[i])*16;

t = len[i][1] + 32; /* добавляется два пробела между элементами меню */

/* ожидание выбора пользователем элемента меню */

do

if(rightb_pressed() || leftb_pressed()) break;

 while(!kbhit());

/* ожидание нажатия клавиши */

while(rightb_pressed() || leftb_pressed());

/* получить текущую позицию курсора "мыши" */

mouse_position(&mousex, &mousey);

/* анализируется, находится ли курсор в пределах меню */

if(mousey>=0 && mousey<8)  /* символ имеет высоту

8 точек растра */ for(i=0; i<count; i++)

if(mousex>len[i][0] && mousex<len[i][1])

return i;

return i;

returtn -1; /* выбор из меню не осуществлялся */


Содержание раздела