Ресурсы
Практически в каждой программе используются ресурсы. Файл описания ресурса RC определяет такие компоненты, как меню, диалоговые окна, пиктограммы, растровые изображения и другие данные ресурсов, применяемые в приложении. Файл ресурса позволяет отказаться от использования отдельных файлов, считываемых приложением. Ресурсы эффективны также потому, что загружаются в память только по мере необходимости.
Файлы описания ресурса транслируются транслятором ресурса (обычно называемым RC.EXE), который вырабатывает файл RES. После компоновки выполняемого файла (ЕХЕ) файл RES присоединяется к концу выполняемой программы. После этого все ресурсы, определенные в файле RC, становятся частью выполняемого файла и могут применяться во время выполнения программы.
Файлописанияресурса
Все ресурсы, используемые приложением, должны быть определены в файле описания ресурса. В листинге 7.1 показан простой файл описания ресурса с однострочным ресурсом, ICON, и многострочным ресурсом, MENU.
Листинг 7.1. Простойфайлописанияресурса____________________________________________
#include <windows.h> #include "myapp.h"
// Однострочноеописаниересурса МуАррICONmyapp.ico
// Многострочноеописаниересурса
МуАррMENU
BEGIN
POPUP "SFile"
BEGIN
MENUITEM "Ebxit", IDM_EXIT
END
MENUITEM "«Test!", IDMJTEST
POPUP "SHelp"
BEGIN
MENUITEM " bAbout MyApp . . . " , IDM_ABOUT
ENDEND
Этот файл описания ресурса включает файл используемой в приложении пиктограммы и определяет главное меню приложения.
Существует пять типов однострочного описания ресурса: BITMAP, CURSOR, ICON. FONT и MESSAGETABLE. Каждый из этих операторов загружает файл данных указанного типа в данные ресурса. После включения этих данных в данные ресурса могут применяться функции LoadBitmap, LoadCursor и Loadlcon для непосредственного доступа к соответствующим данным в программе. Функция AddFontResource обычно используется для добавления данных шрифта, применяемых в приложении. Для загрузки сообщений из файла ресурса служит функция FormatMessage. Существует пять типов многострочного описания ресурса: ACCELERATORS, DIALOG, MENU, RCDATA и STRINGTABLE. Первые три рассматриваются в главе 6 и главе 8. Операторы RCDATA и STRINGTABLE рассматриваются далее в этой главе. Многострочные типы описания ресурсов легко распознать. В них для определения блоков данных ресурса используются операторы BEGIN и END, как показано для типа MENU в листинге 7.1.
Таблицы строк
В большинстве приложений в сообщениях и текстовом выводе применяются символьные строки. В системе Windows в качестве альтернативы обычному методу размещения строк в области статических данных программы предусмотрены таблицы строк. Символьные строки определяются в файле описания ресурса и приобретают идентификационное значение. Ниже приведен пример таблицы строк:
STRINGTABLE
BEGIN
IDS_STRING1 "Simple string from .RC"
IDS_STRING2 "This text contains a \ttab,\nand a new line."
IDS_STRING3 "This text is used with wsprintf() %s %d."
END
Идентификационные значения строк обычно определяются в отдельном файле заголовка, который включен в файл описания ресурса, наряду с модулем, обеспечивающим доступ к строкам. Когда в приложении необходимо использовать эти данные, функция LoadString копирует символьные данные из файла ресурса в буфер памяти. Строки в таблице могут содержать управляющие символы, такие как символы табуляции и символы новой строки.
Применение таблиц строк имеет ряд преимуществ, основное из которых — сокращение объема используемой памяти. Строки не загружаются до тех пор, пока они не потребуются. Система Windows загружает строки блоками с учетом идентификационных номеров строк. Строки, которые с наибольшей вероятностью будут использоваться совместно, должны быть пронумерованы последовательно в пределах небольших групп.
Преимущество использования таблиц строк исчезает, если строковые данные копируются в статический буфер памяти. Буфер занимает место, даже если в него не загружаются символьные данные из таблицы строк. Приложения должны загружать строки в стековые переменные (локальные переменные для блока кода) или в глобально распределенную память.
Еще одним преимуществом помещения строк в таблицу строк является поддержка нескольких языков. API Win32 поддерживает многоязычные ресурсы в одном приложении. Одна и та же выполняемая программа может поставляться в несколько стран без изменений.
Ресурсы, определяемые пользователем
Файлы ресурса могут также применяться для других типов статических данных, к которым относится все, что угодно, — от метафайлов до произвольных двоичных данных. Для произвольных данных используется оператор RCDATA в описании ресурсов. Пример применения этого оператора приведен ниже:
DatalDRCDATABEGIN
3
40
0x8232
"StringData (continued)... "
"MoreStringDataNO" END
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.