
- •Глава 9 Значки, курсоры, битовые образы и строки
- •Компиляция ресурсов
- •Значки и курсоры
- •Редактор изображений
- •Получение описателя значков
- •Использование значков в вашей программе
- •Использование альтернативных курсоров
- •Битовые образы: картинки в пикселях
- •Использование битовых образов и кистей
- •Символьные строки
- •Использование ресурсов-символьных строк
- •Использование ресурсов-строк в функции MessageBox
- •Ресурсы, определяемые пользователем
Глава 9 Значки, курсоры, битовые образы и строки
В большинство программ для Windows включаются пользовательские значки, которые Windows выводит на экран в левом верхнем углу строки заголовка окна приложения. Кроме этого Windows выводит на экран значок программы в списках программ меню Start, или в панели задач в нижней части экрана, или в списке программы Windows Explorer. Некоторые программы — наиболее известными из которых являются графические программы для рисования, например Windows Paint, используют собственные курсоры мыши для отражения различных действий программы. В очень многих программах для Windows используются окна меню и диалога. Вместе с полосами прокрутки окна меню и диалога — это основа стандартного пользовательского интерфейса Windows.
Значки, курсоры, окна меню и диалога связаны между собой. Все это виды ресурсов (resources) Windows. Ресурсы являются данными, и они хранятся в .EXE файле программы, но расположены они не в области данных, где обычно хранятся данные исполняемых программ. Таким образом, к ресурсам нет непосредственного доступа через переменные, определенные в исходном тексте программы. Они должны быть явно загружены из файла с расширением .EXE в память.
Когда Windows загружает в память код и данные программы для ее выполнения, она обычно оставляет ресурсы на диске. Только тогда, когда Windows нужен конкретный ресурс, она загружает его в память. Действительно, вы могли обратить внимание на такую динамическую загрузку ресурсов при работе с Windows-программами. Когда вы первый раз вызываете окно диалога программы, Windows обычно обращается к диску для копирования ресурса окна диалога из файла с расширением .EXE программы в оперативную память.
В книге будут рассмотрены следующие ресурсы:
Значки (icons)
Курсоры (cursors)
Битовые образы (bitmaps)
Символьные строки (character strings)
Ресурсы, определяемые пользователем (user defined resources)
Меню (menus)
Быстрые комбинации клавиш (keyboard accelerators)
Окна диалога (dialog boxes)
В этой главе рассказывается о первых пяти ресурсах из приведенного списка. О меню и быстрых комбинациях клавиш рассказывается в главе 10, об окнах диалога — в главе 11.
Компиляция ресурсов
При создании программы ресурсы определяются в файле описания ресурсов (resource script), который представляет собой ASCII-файл с расширением .RC. Файл описания ресурсов может содержать представление ресурсов в ASCII-кодах, а также может ссылаться и на другие файлы (ASCII или бинарные файлы), в которых содержатся остальные ресурсы. С помощью компилятора ресурсов (файл RC.EXE) файл описания ресурсов компилируется и становится бинарным файлом с расширением .RES. Задав в командной строке LINK файл с расширением .RES, вы можете заставить компоновщик включить скомпилированный файл описания ресурсов в файл с расширением .EXE программы вместе с обычными кодом и данными программы из файлов с расширением .OBJ и .LIB.
В командной строке можно компилировать файл описания ресурсов с расширением .RC, превращая его, таким образом, в бинарный файл с расширением .RES, путем выполнения команды:
RC — r — DWIN32 filename.RC
Эта команда создает бинарный файл с именем filename.RES. Большинство программистов, пишущих программы для Windows, дают файлу описания ресурсов то же имя, что и самой программе.
В приведенной выше командной строке параметр -r заставляет компилятор ресурсов создать файл с расширением .RES и сохранить его на диске. Это необязательно, но делается почти всегда. Параметр -DWIN32 определяет константу (WIN32), которая показывает, что скомпилированный файл описания ресурсов должен храниться в 32-разрядном формате, предназначенном для Windows 95 и Windows NT. Одна из причин определения константы WIN32 состоит в том, что текстовые строки, появляющиеся в окнах меню и диалога, хранятся в формате Unicode, по два байта на каждый символ. Если вы сделаете распечатку файла с расширением .RES в шестнадцатеричном формате, то увидите, что все ASCII-символы в окнах меню и диалога разделены нулями. Не волнуйтесь — это нормально.
До появления Windows 95 компилятор файла описания ресурсов был способен, помимо своей основной задачи, еще и добавлять скомпилированные ресурсы в файл с расширением .EXE, созданный компоновщиком. Компоновщик, поставляемый с Microsoft Visual С++ версии 4.0 для Windows 95 выполняет всю эту работу. Просто укажите файл с расширением .RES рядом с файлом (или файлами) с расширением .OBJ в командной строке LINK.
Процедура компиляции ресурсов отражена в новой секции уже хорошо нам знакомого make-файла. Наряду с компиляцией исходных текстов программы на языке С, вы следующим образом компилируете файл описания ресурсов:
progname.res : progname.rc [progname.h] [остальные файлы]
$(RC) $(RCVARS) progname.rc
Макросы RC и RCVARS заданы переменными окружения соответственно как "rc" и "-r -DWIN32". Как уже отмечалось, заголовочный файл .H может быть также определяющим файлом. Действительно, в описание ресурсов вы можете добавить заголовочный файл. Кроме того этот заголовочный файл обычно также включается в файл с исходным текстом программы на С и содержит определения идентификаторов, которые программа использует для ссылки на ресурсы. Также было показано, что в списке зависимостей возможно появление и других файлов. Это те файлы, на которые в описании ресурсов имеется ссылка. Обычно это бинарные файлы со значками, курсорами и битовыми образами.
Компилятор ресурсов RC.EXE использует препроцессор, который может учитывать добавленные и удаленные константы, определять символы ограничителей комментариев /* и */, и директивы препроцессора С #define, #undef, #ifdef, #ifndef, #include, #if, #elif, #else и #endif. Директива #include здесь работает несколько иначе, чем в обычных программах на С. (Более детально мы это исследуем в главе 11.)
Другим изменением make-файла при использовании ресурсов является то, что файл с расширением .RES (наряду со всеми файлами с расширением .OBJ) для целевого файла с расширением .EXE становится определяющим файлом.