Задать форму курсора в графическом режиме
На входе: AX = 0009h;
BX = номер позиции точки-указателя графического курсора (от -16 до 16);
CX = номер строки точки-указателя (от -16 до 16);
ES:DX = указатель на битовое изображение курсора.
На выходе: Регистры не используются.
С помощью этой функции программа, работающая в графическом режиме, может изменить форму курсора мыши и положение точки внутри изображения курсора, координаты которой используются в качестве координат курсора остальными функциями.
Регистры ES:DX указывают на область длинной 64 байта. Эта область состоит из двух массивов длиной по 32 байта. Первый массив представляет из себя логическую маску размером 16х16 битов, которая накладывается на участок видеопамяти с использованием логической операции "И". Второй массив - тоже маска размером 16х16, но она накладывается с использованием логической операции "Исключающее ИЛИ", инвертируя отдельные точки изображения.
Номера позиции и строки точки-указателя, устанавливаемые по умолчанию, равны 0 (BX=CX=0). Это соответствует верхней левой точке в изображении курсора. Значения BX=CX=15 соответствуют нижней правой точке.
Приведем исходный текст функции для изменения формы курсора из программы, составленной на языке Си:
/** *.Name ms_gform *.Title Задание формы курсора в графическом режиме * *.Descr Эта функция определяет форму курсора мыши * для графического режима. Дополнительно можно * задать положение точки-указателя, которая * соответствует координатам курсора. * *.Proto void ms_gform(int xt, int yt, char _far *form) * *.Params int xt - позиция точки указателя; * int yt - номер строки точки-указателя; * char *form - указатель на массив, описывающий * курсор. * *.Return Ничего * *.Sample ms_samp5.c **/
#include <dos.h> #include <conio.h>
union REGS reg; struct SREGS segregs;
void ms_gform(int xt, int yt, char _far *form) {
reg.x.ax = 9; reg.x.bx = xt; reg.x.cx = yt; reg.x.dx = FP_OFF(form); segregs.es = FP_SEG(form);
int86x(0x33,®,®,&segregs); }
Мы подготовили пример программы, изменяющий форму курсора в графическом режиме:
#include <dos.h> #include <stdio.h> #include <conio.h> #include "sysp.h"
union REGS reg;
char form[64] = {
// Массив маски по "И"
255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255, 255,255,
// Массив маски по "Исключающее ИЛИ"
127,254, 127,254, 127,254, 127,254, 127,254, 127,254, 127,254, 0,0, 0,0, 127,254, 127,254, 127,254, 127,254, 127,254, 127,254, 127,254, };
void main() {
int botm, i; MOUSE_STATE state; unsigned old_videomode, new_videomode; char buf[20], *bufptr;
// Определяем текущий видеорежим
reg.x.ax = 0x0f00; int86(0x10, ®, ®); old_videomode = reg.h.al;
// Устанавливаем новый видеорежим:
// Устанавливаем максимально допустимую длину строки
buf[0] = 10; printf("\nВведите десятичный номер видеорежима: "); bufptr = cgets(buf);
// Преобразуем введенное число к формату int
new_videomode = atoi(bufptr);
reg.h.ah = 0; reg.h.al = new_videomode; int86(0x10, ®, ®);
// Инициализируем мышь
if(!ms_init(&botm)) { printf("\nМышь не установлена"); exit(-1); }
// Задаем новую форму для курсора мыши
ms_gform(0,0, &form[0]);
// Включаем курсор
ms_on();
getch();
ms_off();
reg.h.ah = 0; reg.h.al = old_videomode; int86(0x10, ®, ®); }