- •Глава 9 Значки, курсоры, битовые образы и строки
- •Компиляция ресурсов
- •Значки и курсоры
- •Редактор изображений
- •Получение описателя значков
- •Использование значков в вашей программе
- •Использование альтернативных курсоров
- •Битовые образы: картинки в пикселях
- •Использование битовых образов и кистей
- •Символьные строки
- •Использование ресурсов-символьных строк
- •Использование ресурсов-строк в функции MessageBox
- •Ресурсы, определяемые пользователем
Получение описателя значков
В файле описания ресурсов ссылка на файл значка выглядит примерно так:
myicon ICON iconfile.ico
где ICONFILE.ICO — имя файла значка. В этой инструкции значку присваивается имя "myicon". В программе на С для получения описателя значка используется функция LoadIcon. В функции LoadIcon имеется два параметра. Первым является описатель экземпляра вашей программы, который в WinMain обычно называется hInstance. Этот описатель требуется для Windows, чтобы определить, в каком файле с расширением .EXE содержится ресурс значка. Вторым параметром является имя значка из описания ресурсов, заданное в виде указателя на оканчивающуюся нулем строку. Возвращаемым значением функции LoadIcon является значение типа HICON, которое определяется в WINDOWS.H.
Имеется связь между именем значка в описании ресурсов и в инструкции, содержащей функцию LoadIcon вашей программы на С:
Описание ресурсов: |
myicon ICON iconfile.ico |
Исходный текст программы: |
hIcon = LoadIcon (hInstance, "myicon"); |
Не беспокойтесь о том, в верхнем или нижнем регистре задано имя значка. Компилятор преобразует в файле описания ресурсов имя значка в символы верхнего регистра и вставляет это имя в таблицу ресурсов в заголовке файла программы с расширением .EXE. При первом вызове функции LoadIcon, Windows преобразует строку, заданную вторым параметром в символы верхнего регистра и отыскивает в таблице ресурсов файла с расширением .EXE совпадающее с этой строкой имя.
Вместо имени вы также можете использовать число (16-разрядное беззнаковое WORD). Это число называется идентификатором (ID) значка. Ниже показано как это делается:
Описание ресурсов: |
125 ICON iconfile.ico |
Исходный текст программы: |
hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (125)); |
MAKEINTRESOURCE (make an integer into a resourse string — преобразовать целое в строку ресурса) является макросом, определенным в заголовочных файлах Windows, который преобразует число в указатель, но со старшими 16 разрядами, установленными в нуль. Так Windows узнает, что второй параметр функции LoadIcon является числом, а не указателем на символьную строку.
В примерах программ, представленных ранее в этой книге, использовались предопределенные значки:
LoadIcon (NULL, IDI_APPLICATION);
Поскольку параметр hInstance установлен в NULL, Windows узнает, что этот значок является предопределенным. IDI_APPLICATION также определяется в заголовочных файлах Windows с использованием макроса MAKEINTRESOURCE:
#define IDI_APPLICATION MAKEINTRESOURCE (32512)
Предопределенные значки и курсоры являются частью файла драйвера дисплея.
На имя значка можно ссылаться и с помощью третьего метода, который является комбинацией метода, использующего текстовую строку, и метода, использующего число:
Описание ресурсов: |
125 ICON iconfile.ico |
Исходный текст программы: |
hIcon = LoadIcon (hInstance, "#125"); |
По символу # операционная система Windows определяет, что далее следует число в ASCII-коде.
Как насчет четвертого способа? В этом способе используется макроопределение в заголовочном файле, который включается (с помощью директивы #include) и в файл описания ресурсов, и в вашу программу:
Заголовочный файл: |
#define myicon 125 |
Описание ресурсов: |
myicon ICON iconfile.ico |
Исходный текст программы: |
hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (myicon)); |
При использовании этого способа будьте внимательны! Хотя регистр символов при использовании строки в качестве имени значка не имеет значения, он приводит к различию идентификаторов, генерируемых с помощью инструкций #define.
Использование идентификаторов вместо имен значков уменьшает размер файла с расширением .EXE и, вероятно, немного ускоряет работу функции LoadIcon. Больше того, если в вашей программе используется множество значков, то вы обнаружите, что проще хранить их идентификаторы в массиве.
