C基础(wxWidgets的资源读取)

C基础(wxWidgets的资源读取),第1张

C基础(wxWidgets的资源读取),第2张

在VC下使用资源时,通常是先在resource.h中定义一个整数,比如
# definedi _ Lightning _ r200//程序图标
然后在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 wxion(x)wxion(wxt(# x))
直接把IDI _闪电_R转换成字符串,调用了wxion的构造函数。
wx icon::wx icon(const wx string & iconfile,
long flags,
int desiredWidth,
int desired height)
{
LoadFile(iconfile,flags,desiredWidth,desired height);
}
往下看loadfile:
Bool WX icon::loadfile(const WX string & filename,
long type,
int desired width,int desired height)
{[/br/
wxGDIImageHandler * handler = find handler(type);
如果(!handler )
{
//通过wxBitmap加载,而wxBitmap又使用wxImage允许我们
//支持更多格式
wx bitmap BMP;
如果(!bmp。LoadFile(文件名,类型))
返回false
copy from bitmap(BMP);
返回true
}
返回处理程序->Load(this,filename,type,desiredWidth,desired height);
}
嗯,寻找读取图标的处理程序,然后用它来完成实际的操作。图标的处理程序由wxICOResourceHandler类完成。看它的加载方法:
Virtual bool Load(wxgdiiimage * image,
const wxString& name,
long flags,
int desiredWidth,int desired height)
{
wx icon * icon = wxDynamicCast(image,wx icon);
wxCHECK_MSG( icon,false,_T("wxIconHandler只对图标有效"));
return LoadIcon(icon,name,flags,desiredWidth,desired height);
}
更改为loadicon:
Bool wxIcoResourceHandler::loadicon(wxicon * icon,
constwxString & name,
long wxunused (flags),
int desiredWidth,int desired height)
{
HICON HICON;
//我们需要特定大小的图标还是任何图标都可以?
bool hasSize = desiredWidth!= -1 || desiredHeight!= -1;
wxASSERT_MSG(!hasSize || (desiredWidth!= -1 && desiredHeight!= -1),
_T("宽度和高度要么都是-1,要么都不是"));
//首先尝试从该程序加载图标,以允许覆盖
//标准图标(尽管考虑到
//我们已经有wxApp::GetStdIcon()还不清楚为什么要这样做)
//请注意,我们不能总是调用LoadImage(),因为它似乎会在内部进行
//某些图标重新缩放,从而导致非常难看的16x16图标
if(hasSize)
{
HICON = .
}
else
{
hicon =::LoadIcon(wxGetInstance(),name);
}
…………..
wxSize size = wxGetHiconSize(hicon);
icon->SetSize(size.x,size . y);
icon-> SetHICON((wxh icon)hicon);
返回图标-> Ok();
}
最终的读取操作也将由windows API LoadIcon完成,它必须接受一个字符串作为参数。在wxWidgets中,一开始就传入了字符串“IDI _闪电_R”,并没有使用MAKEINTRESOURCE转换的字符串,自然无法正常读取资源。
对比wxWidgets自带的resource.rc文件,它没有使用resource.h,自然也没有将这个资源标志定义为整数。哦,我明白了。
修改resource.rc中icon的定义:
lightning_r icon " icons \ \ lightning _ r . ico "
这里lightning _ r是一个未定义的符号,这样vc的资源编译就会把它当作一个字符串,作为这个图标的logo。最后读取图标时使用
pmainwnd-> seticon(wx icon(lightning _ r));
一切都好!

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C基础(wxWidgets的资源读取)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情