在VC下使用资源,通常都是先在resource.h中定义一个整数,比如:
#define IDI_LIGHTNING_R 200 // 程序图标
然后在resource.rc中定义这个图标:
IDI_LIGHTNING_R ICON "icons\\lightning_r.ico"
读取图标的时候则用:
::LoadIcon(h, MAKEINTRESOURCE(IDI_LIGHTNING_R));
这样的形式。用wxWidgets也想当然地这样做了,结果用
pMainWnd->SetIcon(wxICON(IDI_LIGHTNING_R));
无论如何不起作用。
看了下wxWidgetes代码:
#define wxICON(X) wxIcon(wxT(#X))
直接将IDI_LIGHTNING_R转换成了一个字符串,调用wxIcon的构造函数。
wxIcon::wxIcon(const wxString& iconfile,
long flags,
int desiredWidth,
int desiredHeight)
{
LoadFile(iconfile, flags, desiredWidth, desiredHeight);
}
往下看LoadFile:
bool wxIcon::LoadFile(const wxString& filename,
long type,
int desiredWidth, int desiredHeight)
{
UnRef();
wxGDIImageHandler *handler = FindHandler(type);
if ( !handler )
{
// load via wxBitmap which, in turn, uses wxImage allowing us to
// support more formats
wxBitmap bmp;
if ( !bmp.LoadFile(filename, type) )
return false;
CopyFromBitmap(bmp);
return true;
}
return handler->Load(this, filename, type, desiredWidth, desiredHeight);
}
嗯,查找读取图标的Handler,然后用它来完成实际操作,图标的Handler由wxICOResourceHandler这个类来完成,看其Load方法:
virtual bool Load(wxGDIImage *image,
const wxString& name,
long flags,
int desiredWidth, int desiredHeight)
{
wxIcon *icon = wxDynamicCast(image, wxIcon);
wxCHECK_MSG( icon, false, _T("wxIconHandler only works with icons") );
return LoadIcon(icon, name, flags, desiredWidth, desiredHeight);
}