Используем png для иконок и храним ресурсы в архиве

December 24th, 2008 Begemot

Со временем я пришел к выводу что иконки лучше хранить в PNG, чем в XPM. Несомненый плюс это наличие альфа-канала. К тому же хранение иконок вне exe файла позволяет пользователю заменить используемые иконки на свои, что дает возможность правильно использовать для вашего приложения графику под LGPL лицензией (Где брать бесплатные иконки).

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

Я написал пару врапперов для удобной работы:

[sourcecode language=”cpp”]
// don’t forget call wxFileSystem::AddHandler(new wxZipFSHandler); in MyApp::OnInit()
wxImage BegUtils::GetImageFromZipResource(const wxString & path, long type/*=wxBITMAP_TYPE_ANY*/)
{
scoped_ptr fs(new wxFileSystem);
scoped_ptr file(fs->OpenFile(path));
if (!file) return wxNullImage;

wxInputStream* stream = file->GetStream();
wxImage image(*stream, type);

return image;
}

// Load a text resource from zip file
// don’t forget call wxFileSystem::AddHandler(new wxZipFSHandler); in MyApp::OnInit()
wxString BegUtils::GetUTF8TextFromZipResource(const wxString& path)
{
scoped_ptr fs(new wxFileSystem);
scoped_ptr file(fs->OpenFile(path));
if (!file) wxEmptyString;

wxInputStream* stream = file->GetStream();
size_t sz = stream->GetSize();
scoped_array buf(new char[sz]);
stream->Read((void*) buf.get(), sz);

wxString text = wxString::FromUTF8(buf.get(), sz);
if (text[0]==0xFEFF) text.erase(0, 1); // BOM
return text;
}
[/sourcecode]

 

Использование примерно такое

 

[sourcecode language=”cpp”]
wxString resPath=exePath+wxT(“resource.bin#zip:”);

#define MMB(x) BegUtils::GetImageFromZipResource(resPath+wxT(“icons\\”)+x+wxT(“.png”), wxBITMAP_TYPE_PNG)

AppendMenuItemWithImage(itemMenu, wxID_HELP, _T(“Help\tF1”), _T(“”), MMB(wxT(“help”)));
AppendMenuItemWithImage(itemMenu, wxID_ABOUT, _T(“About\tAlt+F1”), _T(“”), MMB(wxT(“information”)));
….
m_ToolBar->AddTool(wxID_EXIT, _T(“”), MMB(wxT(“exit”)), wxNullBitmap, wxITEM_NORMAL, _T(“Terminate Application (Alt+X)”), wxEmptyString);
….
#undef MMB
[/sourcecode]

AppendMenuItemWithImage можно взять в wxMenu с иконками и обход выделенных атемов в wxListCtrl

Пользуйтесь на здоровье.