- •Введение
- •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
- •Варианты заданий
- •Пример выполнения задания
4.4. Форматы хранения графических файлов
Существуют два принципиально отличающихся метода представления графических изображений: растровый и векторный. Растровое представление означает, что изображение было разбито сеткой. Световое значение (яркость, затемнение или цвет) каждой части (пиксела) сетки записывается индивидуально. Векторное представление определяет изображение в виде серии линий или фигур, возможно с некоторыми закрашенными областями, заполняемыми по специальным шаблонам. Текстовые процессоры, такие как Microsoft Word, часто способны включать как векторные изображения, например, файлы графопостроителя HPGL из программ CAD, так и двоичные изображения, например файлы TIFF из графических редакторов. Тем не менее, текстовые процессоры не обрабатывают изображения, а лишь привязывают их к документу.
Мы рассмотрим два формата, принадлежащие к различным методам представления изображений: PCX и PIC. Они могут быть обработаны текстовыми процессорами Microsoft Word, Word Perfect и др.
Формат PCX. Этот формат является наиболее широко используемым растровым форматом. Современные версии этого формата поддерживают полноцветные картинки (24-битовые цвета) и реализуются либо в качестве палитры, имеющей до 256 цветов, либо как полный 24-битовый RGB с размерами изображений до 64000x64000 пикселов. Изображение сжимается методом группового кодирования. Разработчиком новых версий файлов PCX является фирма Zsoft. Версии 0, 2, 3, 4, 5 соответствуют версиям приложения PC Paintbrush. Версия 4 соответствует PC Paintbrush для Windows, а версия 5 – PC Paintbrush IV Plus, PC Paintbrush Plus для Windows, Publisher’s Paintbrush.
Файл формата PCX содержит заголовок (128 байт) и данные. В некоторых версиях этого формата добавляется отдельная часть, посвященная палитре с количеством цветов до 256. Мы не будем рассматривать эти версии.
Заголовок определяется с помощью структуры:
struct PCXHEADER
{
char manuf; // информация о программе, создающей изображение;
// для Paintbruah равно 10
char hard; // версия, рассматривается 5
char encod; // 1 – групповое кодирование, 0 – без сжатия
char bitpx; // число битов на пиксел в каждой плоскости
int x1, y1, x2, y2; // координаты левого верхнего и правого нижнего
// углов, включительно
int hres; // горизонтальное разрешение = количество точек на
// дюйм по оси Х при распечатывании
int vres; // вертикальное разрешение = количество точек на
// дюйм по оси У при распечатывании (72)
char clrma[48]; // палитра для 16 цветов
char vmode; // резерв, всегда = 0
char nplanes; // количество битовых плоскостей (4)
int bplin; // число байт на одну строку в одной битовой плос-
// кости для распакованной строки, в Paintbrush
// выравнивается на границу слова
int palinfo; // 1 – цветная палитра, 2 – серая
int shres; // число пикселов экрана в
// горизонтальном направлении (640)
int svres; // высота экрана в пикселах (480)
char xtra[54]; // резерв
}
Алгоритм сжатия. Считываются строки, имеющие координаты у1 у у2. Каждой строке будет соответствовать строка бит, содержащая сначала биты плоскости 0, затем – плоскостей 1, 2, 3. На рис. 4.6 показано, каким образом формируется эта строка бит.
Число сохраняемых строк равно у2 - у1 + 1. Сохраняемая строка состоит из (int) (4* (х2 - х1 + 1) / 8) байт, если это число нечетно, то к этой строке добавляется один байт.
Байты считываются из сохраняемой строки бит и упаковываются следующим образом:
-
если байт повторяется, то записываются 2 байта – байт-повторитель и байт-значение (в котором содержится значение повторяемого байта), поскольку число повторений состоит из 6 бит, то оно не больше 63;
-
если байт один и если его значение < 11000000b, то записывается один байт, равный ;
-
если байт один и если его значение 11000000b, то записываются два байта, первый из которых равен 11000001b, а второй = 11000000b + значение.
Кодирование цвета в палитре. В массиве заголовка clrma[48] находится информация о палитре. Каждому регистру палитры отводится три байта. Например, регистру 0 отводятся байты clrma[0] = яркость красного, clrma[1] = яркость зеленого, clrma[48] = яркость синего. Регистру палитры i отводятся байты clrma[3*i], clrma[3*i+1], clrma[3*i+2].
Формат PIC. Приложение Lotus 1-2-3 генерирует файлы формата PIC для передачи его во вспомогательную программу Lotus печати графики. Файл формата PIC состоит из заголовка (17 байт) и графических команд, оперирующих с областью, состоящей из 32012312 точек. Левый нижний угол рисунка имеет координаты (0, 0), а правый верхний – (3200, 2311).
Заголовок состоит из следующих 17 байт:
1, 0, 0, 0, 1, 0, 8, 0, 0х44, 0, 0, 0, 0, 0х0С, 0х7F, 9, 6.
Каждая команда состоит из однобайтового кода операции, за которым при необходимости следуют аргументы. Значения координат Х и Y представляются как 16-битные целые числа. У этих значений старший байт расположен первым (соглашение Motorola), даже несмотря на то, что почти все программы, поддерживающие PIC, распространяются на машинах Intel. Обозначим через Хст и Xмл соответственно старший и младший байты Х.
Перечень команд (названия и коды):
-
Color p – установка цвета p,
код 0хВp (1 байт);
-
Move x, y - установка текущей позиции в (x, y),
код 0хА0, хст, хмл, уст, умл (5 байт);
-
Draw x, y – аналогично графической функции языка C++ lineto(x,y),
код 0хА2, хст, хмл, уст, умл (5 байт);
-
Fill N, x0, y0, …, xN, yN – заполненный многоугольник,
код 0х30, N, х0ст, х0мл, …, уNст, уNмл (4N+6 байт);
-
Fillo N, x0, y0, …, xN, yN – заполненный многоугольник с границей,
код 0хD0, N, х0ст, х0мл, …, уNст, уNмл (4N+6 байт);
-
Size x, y – установка размера последовательно выводящегося текста, координаты х и у задают размеры символа,
код 0хАС, хст, хмл, уст, умл (5 байт);
-
Font N – номер шрифта (N=0 или N=1),
код 0хА7, N (2 байта);
-
Text N, строка – вывод текста от текущей позиции, старшие 4 бита байта N определяют направление:
0 – горизонтально, слева направо,
1 – текст повернут на 90,
2 – текст повернут на 180,
3 – текст повернут на 270,
а младшие 4 бита байта N управляют выравниванием текстовой строки относительно текущей позиции; строка ограничена прямоугольником, и некоторая точка этого прямоугольника отождествляется с текущей позицией, согласно следующим значениям выравнивания:
0 – центр прямоугольника,
1 – центр левой стороны,
2 – центр правой стороны,
3 – центр нижней стороны,
4 – левый верхний угол,
5 – правый верхний угол,
6 – левый нижний угол,
7 – правый нижний угол,
код 0хА8, N, символ, символ,…,символ, 0 (последний символ строки равен 0);
-
End – конец рисунка,
код 0х06 (1 байт).
Примеры. Команда перемещения текущей позиции Move 1000, 2000 кодируется в виде:
0хА0, 3, 232, 7, 208,
поскольку старший байт числа 1000 равен 3, а младший – 232, а для 2000 они равны соответственно 7 и 208. Заполненный треугольник с вершинами (100, 100), (200, 200) и (100, 300) определяется с помощью команды
Fill 2, 100, 100, 200, 200, 100, 300
и кодируется с помощью 14 байт:
0х30, 2, 0, 100, 0, 100, 0, 200, 0, 200, 0, 100, 1, 44.