Título: Programando com o Mouse
Linguagem: C/C++
S.O.: DOS
Autor(es): Wenderson Teixeira
Com as interfaces gráficas tornando-se cada vez mais populares,
hoje em dia é muito comum os micros possuirem Mouse ou outro
dispositivo apontador, como TouchPad ou TrackBall, coisas
extremamente raras na época dos antigos micros XT e AT286.
Muitas vezes quando fazemos programas DOS, queremos tentar permitir ao
usuário uma interface de fácil utilização, o que não é nada fácil em se
tratando de DOS, porém, ainda assim podemos tentar usufruir desse recurso
simples mas muito útil, o Mouse.
Uma breve explicação, o Mouse possui um software controlador
fornecido pelo fabricante, que é o programa responsável pela
interface entre o seu programa e o hardware, esse controlador comunica-se
com o sistema através da interrupção 33h do DOS, e todos os serviços do Mouse
podem ser acessados através dela, por isso você precisará desse controlador para acessar
o Mouse, rodando em uma janela DOS dentro do Windows 95, o
próprio Windows se encarrega de controlar o Mouse, mas no
DOS ou no modo MS-DOS do Windows 95, você deve se certificar de que
o controlador esteja carregado.
Apresentamos aqui uma tabela com os principais serviços do Mouse:
Principais Serviços do Mouse | ||
---|---|---|
Entrada | Saída | Descrição |
AX = 0 | AX = status
BX = botões |
Testa se existe um Mouse presente e o inicializa. Retorna em AX 0 se houver erro e FFFFh se bem sucedido Retorna em BX número de botões no Mouse |
AX = 1 | - | Mostra o cursor do Mouse |
AX = 2 | - | Esconde o cursor do Mouse |
AX = 3 | BX = botão
CX = x DX = y |
Testa se existe um botão pressionado e em
que posição da tela o cursor do Mouse está.
Retorna em BX o botão pressionado (0 - nenhum, 1 - esquerdo, 2 -
direito, 4 - central), em CX e DX, as posições x e y do cursor
respectivamente.
Obs.: Caso mais de um botão esteja pressionado o resultado será a soma dos valores de cada botão, por isso, para se testar deve-se fazer uma operação OR com o botão que se deseja testar. |
AX = 4 CX = x DX = y |
- | Seta posição do Mouse |
AX = 5 BX = botão |
AX = status BX = contagem CX = x DX = y |
Retorna o número de vezes em que um botão foi pressionado e a posição desde a última chamada desta função, retorna também o status dos botões |
AX = 6 BX = botão |
AX = status BX = contagem CX = x DX = y |
Retorna o número de vezes em que um botão foi liberado e a posição desde a última chamada desta função, retorna também o status dos botões |
AX = 7 CX = X mínimo DX = X máximo |
- | Seta os limites horizontais do Mouse |
AX = 8 CX = Y mínimo DX = Y máximo |
- | Seta os limites verticais do Mouse |
Segue aqui o código fonte que implementa algumas das funções descritas na tabela acima.
Mouse.h
#ifndef _MOUSE_H
#define _MOUSE_H
#include <dos.h>
#define BUTTONNONE 0
#define BUTTONLEFT 1
#define BUTTONRIGHT 2
#define BUTTONCENTER 4
#define MouseFunction(i) \
r.x.ax = i;
\
int86(0x33, &r, &r);
/* Funcoes do mouse */
int MouseInit();
void MouseShowCursor();
void MouseHideCursor();
int MouseButtonPressed(int* x, int* y);
#endif
Mouse.cpp
#include "mouse.h"
/* Funcoes do mouse //////////////////////////////////////////////////////////*/
/* Inicializa o mouse */
int MouseInit()
{
union REGS r;
MouseFunction(0);
return r.x.ax;
}
/* Mostra o cursor do mouse */
void MouseShowCursor()
{
union REGS r;
MouseFunction(1);
}
/* Esconde o cursor do mouse */
void MouseHideCursor()
{
union REGS r;
MouseFunction(2);
}
/* Retorna qual botao do mouse foi acionado e em que posicao da tela */
int MouseButtonPressed(int* x, int* y)
{
union REGS r;
MouseFunction(3);
*x = r.x.cx / 8 + 1;
*y = r.x.dx / 8 + 1;
return r.x.bx;
}
/*////////////////////////////////////////////////////////////////////////////*/