22.2.6 枚举模块中的所有图标
与从动态库中获取位图资源的过程一样,可以枚举模块中的所有图标。所不同的是,在前面只获取了模块中的第一个位图资源,而在本小节中会枚举所有的图标。只需将枚举函数的回调函数中的返回值变为true即可。代码如下。
- Void CDLLAppSampleDlg::OnButtonGetallicon()
// 枚举图标 - {
- ResetContent();
// 清空显示控件 - HINSTANCE hLibrary;
// 静态库实例 - if( (hLibrary = LoadLibraryEx( "MORICONS.
DLL", NULL, - LOAD_LIBRARY_AS_DATAFILE )) == NULL )
// 装载动态库 - {
- WriteLog("文件载入错误!");
- return;
- }
- if(!EnumResourceNames(hLibrary,RT_GROUP_ICON,
- (ENUMRESNAMEPROC)EnumIconProcedure,(LPARAM)
GetSafeHwnd())) -
// 枚举资源 - WriteLog("列举图标资源停止!");
- FreeLibrary(hLibrary);
// 释放静态库 - Cstring log;
- log.Format("DLL中共包含%d个图标资源!",
m_iconList.GetItemCount()); -
// 格式化信息 - WriteLog(log);
// 输出信息 - }
- BOOL CALLBACK EnumIconProcedure(HANDLE hModule,
LPCTSTR lpszType, - LPTSTR lpszName, LONG lParam)
// 枚举回调函数 - {
// 装载图标 - HICON icon = LoadIcon((HINSTANCE)hModule,lpszName);
- SendMessage((HWND)lParam, WM_ICON_MESSAGE,
(LPARAM)icon, (WPARAM) - lpszName);
- return true;
// 返回,继续枚举 - }
- void CDLLAppSampleDlg::OnIconMessage(WPARAM
wParam,LPARAM lParam) - {// 显示图标
- int iIconRet = imagelist.Add((HICON)wParam)
;// 将位图添加到列表中 - if (iIconRet!=-1)
- {
- m_iconList.SetImageList (&imagelist,
LVSIL_SMALL); -
// 设置位图列表对象 - int iIndex = m_iconList.GetItemCount();
- m_iconList.InsertItem(iIndex, (const
char*)&lParam, iIndex); -
// 插入新项 - }
- }
在上面代码中,OnButtonGetallicon()函数首先调用LoadLibraryEx()函数装载MORICONS.DLL,返回DLL的句柄,然后调用EnumResourceNames()函数枚举图标资源。此函数中的第三个参数指定了回调函数,即每次查找到一个图标资源时,要执行的函数,即EnumIconProcedure()函数。在回调函数中,通过传入的实例句柄和资源名称,使用LoadIcon()函数装载图标资源,并将图标资源句柄通过消息发送给主对话框。主对话框接收消息,并进入OnIconMessage()函数,将wParam参数传入的图标资源句柄,增加到CimageList变量中,并将其与列表控件关联起来,将图标资源的名称和图标显示出来。程序运行效果如图22-6所示。
|
| 图22-6 枚举模块中的所有图标 |