三九宝宝网宝宝百科宝宝知识

C基础wxWidgets的资源读取

11月11日 编辑 39baobao.com

[,文件或目录损坏且无法读取]硬盘分区盘符访问不了了,文件系统显示RAW,不是NTFS,已用空间,可用空间和容量信息均为0字节,双击显示“无法访问C:,文件或目录损坏且无法读取”解决方法:方法一、在RAW格式盘符上...+阅读

在VC下使用资源,通常都是先在resource.h中定义一个整数,比如:

&emspdefine 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代码:

&emspdefine wxICON(X) wxIcon(wxT(&emspX))

直接将IDI_LIGHTNING_R转换成了一个字符串,调用wxIcon的构造函数。

wxIcon::wxIcon(const wxString

}

往下看LoadFile:

bool wxIcon::LoadFile(const wxString

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

wxCHECK_MSG( icon, false, _T("wxIconHandler only works with icons") );

return LoadIcon(icon, name, flags, desiredWidth, desiredHeight);

}

转为LoadIcon:

bool wxICOResourceHandler::LoadIcon(wxIcon *icon,

const wxString

do we need the icon of the specific size or would any icon do?

bool hasSize = desiredWidth != -1

desiredHeight != -1;

wxASSERT_MSG( !hasSize

(desiredWidth != -1

try to load the icon from this program first to allow overriding the

standard icons (although why one would want to do it considering that

we already he wxApp::GetStdIcon() is unclear)

note that we can't just always call LoadImage() because it seems to do

some icon rescaling internally which results in very ugly 16x16 icons

if ( hasSize )

{

hicon = (HICON)::LoadImage(wxGetInstance(), name, IMAGE_ICON,

desiredWidth, desiredHeight,

LR_DEFAULTCOLOR);

}

else

{

hicon = ::LoadIcon(wxGetInstance(), name);

}

…………………..

wxSize size = wxGetHiconSize(hicon);

icon->SetSize(size.x, size.y);

icon->SetHICON((WXHICON)hicon);

return icon->Ok();

}

最终的读取操作同样将由LoadIcon这个windows api完成,它必须接受一个字符串做为参数,在wxWidgets中,从开始传递进来的就是”IDI_LIGHTNING_R”这样一个字符串,它并没有使用MAKEINTRESOURCE转换得到的字符串,因而自然无法正常读取资源。

比较wxWidgets自己的resource.rc文件,它并没有使用resource.h,自然也没有将这个资源标志定义为整数。呵呵,原来如此。

在resource.rc中修改图标的定义:

lightning_r ICON "icons\\lightning_r.ico"

这里lightning_r是一个未定义的符号,这样vc的资源编译将把它做为一个字符串处理,并以此为这个图标的标识,最后读取图标的时候用:

pMainWnd->SetIcon(wxICON(lightning_r));

一切OK!

以下为关联文档:

C++Win32APIReadFile读取文件直接一起来看吧:&emspinclude&emspinclude&emspinclude&emspinclude&emspincludevoid main(){unsigned long lpNumber=0;char lpBuffer[50]=""; Examda提示:文件读...

C++技巧wxWidgets程序链接错误解决方法在编译wxWidgets自带的samples时出现一个错误:CVTRES : fatal error CVT1100: duplicate resource. type:MANIFEST, name:1, language:0x0409由于是manifest的错误,考试大提...

读取一个格式良好的XML文档,并按层次编号并输出&emspinclude &emspinclude &emspinclude &emspinclude &emspdefine BUFSIZE 30 XML文档结点 struct Node { int num; 结点编号 char name[BUFSIZE]; 结点名 char value[BUF...

GetVolumeInformation读取文件系统信息声明:GetVolumeInformation( lpRootPathName: PChar; {磁盘驱动器代码字符串} lpVolumeNameBuffer: PChar; {磁盘驱动器卷标名称} nVolumeNameSize: DWORD; {磁盘驱动器卷标...

推荐阅读
图文推荐