【发布时间】:2020-01-31 18:17:30
【问题描述】:
我试图通过从系统 DLL 加载来在 Windows 中加载 wxIcon(因为 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 中有效,但在构造函数中无效,所以这是一个教训!
感谢大家的帮助和快速响应,一如既往的感谢。
【问题讨论】:
-
您发布的第二组代码对我有用。虽然根据 wxMimeTypesManager 的文档,“应用程序不应该构造自己的管理器:它应该使用对象指针 wxTheMimeTypesManager”,所以第二行可能应该被删除,第三行应该是
wxFileType* type = ::wxTheMimeTypesManager->GetFileTypeFromExtension("sys");但我得到了一个有效的 wxIcon有或没有这种变化的对象。 -
@NewPagodi 谢谢,是的,我已经修改了我的代码。我的第二个示例仅在
::OnInit中调用时才有效,但我将测试代码放在构造函数中。显然,在构造和OnInit调用之间发生了一些事情。我还愚蠢地使用wxBITMAP_TYPE_ICON(不起作用)而不是wxBITMAP_TYPE_ICO(起作用)。谢谢!