Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
54
Добавлен:
03.06.2014
Размер:
2.63 Mб
Скачать

Задать форму курсора в графическом режиме

С помощью функции 09h программа, работающая в графическом режиме, может изменить форму курсора мыши и положение точки внутри изображения курсора, координаты которой используются в качестве координат курсора остальными функциями.

Регистры на входе:

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 соответствуют нижней правой точке.

ПрограммаMsgform

Мы подготовили исходный текст программы MSGFORM, изменяющий форму курсора в графическом режиме (листинг 3.3).

Листинг 3.3. Файлmsgform\msgform.c

// =====================================================

// Изменение формы курсора в графическом режиме

//

// (C) Фролов А.В, 1997

//

// E-mail: frolov@glas.apc.org

// WWW: http://www.glasnet.ru/~frolov

// или

// http://www.dials.ccas.ru/frolov

// =====================================================

#include <dos.h>

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

union REGS reg;

void ms_gform(int xt, int yt, char _far *form);

unsigned 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

};

int main(void)

{

unsigned old_videomode, new_videomode;

char buf[20], *bufptr;

// Определяем текущий видеорежим

reg.x.ax = 0x0f00;

int86(0x10, &reg, &reg);

old_videomode = reg.h.al;

// Устанавливаем новый видеорежим

buf[0] = 10;

printf("Enter new video mode: ");

bufptr = cgets(buf);

new_videomode = atoi(bufptr);

reg.h.ah = 0;

reg.h.al = new_videomode;

int86(0x10, &reg, &reg);

// Инициализируем мышь

reg.x.ax = 0;

int86(0x33, &reg, &reg);

if(reg.x.bx == 0)

{

printf("Mouse not found\n");

return -1;

}

// Задаем новую форму для курсора мыши

ms_gform(0,0, &form[0]);

// Включаем курсор

reg.x.ax = 1;

int86(0x33, &reg, &reg);

getch();

reg.h.ah = 0;

reg.h.al = old_videomode;

int86(0x10, &reg, &reg);

return 0;

}

void ms_gform(int xt, int yt, char _far *form)

{

struct SREGS segregs;

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,&reg,&reg,&segregs);

}

Соседние файлы в папке несколько программ