我正在编写wxWidgets应用程序,我将.ICO文件作为标题导入。我试图使用wxMemoryFSHandler使这个图标(以及其他人)可以作为文件访问。我使用以下代码执行此操作:
wxFileSystem::AddHandler(new wxMemoryFSHandler);
wxMemoryFSHandler::AddFileWithMimeType(
"app_inactive.ico",
CsiWebAdmin_ico,
sizeof(CsiWebAdmin_ico),
"image/vnd.microsoft.icon");
不幸的是,如果我尝试从此“文件”加载图标,如下所示,它不起作用。当我逐步完成MSW源代码(wx 2.8.10)时,我可以看到加载器从未尝试过解析虚拟文件名。
wxIcon icon("memory:app_inactive.ico");
我也尝试了以下内容:
wxIcon icon(wxIconLocation("memory:app_inactive.ico"));
并且遇到了相同的结果。
我意识到我可以使用资源来加载这些文件,但是当我将应用程序移植到GTK时,我仍然会遇到同样的困境。有什么明显的东西我不见了吗?
答案 0 :(得分:1)
您是否尝试设置应用程序图标?然后看wxIconBundle。我用这段代码:
wxFileName frameIconFile = your_resources_folder;
frameIconFile.SetFullName("appicon.ico");
wxIconBundle frameIcons(frameIconFile.GetFullPath(),wxBITMAP_TYPE_ICO);
mainFrame->SetIcons(frameIcons);
图标包(它是一个带有多个图标的文件)在应用程序启动时加载。 要构建图标包,我使用IcoFX(http://icofx.ro/)。
答案 1 :(得分:1)
我已经确定无法直接从虚拟文件系统加载图标集。然而,我已经想出了如下方法:
wxFileSystem file_system;
Csi::SharedPtr<wxFSFile> ico_file(
file_system.OpenFile(
make_wxString(config->get_control()->get_attr_wstr(L"icon"))));
if(ico_file != 0)
{
wxIconBundle icons;
wxInputStream *stream(ico_file->GetStream());
size_t image_count(wxImage::GetImageCount(*stream, wxBITMAP_TYPE_ICO));
wxImage image;
for(size_t i = 0; i < image_count; ++i)
{
if(image.LoadFile(*stream, wxBITMAP_TYPE_ICO, i))
{
wxIcon icon;
icon.CopyFromBitmap(wxBitmap(image));
icons.AddIcon(icon);
}
}
SetIcons(icons);
}
答案 2 :(得分:0)
有关如何将图标嵌入可执行文件的示例,请参阅png2wx.pl;然后它可以作为C符号使用,例如
wxMenuItem *w = some_menu->Append(id, _("text")); w->SetBitmap(*_img_exit_icon);