Редакторы ресурса

В операционную систему Windows введено понятие ресурса. Ресурс представляет собой некий визуальный элемент с заданными свойствами, хранящийся в исполняемом файле отдельно от кода и данных, который может отображаться специальными функциями.

Использование ресурсов дает две вполне определенные выгоды:

1. Ресурсы загружаются в память лишь при обращении к ним, т.е. реализуется экономия памяти.

2. Свойства ресурсов поддерживаются системой автоматически, не требуя от программиста написания дополнительного кода.

Описание ресурсов хранится отдельно от программы в текстовом файле (*.rc) и компилируется (*.res) специальным транслятором ресурсов. В исполняемый файл ресурсы включаются компоновщиком. Транслятором ресурсов в пакете MASM32 является RC.EXE, в пакете TASM32 - BRCC32.EXE.

 

Каждая среда программирования имеет редактор ресурсов с соответствующими возможностями. Однако, «правильные» редакторы среди них отсутствуют L, лучшее решение – Restorator resource editor (платное), XN resource editor - бесплатное.

 

Наиболее употребляемые ресурсы:

1. Иконки.

2. Курсоры.

3. Битовая картинка.

4. Строка.

5. Диалоговое окно.

6. Меню.

7. Акселераторы.

1. Иконки. Могут быть описаны в самом файле ресурсов, либо храниться в отдельном файле *.ico. Рассмотрим последний случай. Вот файл ресурсов resu.rc:

 

#define IDI_ICON1 1 IDI_ICON1 ICON "Cdrom01.ico"

 

Как видите, файл содержит всего две значимых строки. Одна строка определяет идентификатор иконки, вторая - ассоциирует идентификатор с файлом "Cdrom01.ico". Оператор define является Си-оператором препроцессора. Как вы увидите в дальнейшем, язык ресурсов очень напоминает язык Си. Откомпилируем текстовый файл resu.rc: RC resu.rc. На диске появляется объектный файл resu.res. При компоновке укажем этот файл в командной строке:

 

LINK /subsystem:windows resu.obj resu.res

 

2. Курсоры. Подход здесь полностью идентичен. Привожу ниже файл ресурсов, где определен и курсор, и иконка.

 

#define IDI_ICON1 1 #define IDI_CUR1 2 IDI_ICON1 ICON "Cdrom01.ico" IDI_CUR1 CURSOR "4way01.cur"

 

3. Битовые картинки (*.BMP). Здесь ситуация аналогична двум предыдущим. Вот пример файла ресурсов с битовой картинкой.

 

#define ВIТ1 1 BIT1 BITMAP "PIR2.BMP"

 

4. Строки. Чтобы задать строку или несколько строк используется ключевое слово STRINGTABLE. Ниже представлен текст ресурса, задающий две строки. Для загрузки строки в программу используется функция LoadString (см. ниже). Строки, задаваемые в файле ресурсов, могут играть роль констант.

 

#define STR1 1 #define STR2 2 STRINGTABLE { STR1, "Сообщение" STR2, "Версия 1.01" }

 

5. Диалоговые окна. Диалоговые окна являются наиболее сложными элементами ресурсов. В отличие от ресурсов, которые мы до сих пор рассматривали, для диалога не задается идентификатор. Обращение к диалогу происходит по его имени (строке).

 

#define WS_SYSMENU 0x00080000L

#define WS_MINIMIZEBOX 0x00020000L

#define WS_MAXIMIZEBOX 0x00010000L DIAL1 DIALOG 0, 0, 240, 120 STYLE WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX CAPTION "Пример диалогового окна" FONT 8, "Arial" { }

 

6. Меню. Меню также может быть задано в файле ресурсов. Как и диалоговое окно, в программе оно определяется по имени (строке). Меню можно задать и в обычном окне, и в диалоговом окне. Для обычного окна при регистрации класса следует просто заменить строку

 

MOV DWORD PTR [WC.CLMENNAME],0

 

на

 

MOV DWORD PTR [WC.CLMENNAME], OFFSET MENS

 

Здесь MENS - имя, под которым меню располагается в файле ресурсов. Меню на диалоговое окно устанавливается другим способом, который, разумеется, подходит и для обычного окна. В начале меню загружается при помощи функции LoadMenu, а затем устанавливается функцией SetMenu.

 

7. Акселераторы. На первый взгляд этот вопрос достаточно прост, но, как станет ясно, он потянет за собой множество других. Акселератор позволяет выбирать пункт меню просто сочетанием клавиш. Это очень удобно и быстро. Таблица акселераторов является ресурсом, имя которого должно совпадать с именем того меню (ресурса), пункты которого она определяет.

Вот пример такой таблицы. Определяется один акселератор на пункт меню MENUP, имеющий идентификатор 4.

 

MENUP ACCELERATORS { VK_F5, 4, VIRTKEY }

 

А вот общий вид таблицы акселераторов.

 

Имя ACCELERATORS

{

Клавиша 1, Идентификатор пункта меню (1) [,тип] [,параметр]

Клавиша 2, Идентификатор пункта меню (2) [,тип] [,параметр]

Клавиша 3, Идентификатор пункта меню (3) [,тип] [,параметр]

...

Клавиша N, Идентификатор пункта меню (N) [,тип] [,параметр]