Есть ли способ загрузить значок из обработчика файла памяти? - PullRequest
0 голосов
/ 23 декабря 2010

Я пишу приложение 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 ]

1 голос
/ 23 декабря 2010

Вы пытаетесь установить значки приложений?Тогда посмотрите 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 голос
/ 28 марта 2013

Я определил, что не было средств для загрузки набора значков непосредственно из виртуальной файловой системы. Однако я нашел способ сделать это следующим образом:

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);
}
0 голосов
/ 23 декабря 2010

См. Png2wx.pl для примера того, как встраивать иконки в исполняемый файл;затем он доступен в виде символа C, например

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