Haiku OS: редактирование откомпилированных файлов ресурсов
Содержание:
1. Вступление;
2.Редактирование откомпилированных файлов ресурсов (Вы читаете данный раздел).
Для компиляции программы в IDE Paladin с последующим её связыванием с файлом ресурсов достаточно включить последний в проект так, как мы это делали с файлами исходных текстов программы. При этом в проект может быть включён как заранее откомпилированный файл ресурсов (*.rsrc), так и rdef-скрипт. В последнем случае Paladin сам осуществит компиляцию и связывание ресурсов с программой.
Включать исходные тексты изображений в rdef-скрипты вручную, как было показано выше, не слишком удобно. Для операционной системы Haiku имеется несколько программ, позволяющих редактировать откомпилированные файлы ресурсов напрямую. Наиболее известными из них являются QuickRes и Resourcer. Я рассмотрю последнюю - на мой взгляд, работать с этой программой удобнее. Впрочем, QuickRes стоит также установить в системе, поскольку в поставку этой программы входит справка, описывающая язык rdef гораздо подробнее, нежели это сделано здесь.
Итак, программу Resourcer можно загрузить на BeBits по следующей ссылке: http://www.bebits.com/bob/4874/Resourcer-x86.zip. QuickRes доступна на Haikuware: http://haikuware.com/directory/ start-download/utilities/system-system-information/quickres.
Установим Resourcer обычным способом, распаковав загруженный архив в каталог /boot. Теперь сделаем Resourcer программой по умолчанию для редактирования бинарных файлов ресурсов (*.rsrc). Для этого щёлкнем правой кнопкой мыши по файлу Lucas.rsrc нашей программы и в контекстном меню выберем Open with... — FileTypes. В окне FileTypes в группе «Предпочтительное приложение» нажмите кнопку «Выбрать...», после чего в диалоговом окне выбора файла отметьте Resourcer и в появившемся диалоговом окне нажмите кнопку «Установить предпочтительное приложение» (см. рис. ниже). Теперь при щелчке по бинарному файлу ресурсов последний будет открываться именно в программе Resourcer.
Покажем работу с редактором ресурсов на примере нашей головоломки, немного изменив её код. Унаследуем класс TChip не от класса обычной кнопки (BButton), а от класса BPictureButton. Как видно из названия, этот класс предназначен для создания кнопок с картинками. В качестве параметров конструктор класса принимают два указателя на объект типа BPicture (см. листинг 2).
Перепишем класс TChip. Объявление и реализация класса приведены в листинге 3.
Класс BPicture хранит данные, скопированные из какого-либо изображения, и отображает их на кнопке. При этом объект off хранит изображение кнопки, которая неактивна (не нажата), а объект on - той, которая активна (нажата пользователем). Таким образом, если требуется что-то увидеть на кнопке, надо либо что-то нарисовать в объекте BPicture, либо «нарисовать» данные, скопированные из изображения (BMP, PNG и т.п.), для чего в Haiku API существует другой класс - BBitmap. Последний может лишь хранить данные изображения, но не име-ет методов его отображения. Изображение отрисовывает объект класса BView (или объект класса, от него унаследованного) методом DrawBitmap.
К сожалению, класс BBitmap не предоставляет никаких методов для загрузки данных из файла BMP. Для этого необходимо использовать метод GetBitmapFile класса BTranslationUtils из набора TranslationKit. Для работы с классом необходимо подключить библиотеку libtranslation.so. Итак, загрузка изображения из файла может выглядеть следующим образом (см. листинг 4).
После этого объект класса BView должен «нарисовать» данные из объекта класса BBitmap в объекте класса BPicture.
Однако удобнее, когда изображения хранятся не во внешних файлах, а в самом приложении. Для этого запишем картинки кнопок в файл ресурсов, после чего они будут загружены в объект класса BBitmap методом GetBitmap класса BTranslationUtils.
С помощью GIMP я подготовил 4 изображения кнопок:
- white-up.png - белая кнопка, не нажата;
- white-down.png - белая кнопка, нажата;
- black-up.png - чёрная кнопка, не нажата;
- black-down.png - чёрная кнопка, нажата.
После этого открыл откомпилированный файл ресурса Lucas.rsrc в программе Resourcer и отредактировал его. Для добавления объекта ресурсов в файл нужно выбрать в меню Resource — Add Resource... Для удаления ресурса из файла необходимо выделить его в окне Resourcer и выбрать в меню Resource — Delete Resource. При выборе пункта меню Add Resource... появляется диалоговое окно New Resource Properties, в котором в выпадающем списке нужно выбрать тип добавляемого ресурса. В нашем случае это Translator Bitmap. Потом указываем номер - id ресурса и строку — его название (см. рис. ниже). Назовём объекты ресурсов соответственно файлам: white-up, white-down, black-up и black-down. После нажатия кнопки OK появится диалоговое окно просмотра добавляемого изображения. Нажмите кнопку Open..., чтобы выбрать файл картинки. Добавив все изображения, выберите в меню File — Save, чтобы сохранить изменения в файле ресурсов.
Теперь добавим в конструктор класса главной формы код загрузки изображений из ресурсов в объект класса BBitmap (см. листинг 5).
Центральный виджет приложения (TCentralWidget), унаследованный от класса BView, должен «нарисовать» данные из объекта класса BBitmap в объекте класса BPicture (см. листинг 6).
Теперь мы можем переделать головоломку так, чтобы на кнопках отображались картинки BPicture (см. листинг 7).
Соберём проект головоломки; при этом необходимо в окне системных библиотек проекта подключить библиотеку libtranslation.so (см. рис. выше). Запустим программу и убедимся, что кнопки обзавелись созданными нами изображениями (см. рис. ниже).
Нельзя не заметить, что программирование на Haiku API не слишком удобно, и многие разработчики предпочтут более привычные инструменты. Поэтому в заключительной части (следующий выпуск «Open Source») мы рассмотрим работу с портированной на Haiku библиотекой Qt 4.7.
Вы не программист, а строитель и Вас гораздо больше, чем Haiku OS интересует, где можно приобрести пазы лдсп (http://zveno-web.ru/raspil-ldsp/ugly-pazy-radiusy.html) хорошего качества и по невысокой цене? В таком случае я настоятельно советую Вам заглянуть на zveno-web.ru. Здесь Вы сможете приобрести такие изделия на максимально выгодных для себя условиях!
1. Вступление;
2.
Работа с ресурсами в Paladin IDE
Для компиляции программы в IDE Paladin с последующим её связыванием с файлом ресурсов достаточно включить последний в проект так, как мы это делали с файлами исходных текстов программы. При этом в проект может быть включён как заранее откомпилированный файл ресурсов (*.rsrc), так и rdef-скрипт. В последнем случае Paladin сам осуществит компиляцию и связывание ресурсов с программой.
Редактирование откомпилированных файлов ресурсов
Включать исходные тексты изображений в rdef-скрипты вручную, как было показано выше, не слишком удобно. Для операционной системы Haiku имеется несколько программ, позволяющих редактировать откомпилированные файлы ресурсов напрямую. Наиболее известными из них являются QuickRes и Resourcer. Я рассмотрю последнюю - на мой взгляд, работать с этой программой удобнее. Впрочем, QuickRes стоит также установить в системе, поскольку в поставку этой программы входит справка, описывающая язык rdef гораздо подробнее, нежели это сделано здесь.
Итак, программу Resourcer можно загрузить на BeBits по следующей ссылке: http://www.bebits.com/bob/4874/Resourcer-x86.zip. QuickRes доступна на Haikuware: http://haikuware.com/directory/ start-download/utilities/system-system-information/quickres.
Установим Resourcer обычным способом, распаковав загруженный архив в каталог /boot. Теперь сделаем Resourcer программой по умолчанию для редактирования бинарных файлов ресурсов (*.rsrc). Для этого щёлкнем правой кнопкой мыши по файлу Lucas.rsrc нашей программы и в контекстном меню выберем Open with... — FileTypes. В окне FileTypes в группе «Предпочтительное приложение» нажмите кнопку «Выбрать...», после чего в диалоговом окне выбора файла отметьте Resourcer и в появившемся диалоговом окне нажмите кнопку «Установить предпочтительное приложение» (см. рис. ниже). Теперь при щелчке по бинарному файлу ресурсов последний будет открываться именно в программе Resourcer.
Покажем работу с редактором ресурсов на примере нашей головоломки, немного изменив её код. Унаследуем класс TChip не от класса обычной кнопки (BButton), а от класса BPictureButton. Как видно из названия, этот класс предназначен для создания кнопок с картинками. В качестве параметров конструктор класса принимают два указателя на объект типа BPicture (см. листинг 2).
Листинг 2
BPictureButton(BRect frame, const char* name, BPicture* off, BPicture* on, BMessage* message,
uint32 behavior = B _ ONE _ STATE _ BUTTON,
uint32 resizingMode = B _ FOLLOW _ LEFT | B _ FOLLOW _ TOP,
uint32 flags = B _ WILL _ DRAW | B _ NAVIGABLE);
BPictureButton(BRect frame, const char* name, BPicture* off, BPicture* on, BMessage* message,
uint32 behavior = B _ ONE _ STATE _ BUTTON,
uint32 resizingMode = B _ FOLLOW _ LEFT | B _ FOLLOW _ TOP,
uint32 flags = B _ WILL _ DRAW | B _ NAVIGABLE);
Перепишем класс TChip. Объявление и реализация класса приведены в листинге 3.
Листинг 3
#ifndef _ TChip _ h _ #define _ TChip _ h _
#include #include #include
enum TChipColour {WhiteChip = 0, BlackChip = 1}; class TChip : public BPictureButton
{
public:
TChip(BRect ChipFrame, const char* psName, BPicture* pOffPicture, BPicture* pOnPicture, BMessage* pMessage);
int iCell; TChipColour Colour; int iMove;
};
#endif
#include "TChip.h"
TChip::TChip(BRect ChipFrame, const char* psName, BPicture* pOffPicture,
BPicture* pOnPicture, BMessage* pMessage)
: BPictureButton(ChipFrame, psName, pOffPicture,
pOnPicture, pMessage,
B _ ONE _ STATE _ BUTTON, B _ FOLLOW _ LEFT, B _ WILL _ DRAW)
{
this->Colour = WhiteChip;
}
#ifndef _ TChip _ h _ #define _ TChip _ h _
#include #include #include
enum TChipColour {WhiteChip = 0, BlackChip = 1}; class TChip : public BPictureButton
{
public:
TChip(BRect ChipFrame, const char* psName, BPicture* pOffPicture, BPicture* pOnPicture, BMessage* pMessage);
int iCell; TChipColour Colour; int iMove;
};
#endif
#include "TChip.h"
TChip::TChip(BRect ChipFrame, const char* psName, BPicture* pOffPicture,
BPicture* pOnPicture, BMessage* pMessage)
: BPictureButton(ChipFrame, psName, pOffPicture,
pOnPicture, pMessage,
B _ ONE _ STATE _ BUTTON, B _ FOLLOW _ LEFT, B _ WILL _ DRAW)
{
this->Colour = WhiteChip;
}
Класс BPicture хранит данные, скопированные из какого-либо изображения, и отображает их на кнопке. При этом объект off хранит изображение кнопки, которая неактивна (не нажата), а объект on - той, которая активна (нажата пользователем). Таким образом, если требуется что-то увидеть на кнопке, надо либо что-то нарисовать в объекте BPicture, либо «нарисовать» данные, скопированные из изображения (BMP, PNG и т.п.), для чего в Haiku API существует другой класс - BBitmap. Последний может лишь хранить данные изображения, но не име-ет методов его отображения. Изображение отрисовывает объект класса BView (или объект класса, от него унаследованного) методом DrawBitmap.
К сожалению, класс BBitmap не предоставляет никаких методов для загрузки данных из файла BMP. Для этого необходимо использовать метод GetBitmapFile класса BTranslationUtils из набора TranslationKit. Для работы с классом необходимо подключить библиотеку libtranslation.so. Итак, загрузка изображения из файла может выглядеть следующим образом (см. листинг 4).
Листинг 4
BBitmap* pWhiteOffBitmap = J
BTranslationUtils: :GetBitmapFile("white-off.bmp");
BBitmap* pWhiteOffBitmap = J
BTranslationUtils: :GetBitmapFile("white-off.bmp");
После этого объект класса BView должен «нарисовать» данные из объекта класса BBitmap в объекте класса BPicture.
Однако удобнее, когда изображения хранятся не во внешних файлах, а в самом приложении. Для этого запишем картинки кнопок в файл ресурсов, после чего они будут загружены в объект класса BBitmap методом GetBitmap класса BTranslationUtils.
С помощью GIMP я подготовил 4 изображения кнопок:
- white-up.png - белая кнопка, не нажата;
- white-down.png - белая кнопка, нажата;
- black-up.png - чёрная кнопка, не нажата;
- black-down.png - чёрная кнопка, нажата.
После этого открыл откомпилированный файл ресурса Lucas.rsrc в программе Resourcer и отредактировал его. Для добавления объекта ресурсов в файл нужно выбрать в меню Resource — Add Resource... Для удаления ресурса из файла необходимо выделить его в окне Resourcer и выбрать в меню Resource — Delete Resource. При выборе пункта меню Add Resource... появляется диалоговое окно New Resource Properties, в котором в выпадающем списке нужно выбрать тип добавляемого ресурса. В нашем случае это Translator Bitmap. Потом указываем номер - id ресурса и строку — его название (см. рис. ниже). Назовём объекты ресурсов соответственно файлам: white-up, white-down, black-up и black-down. После нажатия кнопки OK появится диалоговое окно просмотра добавляемого изображения. Нажмите кнопку Open..., чтобы выбрать файл картинки. Добавив все изображения, выберите в меню File — Save, чтобы сохранить изменения в файле ресурсов.
Теперь добавим в конструктор класса главной формы код загрузки изображений из ресурсов в объект класса BBitmap (см. листинг 5).
Листинг 5
BBitmap* pWhiteUpBitmap = BTranslationUtils::GetBitmap("white-up"); BBitmap* pWhiteDownBitmap = J
BTranslationUtils: :GetBitmap("white-down"); BBitmap* pBlackUpBitmap = BTranslationUtils::GetBitmap("black-up"); BBitmap* pBlackDownBitmap = J
BTranslationUtils: :GetBitmap("black-down");
BBitmap* pWhiteUpBitmap = BTranslationUtils::GetBitmap("white-up"); BBitmap* pWhiteDownBitmap = J
BTranslationUtils: :GetBitmap("white-down"); BBitmap* pBlackUpBitmap = BTranslationUtils::GetBitmap("black-up"); BBitmap* pBlackDownBitmap = J
BTranslationUtils: :GetBitmap("black-down");
Центральный виджет приложения (TCentralWidget), унаследованный от класса BView, должен «нарисовать» данные из объекта класса BBitmap в объекте класса BPicture (см. листинг 6).
Листинг 6
BPicture* pWhiteUpPicture; pCentralWidget->BeginPicture(new BPicture);
pCentralWidget->DrawBitmap (pWhiteUpBitmap); pWhiteUpPicture = pCentralWidget->EndPicture();
// и т.п.
BPicture* pWhiteUpPicture; pCentralWidget->BeginPicture(new BPicture);
pCentralWidget->DrawBitmap (pWhiteUpBitmap); pWhiteUpPicture = pCentralWidget->EndPicture();
// и т.п.
Теперь мы можем переделать головоломку так, чтобы на кнопках отображались картинки BPicture (см. листинг 7).
Листинг 7
fChipTop = MenuFrame.Height(); // Координаты 1-й кнопки
BRect ButtonFrame = BRect(5, fChipTop, 80, 80); pChip[0] = new TChip(ButtonFrame, "Button",
pWhiteUpPicture, pWhiteDownPicture, pChipMessage[0]);
pChip[0]->iCell = 1;
int iX = 5;
int iY = 80;
for(int i = 1; i 3)
{
j—; // Средняя ячейка свободна Colour = BlackChip;
pChip[j] = new TChip(ButtonFrame, "Button", pBlackUpPicture, pBlackDownPicture, pChipMessage[j]);
}
else {
pChip[j] = new TChip(ButtonFrame, "Button", pWhiteUpPicture, pWhiteDownPicture, pChipMessage[j]);
}
pChip[j]->iCell = i + 1;
pChip[j]->Colour = Colour;
}
}
fChipTop = MenuFrame.Height(); // Координаты 1-й кнопки
BRect ButtonFrame = BRect(5, fChipTop, 80, 80); pChip[0] = new TChip(ButtonFrame, "Button",
pWhiteUpPicture, pWhiteDownPicture, pChipMessage[0]);
pChip[0]->iCell = 1;
int iX = 5;
int iY = 80;
for(int i = 1; i 3)
{
j—; // Средняя ячейка свободна Colour = BlackChip;
pChip[j] = new TChip(ButtonFrame, "Button", pBlackUpPicture, pBlackDownPicture, pChipMessage[j]);
}
else {
pChip[j] = new TChip(ButtonFrame, "Button", pWhiteUpPicture, pWhiteDownPicture, pChipMessage[j]);
}
pChip[j]->iCell = i + 1;
pChip[j]->Colour = Colour;
}
}
Соберём проект головоломки; при этом необходимо в окне системных библиотек проекта подключить библиотеку libtranslation.so (см. рис. выше). Запустим программу и убедимся, что кнопки обзавелись созданными нами изображениями (см. рис. ниже).
Нельзя не заметить, что программирование на Haiku API не слишком удобно, и многие разработчики предпочтут более привычные инструменты. Поэтому в заключительной части (следующий выпуск «Open Source») мы рассмотрим работу с портированной на Haiku библиотекой Qt 4.7.
Вы не программист, а строитель и Вас гораздо больше, чем Haiku OS интересует, где можно приобрести пазы лдсп (http://zveno-web.ru/raspil-ldsp/ugly-pazy-radiusy.html) хорошего качества и по невысокой цене? В таком случае я настоятельно советую Вам заглянуть на zveno-web.ru. Здесь Вы сможете приобрести такие изделия на максимально выгодных для себя условиях!