Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с мышкой в 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
}; 

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
49K
14 апреля 2009 года
Inquizitor
0 / / 14.04.2009
Мне нравитсяМне не нравится
9 мая 2009, 18:11:22
А можно функцию создать, что значение boolean возвращала, если какая-нибудь клавиша была нажата? А ещё лучше, что бы значение типа int.
int BottonPressed(); - если правая клавиша была нажато, то -1, если левая то 1, если никакой то 0;
??
2.
Аноним
Мне нравитсяМне не нравится
24 сентября 2005, 14:15:14
Мне понравилас ваш коментари!.
Как можно бол ше давай таких хорошей информации.
3.
Аноним
Мне нравитсяМне не нравится
28 июня 2005, 01:53:33
Хороший док, только не все функции.
А зачем тебе *.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
Отличный док, хотя и требуются неплохие знания Ассемблера.... :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог