Окт 16

Использование ресурса в приложении

Для получения дескриптора пиктограммы, относящегося к типу HIC0N, вызывается функция Loadlcon или Loadlmage.
Беглое знакомство с функцией Loadlcon у нас уже состоялось в главе 1. Но здесь она будет рассмотрена более подробно. Функция Loadlcon загружает ресурс пиктограммы из выполняемого файла (.ехе), ассоциированного с экземпляром приложения hlnstance:
HICON LoadlconCHINSTANCE hlnstance. LPCTSTR lpIconName);
В качестве второго параметра, определяющего имя ресурса, функция принимает строку с завершающим нулевым символом. Ранее говорилось, что в файле описания ресурсов, подготовленном с помощью редактора ресурсов, имя_ресурса для пиктограммы представляет собой целочисленный идентификатор. Для решения проблемы преобразования целого числа в указатель на строку ресурса необходимо использовать макрос MAKEINTRESOURCE (make an integer into resource string), определенный в файле winuser.h следующим образом:
#define MAKEINTRESOURCE(i) (LPSTR)((DWORD)((WORD)(i)))
Этот макрос преобразует число в указатель, но при этом старшие 16 разрядов устанавливаются в нулевое значение. Так Windows узнает, что второй параметр функции Loadlcon является числом, а не указателем на символьную строку.
Например, для загрузки пиктограммы в программе Russia будет использоваться следующий вызов:
Loadlconthlnstance, MAKEINTRESOURCEUDIJTRICOLOUR));
Если параметр hlnstance имеет значение NULL, то функция Loadlcon используется для загрузки предопределенных пиктограмм. Возможные значения второго аргумента для предопределенных пиктограмм приведены в табл. 1.5 (глава 1). Эта возможность использовалась во всех предыдущих приложениях, так как в классе KWnd поле hlcon оконного класса wc инициализируется при помощи вызова LoadIcon(NULI_ IDI_APPLICATION).
В случае успешного завершения функция Loadlcon возвращает дескриптор загруженной пиктограммы. В случае неудачи возвращается значение NULL. Если по каким-то причинам Loadlcon не смогла загрузить указанную пиктограмму, то она загружает пиктограмму по умолчанию IDI_WINL0G0.
Обращаем ваше внимание на то, что функция Loadlcon предназначена для загрузки только стандартных пиктограмм. Поэтому не пытайтесь загрузить с ее помощью малую пиктограмму (16 х 16). Иначе вас ждет горькое разочарование. Для загрузки пиктограмм других размеров используйте функцию Loadlmage.
Функция Loadlmage предназначена для загрузки изображений разных типов: пиктограмм, курсоров, битовых образов. Она имеет следующий прототип:
HANDLE LoadImage(HINSTANCE hinst. LPCTSTR IpszName. UINT uType. int cxDesired, int cyDesired, UINT fuLoad);
Второй параметр функции определяет загружаемое изображение. Если параметр hinst не равен NULL и параметр fuLoad не содержит флаг LR_LOADFROMFILE, то параметр IpszName интерпретируется аналогично второму параметру функции Loadlcon.
Если параметр hinst равен NULL а параметр fuLoad по-прежнему не содержит флаг LR_L0AD FROM FILE, то параметр IpszName специфицирует OEM-изображение1. Идентификаторы OEM-изображений определены в winuser.h и имеют следующие префиксы: 0ВМ_ для растров, 01С_ для пиктограмм и 0CR_ для курсоров.
Если параметр hinst равен NULL, а параметр fuLoad содержит флаг LR_LOADFROMFILE, то IpszName задает имя файла, в котором хранится изображение загружаемого ресурса.
Третий параметр, uType, определяет тип изображения и может принимать значения IMAGE_BITMAP, IMAGE_CURSOR и IMAGE_ICON.
Четвертый параметр, cxDesired, задает ширину изображения в пикселах. Если он равен нулю и параметр fuLoad содержит флаг LR_DEFAULTSIZE, то для вычисления ширины изображения функция использует значения метрики SM_CXIC0N или SM_CXCURSOR. Если же параметр равен нулю, а флаг LR_DEFAULTSI2Е не используется, то функция использует фактическую ширину изображения.
Пятый параметр, cyDesired, задает высоту изображения в пикселах. Если он равен нулю и параметр fuLoad содержит флаг LR_DEFAL)LTSIZE, то для вычисления высоты изображения функция использует значения метрик SM_CXIC0N или SM_CXCU RS0R. Если же параметр равен нулю, а флаг LR_DEFAULTSIZE не используется, то функция использует фактическую высоту изображения.