C++ 从wxWidgets中的.DLL加载图标

C++ 从wxWidgets中的.DLL加载图标,c++,windows,wxwidgets,C++,Windows,Wxwidgets,我试图通过从系统DLL加载来加载Windows中的wxIcon(mime系统告诉我此类文件类型的图标在DLL中),例如 这失败了,但我想知道除了使用本机Win32函数之外,在代码库中是否还有其他加载方法 另外,如果有本机Win32函数,有人知道它们是什么吗 编辑:我尝试了以下操作,但没有成功: ::wxInitAllImageHandlers(); wxMimeTypesManager manager; wxFileType* type = manager.GetFileTypeFromExte

我试图通过从系统DLL加载来加载Windows中的wxIcon(mime系统告诉我此类文件类型的图标在DLL中),例如

这失败了,但我想知道除了使用本机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\u TYPE\u ICO
而不是
wxBITMAP\u TYPE\u图标(注意N),那么效果很好,而且我将测试代码放在我的应用程序的构造函数中,而不是放在
::OnInit
。它在OnInit中起作用,但在构造函数中不起作用,所以这是一个教训!
感谢大家的帮助和快速响应,非常感谢。如果您指定type
wxBITMAP\u type\u ICO
LoadFile()
的第一个参数必须在使用
wxBITMAP\u type\u ICO
(这确实是从文件加载图标时需要使用的,而不是当前模块的资源),也就是说,您还缺少末尾的
;N
部分,其中
N
wxFileTypeInfo::GetIconIndex()
返回的值

但是为了避免显式地处理这个问题,您应该只使用
wxFileType::GetIcon()
并从它填充的
wxIconLocation
构造
wxIcon

例如,这:

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的图标的预期消息。

wxIcon::LoadFile
对我来说失败。它找不到wxBITMAP_TYPE_图标的处理程序。该函数中尝试使用wxBITMAP/wxImage加载的回退也失败。我使用::wxInitAllImageHandlers()加载所有图像处理程序但是没有乐趣。任何其他提示都会受到欢迎,再次感谢。我愚蠢地使用了
wxBITMAP\u TYPE\u图标
,而不是
wxBITMAP\u TYPE\u图标
。谢谢!谢谢-当传递一个wxIconLocation时,在wxIcon的构造函数中调用LoadFile也失败了(我认为没有处理程序)。我没有修改用于在Windows上构建的默认wxWidgets设置;是否有适当的图像处理程序所需的任何特定选项?不确定您出了什么问题。
wxIcon
wxBitmap
使用的处理程序不是
wxImage
处理程序,不需要初始化,它们始终是构建的在本机的
::ExtractIcon()
函数中并转发给它。它确实对我有效,请参阅更新的示例。好吧!这很有效!请注意,它在MyApp::OnInit中有效,而不是在构造函数中,因此这两者之间一定发生了其他事情。此外,
wxBITMAP\u TYPE\u ICO
也有效,但
wxBITMAP\u TYPE\u ICON
(注意N)没有。谢谢!库尚未初始化。当构建
wxApp
对象时,您不能在其中执行任何非琐碎的操作,这就是
OnInit()
存在的原因(另请参见
OnExit()
).Thank-当然,我通常不会在构造函数中执行任何操作,但只针对此测试代码执行。再次感谢。您发布的第二组代码对我有效。尽管根据wxMimeTypesManager的文档,“应用程序不应该构造自己的管理器:它应该使用对象指针wxTheMimeTypesManager”,因此第二行可能应该删除,第三行应该是
wxFileType*type=::wxTheMimeTypesManager->GetFileTypeFromExtension(“sys”);
但是我得到了一个有效的wxIcon对象,不管有没有更改。@NewPagodi谢谢,是的,我修改了我的代码。我的第二个示例只有在
中调用时才有效::OnInit
但是我把我的测试代码放在了构造函数中。显然,在构造和
OnInit
调用之间发生了一些事情。我还愚蠢地使用了
wxBITMAP\u TYPE\u图标(不起作用)而不是
wxBITMAP\u TYPE\u图标(起作用)。谢谢!
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");