C++ 从wxWidgets中的.DLL加载图标
我试图通过从系统DLL加载来加载Windows中的wxIcon(mime系统告诉我此类文件类型的图标在DLL中),例如 这失败了,但我想知道除了使用本机Win32函数之外,在代码库中是否还有其他加载方法 另外,如果有本机Win32函数,有人知道它们是什么吗 编辑:我尝试了以下操作,但没有成功:C++ 从wxWidgets中的.DLL加载图标,c++,windows,wxwidgets,C++,Windows,Wxwidgets,我试图通过从系统DLL加载来加载Windows中的wxIcon(mime系统告诉我此类文件类型的图标在DLL中),例如 这失败了,但我想知道除了使用本机Win32函数之外,在代码库中是否还有其他加载方法 另外,如果有本机Win32函数,有人知道它们是什么吗 编辑:我尝试了以下操作,但没有成功: ::wxInitAllImageHandlers(); wxMimeTypesManager manager; wxFileType* type = manager.GetFileTypeFromExte
::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中起作用,但在构造函数中不起作用,所以这是一个教训!
感谢大家的帮助和快速响应,非常感谢。如果您指定typewxBITMAP\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");