
- •Введение
- •1. Общие принципы создания интерфейса
- •1.1. Эргономические характеристики интерфейса
- •1.2. Составные части интерфейса
- •1.3. Виды диалога
- •1.4. Процессы ввода – вывода
- •1.5. Методы разработки подпрограмм нижнего уровня
- •Int int86(int num, union regs *inregs, union regs *outregs);
- •Void pokeb(unsigned seg, unsigned off, char value);
- •Int getch();
- •2. Исчезающее меню
- •2.1. Алгоритм создания исчезающего меню
- •2.2. Сохранение и восстановление экрана
- •2.3. Вывод меню и рамки
- •2.4. Определение выбора пользователя
- •2.5. Подпрограмма исчезающего меню
- •3. Иерархическое меню
- •3.1. Фреймы меню
- •3.2. Подпрограмма активизации меню
- •3.3. Организация иерархического меню
- •3.4. Всплывающие окна
- •Void window(int num);
- •Void deactivate(int num);
- •4. Графический интерфейс
- •4.1. Организация меню в графическом режиме
- •Void outtextxy ( int X, int y, char *s);
- •4.2. Организация графического диалога
- •4.3. Особенности графического режима
- •Void putpixel (int color, int X, int y)
- •4.4. Форматы хранения графических файлов
- •5. Прикладной интерфейс для windows
- •5.1. Приложения Windows
- •5.2. Каркас приложения
- •5.3. Обработка сообщений в системе Windows
- •Int ReleaseDc(hwnd hwnd, hdc hdc);
- •Int MessageBox(hwnd hwnd, lpcstr lpText, lpcstr lpCaption, uint wMbType);
- •Int response;
- •5.4. Меню в системе Windows
- •5.5. Диалоги в системе Windows
- •Int DialogBox(hinstance hThisInst,
- •5.6. Пример программы, использующей список и окно ввода
- •6. Лабораторная 1
- •Варианты заданий
- •Пример выполнения задания
- •7 Лабораторная 2
- •Варианты заданий
- •Пример выполнения задания
Void putpixel (int color, int X, int y)
{
unsigned addr = x/8 + y*80;
char b, mask = 0x80>>(x&7);
outportb (0x3CE, 1);
outportb (0x3CF, 0xF); // регистр 1 = 0Fh
outportb (0x3CE, 0);
outportb (0x3CF, color); // регистр 0 = color
outportb (0x3CE, 8);
outportb (0x3CF, mask); // регистр 8 = маска
b = peekb (0xA000, addr); // чтение в регистры защелки
pokeb (0xA000, addr, b); // запись любого байта
outportb (0x3CE, 8);
outportb (0x3CF, 0xFF); // восстановление регистра 8
outportb (0x3CE, 1);
outportb (0x3CF, 0); // восстановление регистра 1
}
-
Р
егистр 1 равен 0. Значения пикселов являются результатом операции, указанной в битах 4-3 регистра 3, над байтом процессора и байтами регистров защелки. Операция производится над байтом процессора и каждым из регистров защелки, полученные результаты записываются в соответствующую битовую плоскость. Биты, имеющие нулевые значения в регистре маски, записываются без изменения. Например, байт процессора с = 00100111, записывается в некоторый байт видеопамяти, имеющий адрес Mem, с помощью команды *Mem = c. Преобразование и запись в битовые плоскости показаны на рис. 4.5:
Режим записи 1. Содержимое четырех регистров защелки копируется в битовые плоскости по указанному адресу. Копируется сразу 8 пикселов. Байт процессора роли не играет. Регистры масок и режима не действуют.
Пример 3. Напишем подпрограмму копирования прямоугольной области экрана для случая, когда прямоугольник не пересекается со своим образом и имеет координаты вершин, кратные 8:
void copy (int x1, int y1, int x2, int y2, int xnew, int ynew)
// координаты вершин и координаты левого верхнего угла образа
{
unsigned char *v = (char *)0xA0000000;
unsigned SrcAddr, DstAddr;
int Cols, NextRow, x, y;
SrcAddr = y1*80 + (x1>>3); // начальный адрес
DstAddr = ynew*80 + (xnew>>3);
Cols = (x2>>3)-(x1>>3); //число столбцов
NextRow = 80 - Cols; // разница между адресами последнего байта
// строки и первого байта следующей строки
SetRWMode(0,1); // режим чтения - 0, записи - 1
for(y=y1; y<=y2; y++)
{
for(x=1; x<=Cols; x++)
{
*(v+DstAddr) = *(v+SrcAddr);
DstAddr++; SrcAddr++;
}
SrcAddr += NextRow; // переход на
DstAddr += NextRow; // следующую строку
}
SetRWMode(0,1); // восстановление режимов
}
Режим записи 2. Младшие четыре бита байта процессора играют роль, аналогичную той, которую играл регистр 0 установки/сброса в режиме записи 0 в случае, когда регистр 1 был равен 0Fh. Битовые плоскости модифицируются путем объединения значений пикселов в регистрах защелки со значением пиксела, заданного байтом процессора. Содержимое регистров двоичной маски показывает, какие биты из восьми будут модифицированы.
Пример 4. Напишем подпрограмму вывода точки в режиме записи 2:
void writepixel (int x, int y, int color)
{
unsigned char c, mask = 0x80 >> (x % 8);
unsigned addr= y*80 + x/8;
outportb (0x3CE, 8);
outportb (0x3CF, mask);
SetRWMode(0,2); // установить режим записи - 2
outportb (0x3CE, 3);
outportb (0x3CF, 0); // copy_put
c = peekb (0xA000, addr); // чтение в регистры защелки
pokeb(0xA000, addr,color);
}
(Здесь желательно добавить восстановление регистров 5 и 8).
Режим записи 3. Новое значение пиксела получается путём комбинирования содержимого регистров защелки и содержимого регистра 0 установки/сброса. Сдвинутый вправо на количество разрядов, записанное в битах 0-3 регистра 3, байт процессора объединяется с помощью операции AND со значением регистра 8 двоичной маски. Полученная в итоге битовая маска играет роль, аналогичную роли значения регистра двоичной маски в режимах 0 и 2.