
- •Введение
- •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
- •Варианты заданий
- •Пример выполнения задания
2.2. Сохранение и восстановление экрана
В текстовом режиме адрес начала видеопамяти обычно равен В8000h. В некоторых текстовых режимах он имеет значение В0000h.
В графическом режиме вместо записи в видеопамять при выводе на экран удобно использовать массив, адрес которого может быть произвольным. Поэтому целесообразно считать, что адрес видеопамяти задан внешним указателем
char far *vid_mem;
значение которого устанавливается в главной программе, например, с помощью операторов
int vmode = video_mode(); // определение режима с помощью
//подпрограммы из пп. 1.5 (пример 1)
if (vmode == 7)
vid_mem = (char far *) 0xB0000000; // монохромный режим
else
vid_mem = (char far *) 0xB8000000; // цветной режим
Мы будем предполагать, что установлен один из режимов 2, 3 или 7.
Для того чтобы сохранить часть экрана, будем считывать символы и атрибуты из видеопамяти и записывать их в указанную в подпрограмме аргументом
unsigned *buf_ptr
область оперативной памяти. Получим следующую подпрограмму сохранения области экрана:
void save_video (int startx, int endx, int starty, int endy,
unsigned *buf_ptr)
// (startx, starty) – координаты левого верхнего угла
// (endx, endy) - координаты правого нижнего угла
{
register int i, j; // счетчики строки и столбца
char far *v, far *t; // указатели на видеопамять
v = vid_mem; // начало видеопамяти
for (i=starty; i<=endy; i++)
for (j=startx; j<=endx; j++)
{
t = v+160*i+2*j; // адрес символа и атрибута
*buf_ptr++ = *t++; // сохранение символа
*buf_ptr++ = *t; // сохранение атрибута
}
}
Для восстановления области экрана теперь достаточно переписать данные из области сохранения в видеопамять. Получим следующую подпрограмму восстановления:
void restore_video (int startx, int endx, int starty, int endy,
unsigned *buf_ptr)
{
register int i, j;
char far *v, far *t; // указатели на видеопамять
v = vid_mem;
t = v;
for (i=starty; i<=endy; i++)
for (j=startx; j<=endx; j++)
{
v = t+160*i+2*j;
*v++ = *buf_ptr++; // восстановление символа
*v = *buf_ptr++; // восстановление атрибута
}
}
2.3. Вывод меню и рамки
После сохранения области вывода меню, согласно пп. 2.1, выводится рамка и меню. Текст опций меню составляет массив строк и определяется, например, следующим образом:
char *menu[] =
{
“Цвет текста”,
“Цвет фона”,
“Эхо”,
“Выход”
};
Для того чтобы вывести такое меню, нужно сначала закрасить прямоугольник цветом фона, а потом вывести строки из заданного массива:
void display_menu (char *menu[], int startx, int starty, int endx,
int endy, int count) // вывод меню на экран
{
register int i, j;
for (i=starty; i<=endy; i++)
for (j=startx; j<=endx; j++)
write_char (j, i,' ', 7); // закраска области
for (i=0; i<count; i++, starty++)
write_string (startx, starty, menu[i],7);
}
Здесь мы использовали подпрограммы write_char() и write_string() из пп.1.5 (примеры 6 - 7). Байт атрибута равен 7, следовательно, подпрограмма будет выводить строки меню белым цветом на черном фоне.
Для вывода рамки будем использовать коды символов псевдографики: 218 для левого верхнего угла, 191 – для правого верхнего, 192 – для левого нижнего, 217 – для правого нижнего, 196 – для верхней и нижней строк и 179 – для боковых столбцов.
void draw_border (int startx, int starty, int endx, int endy)
{
register int i;
write_char(startx, starty, 218, 7);
write_char(endx, starty, 191, 7);
write_char(startx, endy, 192, 7);
write_char(endx, endy, 217, 7);
for (i = startx+1; i<endx; i++)
{
write_char (i, starty, 196, 7);
write_char (i, endy, 196, 7);
}
for (i = starty+1; i<endy; i++)
{
write_char (startx, i, 179, 7);
write_char (endx, i, 179, 7);
}
}