【问题标题】:Is there a way to load an icon from a memory file handler?有没有办法从内存文件处理程序加载图标?
【发布时间】:2010-12-22 21:09:37
【问题描述】:

我正在编写 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 时,我仍然会面临同样的困境。我有什么明显的遗漏吗?

【问题讨论】:

    标签: c++ icons wxwidgets


    【解决方案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/)。

    【讨论】:

    • 我希望避免从外部文件加载应用程序资源。但是,我打算将 .ico 文件转换为一系列 XPM 文件,这些文件可以编译到应用程序中并以这种方式加载到 wxIconBundle 中。
    【解决方案2】:

    我已确定无法直接从虚拟文件系统加载图标集。但是,我想出了一种方法,如下所示:

    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);
    }
    

    【讨论】:

      【解决方案3】:

      有关如何将图标嵌入可执行文件的示例,请参见 png2wx.pl;然后它可以作为 C 符号使用,例如

      wxMenuItem *w = some_menu->Append(id, _("text")); w->SetBitmap(*_img_exit_icon);

      【讨论】:

      • 这并没有真正解决问题。我真正的问题是为什么无法从虚拟文件系统加载图标。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      相关资源
      最近更新 更多