- •3.1. Как устроена мышь? Оптико-механические мыши
- •Оптические мыши
- •3.2. Драйверы мыши в ms-dos
- •3.3. Прерывание для обслуживания мыши
- •3.3.1. Инициализация мыши
- •3.3.2. Включить курсор мыши
- •3.3.3. Выключить курсор мыши
- •3.3.4. Определить положение курсора
- •3.3.5. Установить курсор
- •3.3.6. Определить положение курсора при нажатии клавиши
- •3.3.7. Определить положение курсора при отпускании клавиши
- •3.3.8. Задать диапазон движения курсора по горизонтали
- •3.3.9. Задать диапазон движения курсора по вертикали
- •3.3.10. Задать форму курсора в графическом режиме
- •3.3.11. Задать форму курсора в текстовом режиме
- •3.3.12. Определить содержимое счетчиков перемещения
- •3.3.13. Установить драйвер событий
- •3.3.14. Включить эмуляцию светового пера
- •3.3.15. Выключить эмуляцию светового пера
- •3.3.16. Задать скорость перемещения курсора мыши
- •3.3.17. Установить область исключения для курсора
- •3.3.18. Задать увеличенный графический курсор (pc mouse)
- •3.3.19. Определить порог удвоения скорости
- •3.3.20. Заменить драйвер событий
- •3.3.21. Определить размер буфера состояния драйвера
- •3.3.22. Сохранить состояние драйвера
- •3.3.23. Восстановить состояние драйвера
- •3.3.24. Установить альтернативный драйвер событий
- •3.3.25. Получить адрес альтернативного драйвера событий
- •3.3.26. Установить чувствительность мыши
- •3.3.27. Определить чувствительность мыши
- •3.3.28. Установить частоту прерываний для Inport Mouse
- •3.3.29. Установить номер видеостраницы
- •3.3.30. Определить номер видеостраницы
- •3.3.31. Отключить драйвер мыши
- •3.3.32. Восстановить драйвер мыши
- •3.3.33. Сбросить драйвер мыши
- •3.3.34. Определить тип мыши
3.3.11. Задать форму курсора в текстовом режиме
На входе: AX = 000Ah;
BX = тип курсора:
0 - определяемый программно;
1 - определяемый аппаратно;
CX = маска экрана (для BX=0) или
начальная строка курсора (для BX=1);
DX = маска курсора (для BX=0) или
конечная строка курсора (для BX=1).
На выходе: Регистры не используются.
С помощью этой функции программа может изменять форму курсора мыши в текстовом режиме.
В зависимости от содержимого регистра BX драйвер мыши использует курсор, определяемый аппаратными средствами, либо курсор, определяемый программно. По умолчанию используется "программный курсор", который отображается в виде символа с инвертированным значением атрибута. Курсор, сформированный аппаратными средствами, выглядит аналогично обычному текстовому курсору, его форма - прямоугольник. Размер этого прямоугольника можно задавать при помощи регистров CX и DX.
Для курсора, определяемого программно, вначале выполняется операция логического "И" над содержимым видеопамяти в том месте, куда указывает курсор, и маской экрана. Затем выполняется операция "Исключающее ИЛИ" с маской курсора.
Младший байт масок соответствует ASCII-коду символа, старший - это байт атрибута символа.
Значения, используемые по умолчанию - BX=7700h, CX=FFFFh.
Если вам надо изменить цвет курсора, не меняя его форму, задайте CX=00FFh, BX=xx00h, где xx определяет цвет (смотри описание формата байта атрибутов в третьем томе книги).
Приведем функцию для изменения формы курсора в текстовом примере и программу, создающую курсор в виде вертикальной стрелки, направленной вверх на синем фоне:
/**
*.Name ms_tform
*.Title Задание формы курсора в текстовом режиме
*
*.Descr Эта функция определяет форму курсора мыши для
* текстового режима.
*
*.Proto void ms_tform(int type, int mask1, int mask2)
*
*.Params int type - тип курсора:
* 0 - программный, 1 - аппаратный;
* int mask1 - AND-маска экрана
* или первая строка аппаратного курсора
* int mask2 - XOR-маска курсора
* или последняя строка аппаратного курсора
*
*.Return Ничего
*
*.Sample ms_samp6.c
**/
#include <dos.h>
#include <conio.h>
union REGS reg;
void ms_tform(int type, int mask1, int mask2) {
reg.x.ax = 0xA;
reg.x.bx = type;
reg.x.cx = mask1;
reg.x.dx = mask2;
int86(0x33,®,®);
}
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include "sysp.h"
union REGS reg;
void main() {
int botm, i;
MOUSE_STATE state;
// Инициализируем мышь
if(!ms_init(&botm)) {
printf("nМышь не установлена");
exit(-1);
}
// Задаем новую форму для курсора мыши
ms_tform(0, 0, 0x1418);
// Включаем курсор
ms_on();
getch();
ms_off();
}