
- •Введение
- •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
- •Варианты заданий
- •Пример выполнения задания
1.4. Процессы ввода – вывода
Для разработки диалоговой системы необходимы следующие подпрограммы нижнего уровня:
-
функция вывода строки в текущую позицию;
-
функция вывода курсора;
-
функция вывода строки в заданную позицию;
-
функция ввода символов и их скан-кодов;
-
функция ввода строки;
-
функции выбора, позиционирования и указания объектов;
-
функции ввода-вывода графических объектов.
К ним можно добавить функции установки атрибутов вывода и размеров курсора.
Выбираемый объект определяется областью экрана, в пределах которой отображается объект, содержанием и атрибутами, описывающими формат объекта.
При абсолютном выборе объекта указывается его место на экране, при относительном - указывается сам объект. Указанием объекта называется абсолютный или относительный выбор этого объекта.
1.5. Методы разработки подпрограмм нижнего уровня
Существуют три способа доступа к видеоадаптеру:
-
через операционную систему;
-
через подпрограммы обработки прерываний;
-
с помощью непосредственного доступа к видеопамяти.
Доступ через операционную систему DOS осуществляется с помощью функций getch(), getche(), cscanf(), cprintf(), clrscr(), которые подсоединяются с помощью директивы
#include <conio.h>
и работают медленно.
Подпрограммы обработки прерываний используют функцию, имеющую следующий прототип:
Int int86(int num, union regs *inregs, union regs *outregs);
где num – номер прерывания, inregs – входные значения регистров микропроцессора, outregs – выходные значения этих регистров. Эта функция возвращает значение регистра AX. Здесь объединение REGS получается наложением двух структур и определяется как
union REGS
{
struct WORDREGS x;
struct BYTEREGS h;
}
Совмещаемые структуры определяются следующим образом:
struct WORDREGS
{
unsigned int ax, bx, cx, dx, si, di, cflag, flags;
};
struct BYTEREGS
{
unsigned char al, ah, bl, bh, cl, ch, dl, dh;
};
Элементами этих структур являются регистры микропроцессора. Именем flags обозначается регистр флагов. Если поле cflags после завершения подпрограммы int86() ненулевое, то имела место ошибка.
Пример 1. Напишем подпрограмму, определяющую номер текущего видеорежима, с помощью функции 0Fh прерывания 10h. Эта функция возвращает номер текущего видеорежима в регистр al:
#include <dos.h>
int video_mode()
{
int v;
union REGS in, out; //входные и выходные значения регистров
in.h.ah=0x0f; //функция 0Fh
v=int86(0x10, &in, &out);
return 255&v; //значение младшего байта
}
Если вызвать данную подпрограмму с помощью
int r=video_mode();
то значение r будет равно номеру текущего видеорежима.
Пример 2. Напишем подпрограмму установки размеров курсора с помощью функции 1 прерывания 10h. В регистре CH задается начальная строка сканирования, в CL – конечная строка:
void setcursortype(char h, char l)
{
union REGS r;
r.x.ax=0x0100; //функция 1
r.x.bx=0; //страница 0
r.h.ch=h; r.h.cl=l; //номер линий
int86(0x10, &r, &r);
}
Пример 3. Символ и его атрибут выводятся с помощью функции 9 прерывания 10h. В регистре AL должен находится ASCII-код символа, в BH – номер страницы, в BL – атрибут, в CX – число повторяющихся символов. Запись на экран производится в текущее положение курсора:
void write_syma(char ch, char attr)
{
union REGS r;
r.h.ah=9; //функция
r.h.al=ch; //символ
r.h.bl=attr; //атрибут
r.h.bh=0; //страница
r.x.cx=1; //один символ
int86(0x10, &r, &r);
}
Пример 4. Регистр палитры можно изменить с помощью функции 10h прерывания 10h. Если в AL записать 0, то изменяется один регистр палитры:
void setpalette ( char i, //номер регистра палитры
char red, //число красных (0-3)
char green, //число зеленых (0-3)
char blue) //число синих (0-3)
{
union REGS r;
r.h.ah=0x10;
r.h.al=0;
r.h.bl=i;
r.h.bh= (red%2)*32+(red/2)*4+
(green%2)*16+(green/2)*2+
(blue%2)*8+(blue/2);
int86(0x10, &r, &r);
}
Напишем подпрограмму для изменения цветов регистров палитры 0-15. Цвета будут задаваться случайным образом.
#include <stdlib.h>
#include <time.h>
void setpalette(char i, char red, char green, char blue);
//пользуемся написанной подпрограммой
void randpalette()
{
int i;
randomaze(); //генерация случайного числа
for(i=0; i<16; i++)
setpalette(i, random(4), random(4), random(4));
}
Пример 5. Установка текущей позиции курсора осуществляется с помощью функции 2 прерывания 10h:
void goto_xy(int x, int y)
{
union REGS r;
r.x.ax=0x0200; //функция установки
r.h.bh=0; //страница
r.h.dh=y; //номер строки
r.h.dl=x; //номер столбца
int86(0x10, &r, &r);
}
Непосредственный доступ к видеопамяти осуществляется одним из следующих двух способов:
-
объявляется указатель на видеопамять
char far *vid_mem = (char far *) 0xb8000000;
и для вывода символа ch с атрибутами attr в позицию (x, y) на экране производится запись
*vid_mem + 160*x + 2*y = ch;
*vid_mem + 160*x + 2*y + 1 = attr;
-
аналогичные действия можно произвести с помощью функции, записывающей байты по указанным адресам