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

296

Эта команда создает бинарный файл с именем filename.RES. Большинство программистов, пишущих программы для Windows, дают файлу описания ресурсов то же имя, что и самой программе.

В приведенной выше командной строке параметр -r заставляет компилятор ресурсов создать файл с расширением

.RES и сохранить его на диске. Это необязательно, но делается почти всегда. Параметр -DWIN32 определяет константу (WIN32), которая показывает, что скомпилированный файл описания ресурсов должен храниться в 32разрядном формате, предназначенном для Windows 95 и Windows NT. Одна из причин определения константы WIN32 состоит в том, что текстовые строки, появляющиеся в окнах меню и диалога, хранятся в формате Unicode, по два байта на каждый символ. Если вы сделаете распечатку файла с расширением .RES в шестнадцатеричном формате, то увидите, что все ASCII-символы в окнах меню и диалога разделены нулями. Не волнуйтесь — это нормально.

До появления Windows 95 компилятор файла описания ресурсов был способен, помимо своей основной задачи, еще и добавлять скомпилированные ресурсы в файл с расширением .EXE, созданный компоновщиком. Компоновщик, поставляемый с Microsoft Visual С++ версии 4.0 для Windows 95 выполняет всю эту работу. Просто укажите файл с расширением .RES рядом с файлом (или файлами) с расширением .OBJ в командной строке LINK.

Процедура компиляции ресурсов отражена в новой секции уже хорошо нам знакомого make-файла. Наряду с компиляцией исходных текстов программы на языке С, вы следующим образом компилируете файл описания ресурсов:

progname.res : progname.rc [progname.h] [остальные файлы] $(RC) $(RCVARS) progname.rc

Макросы RC и RCVARS заданы переменными окружения соответственно как "rc" и "-r -DWIN32". Как уже отмечалось, заголовочный файл .H может быть также определяющим файлом. Действительно, в описание ресурсов вы можете добавить заголовочный файл. Кроме того этот заголовочный файл обычно также включается в файл с исходным текстом программы на С и содержит определения идентификаторов, которые программа использует для ссылки на ресурсы. Также было показано, что в списке зависимостей возможно появление и других файлов. Это те файлы, на которые в описании ресурсов имеется ссылка. Обычно это бинарные файлы со значками, курсорами и битовыми образами.

Компилятор ресурсов RC.EXE использует препроцессор, который может учитывать добавленные и удаленные константы, определять символы ограничителей комментариев /* и */, и директивы препроцессора С #define, #undef, #ifdef, #ifndef, #include, #if, #elif, #else и #endif. Директива #include здесь работает несколько иначе, чем в обычных программах на С. (Более детально мы это исследуем в главе 11.)

Другим изменением make-файла при использовании ресурсов является то, что файл с расширением .RES (наряду со всеми файлами с расширением .OBJ) для целевого файла с расширением .EXE становится определяющим файлом.

Значки и курсоры

Давайте начнем с рассмотрения простой программы, использующей два вида ресурсов — значок и курсор. Программа RESOURC1, приведенная на рис. 9.1, при свертывании программы выводит на экран собственный значок и собственный курсор, когда мышь оказывается в рабочей области окна программы RESOURC1. Программа RESOURC1 также рисует свой значок в нескольких строках и столбцах внутри рабочей области.

RESOURC1.MAK

#------------------------

# RESOURC1.MAK make file

#------------------------

resourc1.exe : resourc1.obj resourc1.res $(LINKER) $(GUIFLAGS) -OUT:resourc1.exe \ resourc1.obj resourc1.res $(GUILIBS)

resourc1.obj : resourc1.c $(CC) $(CFLAGS) resourc1.c

resourc1.res : resourc1.rc resourc1.ico resourc1.cur $(RC) $(RCVARS) resourc1.rc

RESOURC1.C

/*-----------------------------------------------------------

 

RESOURC1.C --

Icon and Cursor Demonstration Program No. 1

 

(c) Charles Petzold, 1996

-----------------------------------------------------------

*/

297

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

char

szAppName[] = "Resourc1";

HINSTANCE

hInst;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)

{

 

 

HWND

hwnd;

 

MSG

msg;

 

WNDCLASSEX wndclass;

 

wndclass.cbSize

= sizeof(wndclass);

wndclass.style

= CS_HREDRAW | CS_VREDRAW;

wndclass.lpfnWndProc

= WndProc;

wndclass.cbClsExtra

= 0;

wndclass.cbWndExtra

= 0;

wndclass.hInstance

= hInstance;

wndclass.hIcon

= LoadIcon(hInstance, szAppName);

wndclass.hCursor

= LoadCursor(hInstance, szAppName);

wndclass.hbrBackground

=(HBRUSH)(COLOR_WINDOW + 1);

wndclass.lpszMenuName

= NULL;

wndclass.lpszClassName

= szAppName;

wndclass.hIconSm

= LoadIcon(hInstance, szAppName);

RegisterClassEx(&wndclass);

hInst = hInstance;

hwnd = CreateWindow(szAppName, "Icon and Cursor Demo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

ShowWindow(hwnd, iCmdShow);

UpdateWindow(hwnd);

while(GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

static HICON hIcon;

static int

cxIcon, cyIcon, cxClient, cyClient;

HDC

hdc;

PAINTSTRUCT

ps;

int

x, y;

switch(iMsg)

{

case WM_CREATE :

hIcon = LoadIcon(hInst, szAppName); cxIcon = GetSystemMetrics(SM_CXICON); cyIcon = GetSystemMetrics(SM_CYICON); return 0;

298

case WM_SIZE :

cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); return 0;

case WM_PAINT :

hdc = BeginPaint(hwnd, &ps);

for(y = cyIcon; y < cyClient; y += 2 * cyIcon) for(x = cxIcon; x < cxClient; x += 2 * cxIcon)

DrawIcon(hdc, x, y, hIcon);

EndPaint(hwnd, &ps); return 0;

case WM_DESTROY : PostQuitMessage(0); return 0;

}

return DefWindowProc(hwnd, iMsg, wParam, lParam);

}

RESOURC1.RC

/*-----------------------------

RESOURC1.RC resource script

-----------------------------

 

*/

 

 

resourc1

ICON

resourc1.ico

resourc1

CURSOR

resourc1.cur

RESOURC1.ICO

RESOURC1.CUR

 

 

 

 

 

 

 

 

 

 

Рис. 9.1 Программа RESOURC1, содержащая курсор и значок

Вы можете создавать значки и курсоры с помощью Microsoft Developer Studio или любой другой интегрированной среды разработки для Windows. Значки и курсоры хранятся в бинарном формате. Файлы значков имеют расширение .ICO, а файлы курсоров — .CUR. Ссылки на эти файлы имеются в файле описания ресурсов

RESOURC1.RC.

Редактор изображений

Программу-инструмент, которую вы используете для создания значков, курсоров и битовых образов часто называют редактором изображений (image editor), и он является одной из наиболее важных утилит разработчика в любой интегрированной среде разработки программ для Windows. Как значки, так и курсоры являются разновидностью битовых образов, поэтому будет полезно рассмотреть битовые образы первыми.

Битовый образ (bitmap) — это битовый массив, где один или более битов соответствуют каждому пикселю экрана. В монохромном битовом образе для каждого пикселя требуется один бит. (В простейшем случае 1 соответствует белому цвету, а 0 — черному. Тем не менее, битовые образы часто используются не только для создания простых рисунков, но и в логических операциях.) В цветном битовом образе для отображения цвета каждому пикселю соответствует несколько битов. Редакторы изображений обычно поддерживают создание монохромных и 16цветных битовых образов. В 16-цветном битовом образе для каждого пикселя требуется 4 бита.

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

.BMP. Вы тоже можете создавать значки и курсоры с помощью редактора изображений.

Теоретически, Windows выводит значки и курсоры на экран в пиксельном размере, который зависит от разрешающей способности дисплея. Это гарантирует, что они не будут ни слишком большими, ни слишком маленькими. Однако, подходящие для подавляющего большинства видеоадаптеров VGA (Video Graphics Array), с

299

разрешением экрана 640 пикселей по горизонтали и 480 по вертикали, размеры значков и курсоров изменяются не совсем так, как требуется.

ВWindows 95 имеется два размера значков — стандартный и маленький. На дисплеях VGA стандартный значок имеет размер 32 пикселя в ширину и 32 пикселя в высоту, а площадь маленького значка равна 16 квадратных пикселей. Маленький значок используется в левой части строки заголовка приложения для вызова системного меню, в панели задач системы в нижней части экрана, а также в списках программ меню Start. Значки, появляющиеся на рабочем столе, имеют стандартный размер. В программе Windows Explorer и меню Start пользователь может произвольно выбирать стандартный или маленький значок.

Впрограмме можно получить горизонтальный (X) и вертикальный (Y) размеры значков и курсоров, используя функцию GetSystemMetrics с параметрами SM_CXICON и SM_CYICON (для стандартного значка), SM_CXSMICON и SM_CYSMICON (для маленького значка) и SM_CXCURSOR и SM_CYCURSOR для курсоров мыши. Для большинства дисплеев размеры стандартных курсоров и значков одинаковы.

Редактор изображений, включенный в состав программы Developer Studio, может создавать файл с расширением

.ICO, содержащий один из трех различных образов значка:

Стандартный: 16-цветный площадью 32 квадратных пикселя

Монохромный: черно-белый площадью 32 квадратных пикселя

Маленький: 16-цветный площадью 16 квадратных пикселей

Все курсоры и значки, показанные в программах этой главы, являются монохромными. Вам нет необходимости создавать значки во всех трех форматах. Сама Windows может создать из стандартного значка — маленький, просто исключив каждый второй столбец и строку. Для монохромных дисплеев (которые сейчас почти полностью устарели) Windows может приближенно изобразить значок, используя различные оттенки серого цвета.

Когда вы создаете образ значка в одном из трех представленных форматов, редактор изображений, фактически, сохраняет его в виде двух битовых образов — монохромной маски (mask) битового образа и монохромного или цветного изображения битового образа. Значки всегда прямоугольны, но маска позволяет значку представлять непрямоугольные изображения, т. е. вместо изображения всего значка, некоторые его части могут быть окрашены на экране цветом фона. Кроме этого значки могут содержать области, инвертирующие цвет фона. В следующей таблице показано, как редактор изображений строит два битовых образа, которые описывают монохромный значок:

Цвет:

Черный

Белый

Экран

Инверсный экран

Маска битового образа:

0

0

1

1

Изображение

0

1

0

1

битового образа:

 

 

 

 

При выводе значка на экран, Windows сначала использует поразрядную операцию AND экрана и первого битового образа. Пиксели экрана, соответствующие нулевым битам первого битового образа становятся нулевыми, т. е. черными. Пиксели экрана, соответствующие единичным битам остаются без изменения. Эта логика отражена в следующей таблице:

Бит маски

Пиксели экрана

 

0

1

0

0

0

1

0

1

Далее, Windows выполняет поразрядную операцию исключающего OR изображения битового образа и экрана. 0 во втором битовом образе оставляет пиксель на экране без изменений; 1 во втором битовом образе инвертирует пиксель экрана. Эта логика представлена в следующей таблице:

Бит изображения

Пиксели экрана

 

0

1

0

0

1

1

1

0

Используя нотацию языка C для этих операций, вывод на экран осуществляется в соответствии со следующей формулой:

Display =(Display & Mask) ^ Image

Для 16-цветного значка маска битового образа — монохромна и формируется указанным выше способом. Битовый образ изображения содержит 4 бита на пиксель для отображения 16 цветов. Все четыре бита устанавливаются в 1 для той области значка, в которой цвет фона инвертируется.

Соседние файлы в предмете Операционные системы