Как создать файл resource h

Обновлено: 06.07.2024

Несколько не по теме вопроса, но вот (это я сам набивал, ушло 2 недели пока я не понял как надо делать). Это кусок большой HTML.

Работа с ресурсами Visual С++.

Прежде чем что-то делать, файл следует дочитать до конца!

Работа с ресурсами через VC++6.

Файлы
Во вновь созданном проекте Visual есть несколько файлов, связанных с ресурсами, самые важные из которых resource.h, называемый заголовочным файлом проекта, и юююю.rc (файл ресурсов). Заголовочный файл содержет набор констант – ID ресурсов.

В resource.h есть строки

эти числа определяют ID-номера добавляемых ресурсов.

Если Resource.h перемещен, то при компиляции *.rc он не ищется в путях компиляции проекта. Надо писать полный путь (относительно чего - не знаю, толи rc, толи dsp, т.е. проекта). Еще желательно прописать путь к подключаемым в rc файлам в настройках_проекта->ресурсы->добавочные_каталоги_resource_include

Внимание: В случае, если к файлу resource.h в файле rc прописан не полный путь, а путь задан только в настройках проекта, то сам файл будет найден, но есть риск того, что появится второй (лишний) resource.h файл в том же каталоге, что и rc. Так делать не надо!

Файлы *.aps – бинарные файлы неизвестной структуры, предположительно связанные с ресурсами. Есть основания полагать, что работа с ресурсами через редактор ресурсов происходит следующим образом:

редактор ищет файл aps, если находит, то надо перейти к п.5
открывается файл rc
анализируется содержание файла rc
создается файл aps, хранящий предположительно полную информацию (с точки зрения программистов Microsoft) о ресурсах
при редактировании на основании данных, извлекаемых из файлов aps, редактируются файлы rc.


То, что файлы aps не используются при компиляции проекта, создают ощущение их ненужности. Это не так! Повреждение файла aps является «отложенной» проблемой, т.к. это повреждение неожиданно проявится только при следующей правке ресурсов.

Применение редактором ресурсов файлов aps предлагает 2 варианта:

редактировать файл ресурсов только через редактор ресурсов VC++
полностью отказаться от реактирования rc-файла через редактор ресурсов VC++
Правка файла rc или resource.h будет иметь силу только до того момента, пока редактор ресурсов VC++ не перезапишет эти файлы на основании данных из файлов aps.

Внимание: В случае потери файлов aps не происходит ошибок компиляции, и VC++ создает файлы aps с содержанием по умолчанию (п.4), что в последствии приводит к плохо отлаживаемым ошибкам – есть основания полагать, что файлы aps, созданные по умолчанию, не всегда корректны. Также есть основания полагать, что работа редактора ресурсов с файлами aps в целом плохо отлажена.

Внимание: есть основание полагать, что формат файлов aps зависит от версии (поставки) VC++6.0.

Ресурсы, допускающие включение в другие проекты.

Для правки файлов rc есть специальная закладка. Окно Class Wisard, закладка ResourceView, контекстное меню Resource Includes. Выводит диалог. Там важны 2 поля: “Symbol header file” и “R/o header directives”.

Данные, прописанные в этих полях, будут автоматически будут вноситься в rc.

Поле “заголовочный файл” задает тот файл, куда редактор ресурсов добавляет новые id-шники (как я понял). Во второй задаются дополнительные директивы препроцессора (в первую очередь include, обеспечивающие подключение внешних файлов). При этом заголовочный файл задается независимо от подключаемых; заголовочный файл должен быть явно прописан отдельной строкой include в “R/o header directives”.

Внимание: настройки, заданные в этом диалоге, сохраняются в файлах *.aps.

Перемещение и переименование файлов ресурсов.

Корректно созданный набор сесурсов предполагает, что

1) ресурсы (*.rc, *.bmp, *.cur и т.д.) перемещены в каталог res, заголовочный файл перемещен в каталог hpp.

2) файлы ресурсов имеют осмысленные имена, включающие в себя имя проекта (вида ModuleNameResource.hpp)

Теперь вместо resource.h будет использоваться файл ..hppModuleNameResource.hpp.

В этот момент надо сохраниться и отладиться.

Перемещение файлов rc.

После того, как заголовочный файл успешно переименован и перемещен, надо rc со всеми bmp и прочими файлами переместить в каталог ..res. Для этого надо

1) старые *.rc удалить из проекта (!это важно – сначала надо выкинуть *.rc из файлов проекта!)

2) дать файлам rc осмысленное имя и переместить файлы

3) добавить файлы снова, уже под новым именем

Структура тестового проекта, имеющего экспорт-ресурсы.

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

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

Во втором файле ресурсов предполагается держать ресурсы-экспорт.

Разделение ресурсов необходимо из соображений очистки от всего лишнего экспорт- ресурсов.

ID-шники разных ресурсов первого типа (локальных) из разных проектов могут пересекаться, в то время как диапазоны ID экспортных ресурсов должны быть заранее поделены.

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

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

Включение в проект дополнительных ресурсов.

Известно, что (указано выше):

1) в проект нельзя добавить 2 или более файлов res (компилированных ресурсов), или файлов rс (не компилированных)

2) добавление ресурсов в проект с выходом lib, приводит к их компиляции, но после этого результат компиляции ресурсов отбрасывается

Объединение ресурсов можно проводить 2-мя способами

создать отдельный rc-файл и в него в текстовом редакторе добавить все остальные файлы ресурсов. В дальнейшем редактировать этот файл средствами редактора ресурсов VC++ нельзя.
для правки существующего rc-файла проекта использовать поле диалога “R/o header directives” (см.выше). При этом для корректной компиляции желательно прописать новый каталог в ProjectSettings->resource->AdditionalResourceDir.


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

В бесплатной MS Visual C++ 2010 Express редактор ресурсов отсутствует. Но это не беда, ведь ресурсы (и скрипты для них) можно создавать в сторонних редакторах. После чего их останется только импортировать в MSVC++. Хороший пример - редактор ResEdit. О нём мы и расскажем в данной статье.

Содержание

Структура исполняемого PE-модуля (теория)

Сокращение PE расшифровывается как Portable Executable (от англ. "переносной исполняемый"). Данный формат пришёл из UNIX, где аналогичный формат назывался COFF (Common Object File Format - Стандартный формат объектных файлов). Microsoft подвергла COFF-формат значительной переработке и в теперешнем виде исполняемые PE-файлы используются в среде Windows повсеместно. В группу PE-файлов входят:

  • Исполняемые файлы приложений Windows (.exe);
  • Динамически подсоединяемые библиотеки (Dynamic Link Library - DLL);
  • Объектные модули (obj);
  • Драйверы режима ядра.

Главной особенностью PE-модуля является простота его загрузки в память, для чего он не требует какой-либо дополнительной настройки. По сути, PE-модуль содержит слепок участка оперативной памяти. По своей структуре PE-файл чем-то напоминает слоёный пирог (см. Рис. 1). На Рис. 1 изображена общая схема PE-формата исполняемого модуля. В самом первом разделе (на рисунке он изображён сверху) разработчики отдали дань совместимости с операционной системой MS-DOS. Данный раздел давно ушёл в прошлое вместе с самой MS-DOS, но именно с него по сей день начинается любой исполняемый файл Win32. Два первых байта (MZ) - это т.н. сигнатура, которая подтверждает, что перед нами исполняемый модуль ОС MS-DOS.

Любопытный факт

Сокращение MZ - это инициалы сотрудника компании Microsoft Марка Збиковски (Mark Zbikowscki), разработчика структуры исполняемых модулей в ОС MS-DOS.

Сразу после заголовков MZ и PE располагается таблица секций, состоящая из структур по 40 байтов каждая. Вот наиболее часто встречающиеся секции, генерируемые различными компиляторами 1 :

Секция Описание
.text Секция содержит исполняемый код (Microsoft).
CODE Секция содержит исполняемый код (Borland).
.data Секция, содержащая инициализированные глобальные переменные (Microsoft).
DATA Секция, содержащая инициализированные глобальные переменные (Borland).
.bss Все неинициализированные данные; размер секции в фале равен нулю.
.CRT Секция, содержащая инициализированные данные (Microsoft).
CRT Секция, содержащая инициализированные данные (Borland).
.rdata Данные доступны только для чтения (константы, отладочная информация).

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

Ресурсы исполняемых PE-файлов (тоже теория)

Форматы исполняемых файлов, используемых в Windows, позволяют хранить внутри них особые типы данных - ресурсы.
К стандартным ресурсам Windows относятся:

  • Диалоговые окна (Dialog)
  • Значки (Icons)
  • Определения меню (Menu)
  • Определения панелей инструментов (Toolbar)
  • Растровые изображения (Bitmap)
  • Курсоры мыши (Cursor)

Кроме стандартных, программист может сам определить свои собственные ресурсы.
Помимо редактора ресурсов, MS Visual C++ также включает в себя встроенный язык описания ресурсов. Его директивы можно увидеть, если открыть в текстовом редакторе, предварительно созданный в MS Visual C++, шаблон ресурсов (фaйл с расширением .rc).
Ресурсы можно создавать двумя способами:

  • Описать ресурсы программы в текстовом ASCII файле с расширением RC. (Этот способ практически не используется).
  • Создать ресурс при помощи специализированного редактора ресурсов в режиме WYSIWYG (What You See Is What You Get – “что видишь, то и получаешь”).

В состав MS Visual C++ всех версий (кроме бесплатных редакций Express) входит редактор ресурсов, позволяющий визуально создавать и редактировать стандартные виды ресурсов. На самом деле это не один, а несколько редакторов (для каждого вида ресурсов), но в литературе их часто рассматривают как один. После компиляции Проекта все задействованные в нём ресурсы включаются в результирующий файл.
Существуют и другие редакторы ресурсов от сторонних производителей (ResEdit, PE-Editor, Resource Workshop и др.). Все они имеют схожий функционал и пользовательский интерфейс, не требующий много времени на освоение.

Создаём базовое оконное приложение Windows

В статье, расположенной по вышеприведённой ссылке, мы создаём пустое Решение/Проект Test01, добавляем в него файл исходного кода Main.cpp, вводим исходный код базового оконного приложения и отправляем Проект на компиляцию.
Далее будем работать с этим Проектом (Test01). Поэтому.

  • Создай Проект базового оконного приложения Test01, следуя инструкциям статьи Создание приложений (Cpp, Win32), если не сделал этого ранее.
Обрати внимание

Напомним, проект изначально должен быть пустым, для чего ставится соответствующая галка в мастере (см Рис. 1).

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

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

Большинство ресурсов создаются путем выбора нужного из диалогового окна «Добавить ресурс».

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

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

Большинство ресурсов создаются путем выбора нужного из диалогового окна «Добавить ресурс».

Добавить ресурс

Диалоговое окно Add Resource предоставляет обширный список ресурсов, которые можно использовать в соответствии с требованиями, но если вам нужно что-то, что недоступно, вы можете добавить его вручную в файл * .rc перед выполнением программы.

Диалоговое окно Add Resource предоставляет обширный список ресурсов, которые можно использовать в соответствии с требованиями, но если вам нужно что-то, что недоступно, вы можете добавить его вручную в файл * .rc перед выполнением программы.

Идентификаторы

Символы предоставляют описательный способ обращения к ресурсам и объектам пользовательского интерфейса как в исходном коде, так и во время работы с ними в редакторах ресурсов.

Когда вы создаете новый ресурс или объект ресурса, редакторы ресурсов предоставляют имя ресурса по умолчанию, например, IDC_DIALOG1, и присваивают ему значение.

Определение «имя-плюс-значение» хранится в файле Resource.h.

Символы предоставляют описательный способ обращения к ресурсам и объектам пользовательского интерфейса как в исходном коде, так и во время работы с ними в редакторах ресурсов.

Когда вы создаете новый ресурс или объект ресурса, редакторы ресурсов предоставляют имя ресурса по умолчанию, например, IDC_DIALOG1, и присваивают ему значение.

Определение «имя-плюс-значение» хранится в файле Resource.h.

CMFCDialogDemo

Identifiers2

Иконки

На рамке окна оно отображается слева от названия окна в строке заголовка.

В проводнике Windows, на рабочем столе, в моем компьютере или в окне панели управления.

На рамке окна оно отображается слева от названия окна в строке заголовка.

В проводнике Windows, на рабочем столе, в моем компьютере или в окне панели управления.

Если вы посмотрите на наш пример MFCModalDemo, вы увидите, что Visual Studio использовала значок по умолчанию для строки заголовка, как показано на следующем снимке.

Вы можете создать свой собственный значок, следуя инструкциям ниже:

Выберите Добавить ресурсы

Модальный Демо

Меню позволяют вам упорядочивать команды логично и легко найти. С помощью редактора меню вы можете создавать и редактировать меню, работая непосредственно со строкой меню, которая очень похожа на строку в готовом приложении. Чтобы создать меню, выполните следующие действия:

Добавить ресурсы меню

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

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

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

С учетом всех плюсов и минусов последний вариант в большинстве случаев является предпочтительным. О нем мы и поговорим.

Реклама

Создание файла с описанием ресурсов

Первым делом создайте файл с описанием тех ресурсов, которые собираетесь использовать. Он имеет следующий вид (назовем его res.qrc ):

В приведенном примере мы определили один префикс: /images . Его можно считать логическим каталогом ресурсов. Таких префиксов может быть сколько угодно. Например, если в вашем приложении есть звуковые эффекты, то вы можете добавить префикс /sounds . Для создания более глубокой иерархии используйте префиксы вида /some/long/prefix .

В тег <qresource> вложены определения файлов, относящихся к соответствующему префиксу. В примере включено единственное изображение logo.jpg , но вы можете указать столько файлов, сколько необходимо. Используйте относительные пути к файлам, беря в качестве каталога отсчета - тот, в котором находится qrc -файл.

Имеет смысл явным образом распределять ресурсы по подкаталогам в файловой системе проекта. Например, изображение logo.jpg поместите в images/ . Тогда запись приобретает вид:

В этом случае логический путь к файлу logo.jpg вновь имеет вид: /images/logo.jpg .

Для краткости можно использовать псевдонимы следующим образом:

Файл доступен по логическому пути /myprefix/logo.jpg .

Затем нужно привязать заполненный qrc -файл к проекту. Для этого добавьте в ваш pro -файл строку вида:

В примере выше qrc -файл расположен на одном уровне с pro -файлом. Если вы применяете более сложную схему размещения файлов, то воспользуйтесь относительным путем.

Обратите внимание, что в QtCreator предусмотрен довольно удобный GUI-интерфейс для работы с файлами ресурсов. Чтобы создать новый qrc -файл, щелкните в контекстном меню для нужного проекта на пункт Add New. . В появившемся диалоговом окне перейдите в группу Qt и выберите Qt Resource file . После успешного создания файла ресурсов в панели проекта вы увидите новую группу Resources , появившуюся рядом с Headers и Sources . Открыв qrc -файл вы попадете в редактор ресурсов, который вполне интуитивно позволяет выполнить те же самые действия, которые мы выполняли вручную.

Реклама

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

Итак, qrc -файл готов и подключен к проекту. Осталось только воспользоваться преимуществами от его использования. И сделать это совсем не сложно:

Ключевым здесь является способ обращения к изображению (или любому другому файлу) из ресурсов. Путь строится следующим образом: сначала ставится двоеточие : , затем префикс /images , который мы сами выбрали, и наконец путь к файлу (или псевдоним) logo.jpg . В остальном все то же самое, что и при работе с обычными файлами, предназначенными только для чтения.

Заключение

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

Читайте также: