Я хочу создавать элементы панели инструментов и рисовать их из изображений в памяти программ, а не из файлов на диске. Я бы предпочел встраивать изображения, используя файл ресурсов (.rc), но если мне нужно как-то свернуть свои собственные, это тоже нормально.
Файлы изображений: .ico и .png.
Предполагая, что я могу использовать материал из файла .rc, как мне завершить этот код?
void MyFrame::AddToolBarItem(int ID, wxSize sz, const char* file, const char* short_help, const char *long_help) {
const char *end = file+strlen(file);
const char *dot = std::find(file, end, '.');
if(dot != end) {
// It's an external file, with an extention, like .ico or .png
wxImage im(file);
im.Rescale(sz.x, sz.y, wxIMAGE_QUALITY_HIGH);
wxBitmap bmp(im);
my_tool_bar->AddTool(ID, short_help, bmp, long_help);
} else {
// It's a resource
// What now, StackOverflow???
}
}
РЕДАКТИРОВАТЬ: Хорошо, я сделаю это проще. Забудьте о Rescale. Я могу сделать это с помощью графического редактора Gimp. Предположим, изображения правильного размера. Вы также можете предположить, что это .ico или любой другой формат, удобный для wxWidgets.
РЕДАКТИРОВАТЬ 2: Я принимаю ответ, но я решил, что лучше всего встраивать изображение «вручную», полностью избегая концепции .rc. Я написал небольшую программу для создания файла .cpp со статическими инициализаторами, но их можно найти в сети. При компиляции в программу файл .cpp создает копию файла изображения в постоянной памяти. Файл .rc специфичен для Windows, поэтому лучше не использовать его для пользовательских значков и курсоров, для переносимости. Однако имеет смысл иметь в проекте MS файл .rc, содержащий только строку «#include <wx / msw / wx.rc> «Это даст доступ к некоторым фондовым курсорам и т. д., которые доступны по умолчанию на других платформах.
Не поддерживается загрузка PNG из ресурсов в самом wx, но это легко сделать в вашем коде, см. http://wiki.wxwidgets.org/Embedding_PNG_Images#Embedding_PNG_images_into_Windows_rc_file
Обзор растровых изображений и значков дает довольно хорошее объяснение этого. По сути, после того, как вы вложили ресурс в свой файл .rc, все что вам нужно сделать, это:
wxBitmap bmp(wxBITMAP(bmpnameinrcfile));
аналогично для ico
wxIcon icon(wxICON(iconameinrcfile));