Работа с мышкой в DOS
Описуха
- mymouse.cpp - функции для работы с мышкой
- mymouse.h - прототипы функций
- mforms.h - формы курсора мыши (3 штуки: стрелка, крест, прямоугольник)
Не забудьте включить файл mymouse.cpp в ваш проект!!!
Исходники
Файл mymouse.h
// Структура состояния мыши struct MouseState { int x,y; int buttons; }; int ResetMouse(); void ShowMouseCursor(); void HideMouseCursor(); void MoveMouseCursor(int x,int y); void ReadMouseState(MouseState &s); void SetMouseHoriz(int min,int max); void SetMouseVert(int min,int max); void SetMouseShape(int mask[32],char x,char y); int MouseInArea(int x1,int y1,int x2,int y2); void SetMouseArea(int x1,int y1,int x2,int y2); Файл mymouse.cpp #include <dos.h> #include "mymouse.h" int ResetMouse() { _asm { xor ax,ax int 0x33 } return (_AX==0xFFFF); } // Функция отображает курсор мыши void ShowMouseCursor() { _asm{ mov ax,1 int 0x33 } } // Функция скрывает курсор мыши void HideMouseCursor() { _asm{ mov ax,2 int 0x33 } } // Функция устанавливает курсор мыши в коорд. X,Y void MoveMouseCursor(int x,int y) { _asm{ mov ax,4 mov cx,x mov dx,y int 0x33 } } // Функция читает состояние мыши // Позиция, состояние кнопок void ReadMouseState(MouseState &s) { _asm{ mov ax,3 int 0x33 } #if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) _asm{ push es push di les di,dword ptr s mov es:[di],cx // X mov es:[di+2],dx // Y mov es:[di+4],bx // button pop di pop es } #else // Короткий адрес (без сегмента) _asm{ push di mov di,word ptr s mov [di],cx mov [di+2],dx mov [di+4],bx pop di } #endif } // Функция устанавливает диапазон перемещения мыши по горизонтали void SetMouseHoriz(int min,int max) { _asm{ mov ax,7 mov cx,min mov dx,max int 0x33 } } // Функция устанавливает диапазон перемещения мыши по вертикали void SetMouseVert(int min,int max) { _asm{ mov ax,8 mov cx,min mov dx,max int 0x33 } } // Ф-я устанавливает форму курсора мыши void SetMouseShape(int mask[32],char x,char y) { union REGS inregs,outregs; struct SREGS segregs; inregs.x.ax=0x9; inregs.x.bx=x; inregs.x.cx=y; inregs.x.dx=FP_OFF(mask); segregs.es=FP_SEG(mask); int86x(0x33,&inregs,&outregs,&segregs); } // 1 - Если мышь нах-ся в указанной области int MouseInArea(int x1,int y1,int x2,int y2) { MouseState ms; ReadMouseState(ms); if(ms.x>=x1 && ms.x<=x2 && ms.y>=y1 && ms.y<=y2) return(1); else return(0); } // Установка диапазано перемещения мыши void SetMouseArea(int x1,int y1,int x2,int y2) { SetMouseHoriz(x1,x2); SetMouseVert(y1,y2); } Файл mforms.h // Курсор - перекрестие int mc_cross[32]={ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, 0xFFFF,0xFFFF,0xFFFF,0xFFFF, // AND 0x0100,0x0100,0x0100,0x0000,0x0100,0x0100,0x0000, 0xED6E,0x0000,0x0100,0x0100,0x0000,0x0100,0x0100, 0x0100,0x0000 // XOR }; // Курсор - стрелка int mc_arrow[32]={ 0x3FFF,0x1FFF,0x0FFF,0x07FF,0x03FF, 0x01FF,0x00FF,0x007F,0x003F,0x01FF, 0x20FF,0x707F,0xF03F,0xF83F,0xFC3F,0xFE7F, // AND 0x0000,0x4000,0x6000,0x7000,0x7800, 0x7C00,0x7E00,0x7F00,0x7800,0x4800, 0x0C00,0x0600,0x0700,0x0380,0x0180, // XOR }; // Курсор - прямоугольник int mc_rect[32]={ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, 0xFFFF, // AND 0x0000,0x0000,0x3FFC,0x2004,0x2004, 0x2004,0x2004,0x2004,0x2004,0x2004, 0x2004,0x2004,0x2004,0x3FFC,0x0000, 0x0000 // XOR };
Оставить комментарий
Комментарии
1.
9 мая 2009, 18:11:22
А можно функцию создать, что значение boolean возвращала, если какая-нибудь клавиша была нажата? А ещё лучше, что бы значение типа int.
int BottonPressed(); - если правая клавиша была нажато, то -1, если левая то 1, если никакой то 0;
??
int BottonPressed(); - если правая клавиша была нажато, то -1, если левая то 1, если никакой то 0;
??
2.
24 сентября 2005, 14:15:14
Мне понравилас ваш коментари!.
Как можно бол ше давай таких хорошей информации.
Как можно бол ше давай таких хорошей информации.
3.
28 июня 2005, 01:53:33
Хороший док, только не все функции.
А зачем тебе *.cpp? все функции без прототипов размести в *.h
"коментарии к строкам" - какие коментарии? используются только вызовы стандартных функций дров.
to zAe: знания asm'а минимальные! достаточно прочитать 10 страниц самоучителя :) и вообще требуются ли они?
А зачем тебе *.cpp? все функции без прототипов размести в *.h
"коментарии к строкам" - какие коментарии? используются только вызовы стандартных функций дров.
to zAe: знания asm'а минимальные! достаточно прочитать 10 страниц самоучителя :) и вообще требуются ли они?
4.
11 мая 2005, 15:12:17
Всё просто и очевидно ничего лишнего мне нравится
5.
18 апреля 2005, 23:36:52
Док велике спасибі тобі. Ти поміг вигрібти з великої ями
6.
17 февраля 2005, 21:34:19
Полезный док, согласен. НО, например, наш препод по системному программному обеспечению тебя бы убил за такой исходник! Он требует комментарии в КАЖДОЙ строке. Студенты часто ругаются с ним (в частности я ), но сейчас я его понял. Чтобы разобраться во всем этом, придется голову поломать. А тупо копировать функции я не хочу. Поэтому на будущее - оставляй комментарии хотя бы в ассемблерных вставках...
7.
11 ноября 2004, 20:53:59
Хорошая статья. Мне понравилась.
8.
20 сентября 2004, 19:55:34
А вот хотелось бы расшифровку состояний мышки в структуре MouseState. Какие именно значения принимает buttons при нажатии/отпускании кнопок?
9.
9 июля 2004, 13:40:40
Отличный док, хотя и требуются неплохие знания Ассемблера.... :)