Тема: Ресурсы приложения и их использование




 

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

Файлы ресурсов (rc-файлы) являются текстовыми файлами (их можно создать как специальным редактором ресурсов, так и текстовым редактором) и компилируются компилятором ресурсов. Полученный в результате двоичный файл (res-файл) компонуется с остальными частями приложения, образуя исполняемый exe-файл, содержащий программный код и информацию о ресурсах.

Ресурсы также могут включаться в отдельную динамически связываемую библиотеку DLL. В этом случае при изменении файла ресурсов не требуется перекомпилировать всё приложение, а нужно только заменить DLL.

 

Структура файла ресурсов

Файл ресурсов представляет собой набор директив препроцессора и операторов описания ресурсов:

#include "resource.h"

#include "windows.h"

…. // другие директивы прпроцессора

оператор описания ресурса1

….

оператор описания ресурсаN

 

Операторы описания ресурсов могут быть двух видов: однострочные и многострочные.

Однострочные операторы определяют следующие типы ресурсов: пиктограммы (ICON), курсоры (CURSOR), растровые изображения (BITMAP), шрифты (FONT), язык ресурсов (LANGUGE).

Однострочный оператор имеет следующий вид:

Идентификатор Тип_ресурса [Характеристика_загрузки] "Имя_файла_ресурса"

Идентификатор ресурса может быть текстовой строкой или числовым значением.

Для ресурсов типа BITMAP, CURSOR, FONT и ICON также может указываться характеристика загрузки DISCARDABLE, указывающая, что ресурс может быть удален из памяти, если он больше не требуется, например:

MyBitmap BITMAP DISCARDABLE “mybitmap.bmp”

 

Многострочные операторы определяют следующие типы ресурсов: таблицы строк (STRINGTABLE), меню (MENU), таблицы акселераторов (ACCELERATORS), диалоговые окна (DIALOG), пользовательские данные (RCDATA) и ресурсы информации о версии.

Форма записи многострочного оператора следующая:

Идентификатор Тип_ресурса [Необязательные_параметры]

[Необязательные_инструкции]

BEGIN

[Инструкции]

END

Состав необязательных параметров и инструкций, а также обязательных инструкций зависит от типа ресурса и будет рассмотрен позже.

 

Определение и использование различных типов ресурсов

Пиктограммы

Пиктограмма - это графическое изображение небольшого размера, состоящее из отдельных пикселов (32x32). Пиктограммы обычно используют для обозначения свернутого окна приложения, они отображаются в левом верхнем углу заголовка окна. С помощью редактора изображений можно нарисовать свои пиктограммы и использовать их в приложениях.

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

Для включения пиктограммы в файл описания ресурсов используется оператор ICON, например:

MyIcon ICON "iconfile.ico"

В приложении для получения дескриптора пиктограммы используется функция LoadIcon:

HICON LoadIcon(HINSTANCE hInst, LPCTSTR lpszIcon);

Параметры функции:

· hInst - дескриптор экземпляра приложения.

· lpszIcon - идентификатор пиктограммы из описания ресурсов, заданный в виде указателя на строку.

Если первый параметр функции LoadIcon установлен в NULL, то это означает, что данная пиктограмма яляется преодопределенной (с префиксом IDI_):

//загрузка предопределенной пиктограммы

LoadIcon(NULL, IDI_APPLICATION);

 

Способы загрузки пиктограмм, определенных в ресурсах приложения

1. Идентификатор ресурса пиктограммы в описании задан именем:

Описание ресурса: MyIcon ICON "iconfile.ico"

Текст программы: HICON hIcon=LoadIcon(hInst,”MyIcon”);

2. В качестве идентификатора ресурса используется число (16-разрядное беззнаковое WORD):

Описание ресурса: 125 ICON "iconfile.ico"

Текст программы:

HICON hIcon=LoadIcon(hInst, MAKEINTRESOURCE(125));

Макрос MAKEINTRESOURCE определен в заголовочных файлах Windows, он преобразует число в указатель, но со старшими разрядами, установленными в нуль.

 

Чтобы окно hWnd имело требуемую пиктограмму необходимо дескриптор, возвращаемый функцией LoadIcon, присвоить полю пиктограммы структуры класса окна:

wndclass.hIcon=LoadIcon(hInst,”MyIcon”);

Если в процессе работы приложения необходимо заменить пиктограмму, то следует воспользоваться вызовом:

SetClassLong(hWnd,GCL_HICON,LoadIcon(hInst,”Icon_ID”));

где Icon_ID – идентификатор требуемой пиктограммы.

Замечания:

1. После того, как приложение загрузило пиктограмму, ее можно также нарисовать в любом месте экрана функцией DrawIcon.

2. Если загруженная с помощью функции LoadIcon пиктограмма приложению больше не нужна, то можно освободить занимаемую ею память, вызвав функцию DestroyIcon.

 

Курсоры

Приложение может использовать не только стандартные курсоры, но и альтернативные, хранящиеся в ресурсах приложения.

Инструкции для описания курсора в файле ресурсов и для получения его дескриптора в программе имеют вид, аналогичный для пиктограмм. Отличие состоит в том, что здесь используется функция LoadCursor:

Описание ресурса: MyCursor CURSOR "cursfile.cur"

Текст программы:

HCURSOR hCursor=LoadCursor(hInst,”MyCursor”);

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

wndclass.hCursor= LoadCursor(hInst,"MyCursor”);

Изменить курсор для окна можно в любое другое время, переопределив значение, содержащееся в структуре класса окна:

SetClassLong(hWnd,GCL_HCURSOR,LoadCursor(hInst,

”Cursor_ID”));

где Cursor_ID – имя требуемого курсора.

Windows содержит несколько встроенных курсоров. Их идентификаторы описаны в файле windows.h и начинаются с префикса IDC_. Для загрузки встроенных курсоров также используется функция LoadCursor, но в качестве первого параметра ей передается NULL:

LoadCursor(NULL, IDC_ARROW);

Замечания:

1. Для того чтобы выключить изображение курсора или вновь его включить, используют функцию ShowCursor.

2. Если курсор, загруженный с помощью функции LoadCursor, приложению больше не нужен, то можно освободить занимаемую им память, вызвав функцию DestroyCursor.

 

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

Графические изображения широко используются для оформления внешнего вида окон приложения. В ресурсы приложения такие изображения включают в виде битового образа (ресурс типа BITMAP). Изображения создаются с помощью графических редакторов и записываются в файл с расширением имени.bmp.

Битовый образ включается в файл описания ресурсов в том же формате, что пиктограмма или курсор:

MyBmp BITMAP "bmpfile.bmp"

Для загрузки ресурса используется функция LoadBitmap. Ее возвращаемым значение является дескриптор битового образа:

HBITMAP hBitmap=LoadBitmap(hInst,”MyBmp”);

Битовые образы используются в следующих случаях:

1. Создание кистей. Кисти являются шаблонами пикселей, которые Windows использует для закрашивания изображаемых на экране областей.

Для создания кисти из изображения используется функция CreatePatternBrush, в качестве параметра которой задается дескриптор битового образа hBitmap. Эта функция возвращает дескриптор кисти, который можно использовать при регистрации окна:

HBRUSH hBrush=CreatePatternBrush(hBitmap);

wndclass.hbrBackground=hBrush;

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

Перед завершением работы приложения созданная кисть должна быть уничтожена функцией DeleteObject.

2. Рисование на экране картинок. Битовые образы можно просто рисовать в рабочей области окна; можно использовать их в кнопках, определяемых пользователем; применять при работе с меню.

Особенностью битовых образов является то, что в отличие от остальных ресурсов они являются объектами GDI. Поэтому для их вывода используются контексты устройств и специальные функции.

Пример вывода битового изображения в рабочую область окна. Выводится оно, начиная от точки с координатами (100, 100) с фактическими размерами:

HDC hDC=GetDC(hWnd); // Получение контекста у-ва

// Создание контекста, совместимого с контекстом окна

HDC BitmapDC=CreateCompatibleDC(hDC);

// Выбор объекта в контекст устройства

HBITMAP hOldBitmap= (HBITMAP)SelectObject(BitmapDC,hBitmap);

// Получение размеров изображения

int iHorSize=GetDeviceCaps(BitmapDC,HORZSIZE);

int iVerSize=GetDeviceCaps(BitmapDC,VERTSIZE);

// Вывод битового образа в окно

BitBlt(hDC,100,100,iHorSize,iVerSize,BitmapDC,0,0,SRCCOPY);

// Восстановление прежнего объекта

SelectObject(BitmapDC,hOldBitmap);

// Удаление созданного контекста

DeleteDC(BitmapDC);

ReleaseDC(hWnd,hDC); // Освобождение контекста у-ва

Символьные строки

Использование в качестве ресурсов символьных строк предназначено главным образом для облегчения перевода (локализации) приложения на другие языки.

Такой ресурс задается в виде таблицы строк с помощью ключевого слова STRINGTABLE, за которым следуют несколько определений строк, заключенных между ключевыми словами BEGIN-END:

STRINGTABLE

BEGIN

id1 “содержимое строки 1”

id2 “содержимое строки 2”

// определения остальных строк

END

Идентификаторы строк id1, id2..., которые предшествуют каждой строке, должны быть или числами, или идентификаторами макроопределений, которые задаются в заголовочном файле. В описании ресурсов может быть только одна таблица строк. Максимальный размер каждой строки – 255 символов.

Приложения ссылаются на эти строки по символьным идентификаторам.

Например:

// Определение идентификаторов строк в заголов. файле

# define IDS_HELLO 1

# define IDS_BYE 2

...

// Описание таблицы строк в файле ресурсов

STRINGTABLE

BEGIN

IDS_HELLO “Hello”

IDS_BYE “Good bye”

END

Для загрузки строки из файла ресурсов вначале следует скопировать ее в буфер в сегменте данных приложения с помощью функции LoadString, а затем этот буфер можно использовать как обычную строку:

char szBuffer[256];

LoadString(hInst, id, szBuffer, iMaxLength);

MessageBox(hWnd, szBuffer,”Text from stringtable”,MB_OK);

Параметр id - это идентификатор строки в файле описания ресурсов, например IDS_BYE; iMaxLength – максимальное число передаваемых в szBuffer символов.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-02 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: