有没有办法从内存文件处理程序加载图标?

时间:2010-12-22 21:09:37

标签: c++ icons wxwidgets

我正在编写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时,我仍然会遇到同样的困境。有什么明显的东西我不见了吗?

3 个答案:

答案 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);