Загрузить значок из .DLL в wxWidgets - PullRequest
1 голос
/ 31 января 2020

Я пытаюсь загрузить wxIcon в Windows путем загрузки из системной DLL (как система mime сказала мне, что значок для такого типа файла был в DLL), например.

wxIcon icon;
icon.LoadFile("C:\\WINDOWS\\system32\\zipfldr.dll", wxICON_DEFAULT_TYPE);

Это не удается, но мне было интересно, есть ли какой-либо способ загрузки этой базы кода, кроме обращения к собственным функциям Win32.

Кроме того, если есть собственные функции Win32, кто-нибудь знает, кто они?

РЕДАКТИРОВАТЬ: я попытался следующее безуспешно:

::wxInitAllImageHandlers();
wxMimeTypesManager manager;
wxFileType* type = manager.GetFileTypeFromExtension("sys");
wxIconLocation location;
if (type->GetIcon(&location))
{
  // location is something like C:\WINDOWS\system32\imageres.dll
  wxIcon icon;
  if (!icon.LoadFile(location.GetFileName(), wxBITMAP_TYPE_ICON /*I have tried wxICON_DEFAULT_TYPE too*/))
  {
    // Failed!
  }
}

РЕДАКТИРОВАТЬ 2: В ответ на VZ, я попытался следующее безуспешно:

::wxInitAllImageHandlers();
wxMimeTypesManager manager;
wxFileType* type = manager.GetFileTypeFromExtension("sys");
wxIconLocation location;
if (type->GetIcon(&location))
{
  // location is something like C:\WINDOWS\system32\imageres.dll,
  //with an appropriate index as retrieved by location.GetIndex(), which is -67.
  wxIcon icon(location);
  if (!icon.IsOk())
  {
    BREAK;
    // Failed!
  }
}

РЕДАКТИРОВАТЬ 3: Спасибо за помощь всем - отлично работает, если я использую wxBITMAP_TYPE_ICO вместо wxBITMAP_TYPE_ICON (обратите внимание на N ), а также я помещаю свой тестовый код в конструктор моего приложения вместо в ::OnInit. Это сработало в OnInit, но не в конструкторе, так что это урок! Спасибо всем за помощь и быстрые ответы, как всегда высоко ценю.

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Первый аргумент LoadFile() должен указывать идентификатор ресурса значков при использовании wxBITMAP_TYPE_ICO (это действительно то, что вам нужно использовать при загрузке значков из файлов, а не ресурсов текущего модуля), т.е. вы также в конце пропущена часть ;N, где N - это значение, возвращаемое wxFileTypeInfo::GetIconIndex().

Но чтобы избежать явного обращения с этим, вам нужно просто использовать wxFileType::GetIcon() и построить wxIcon из wxIconLocation, заполненный этим.

Например, это:

diff --git a/samples/minimal/minimal.cpp b/samples/minimal/minimal.cpp
index 0d91f7fc75..3623aacc56 100644
--- a/samples/minimal/minimal.cpp
+++ b/samples/minimal/minimal.cpp
@@ -123,6 +123,12 @@ bool MyApp::OnInit()
     if ( !wxApp::OnInit() )
         return false;

+    wxIcon icon(wxIconLocation(R"(c:\Windows\system32\imageres.dll)", -67));
+    if ( icon.IsOk() )
+    {
+        wxLogMessage("Loaded icon of size %d*%d", icon.GetWidth(), icon.GetHeight());
+    }
+
     // create the main application window
     MyFrame *frame = new MyFrame("Minimal wxWidgets App");

показывает ожидаемое сообщение о загрузке иконки размером 32 на 32.

1 голос
/ 01 февраля 2020

Должно работать, если вы укажете тип wxBITMAP_TYPE_ICO.

...