设为首页 加入收藏

TOP

22.2.6 枚举模块中的所有图标
2013-10-07 13:11:05 来源: 作者: 【 】 浏览:61
Tags:22.2.6 枚举 模块 所有 图标

22.2.6  枚举模块中的所有图标

与从动态库中获取位图资源的过程一样,可以枚举模块中的所有图标。所不同的是,在前面只获取了模块中的第一个位图资源,而在本小节中会枚举所有的图标。只需将枚举函数的回调函数中的返回值变为true即可。代码如下。

  1. Void CDLLAppSampleDlg::OnButtonGetallicon()    
    // 枚举图标  
  2. {  
  3.     ResetContent();                            
    // 清空显示控件  
  4.     HINSTANCE  hLibrary;                      
    // 静态库实例  
  5.     if( (hLibrary = LoadLibraryEx( "MORICONS.
    DLL", NULL,  
  6.       LOAD_LIBRARY_AS_DATAFILE )) == NULL )   
    // 装载动态库  
  7.     {  
  8.         WriteLog("文件载入错误!");  
  9.         return;  
  10.     }  
  11.     if(!EnumResourceNames(hLibrary,RT_GROUP_ICON,  
  12.       (ENUMRESNAMEPROC)EnumIconProcedure,(LPARAM)
    GetSafeHwnd()))  
  13.                                               
    // 枚举资源  
  14.         WriteLog("列举图标资源停止!");  
  15.     FreeLibrary(hLibrary);                     
    // 释放静态库  
  16.     Cstring log;  
  17.     log.Format("DLL中共包含%d个图标资源!", 
    m_iconList.GetItemCount());  
  18.                                                
    // 格式化信息  
  19.     WriteLog(log);                              
    // 输出信息  
  20. }  
  21. BOOL CALLBACK EnumIconProcedure(HANDLE hModule, 
    LPCTSTR lpszType,  
  22. LPTSTR lpszName, LONG lParam)                  
    // 枚举回调函数  
  23. {                                             
    // 装载图标  
  24.     HICON icon = LoadIcon((HINSTANCE)hModule,lpszName);  
  25. SendMessage((HWND)lParam, WM_ICON_MESSAGE, 
    (LPARAM)icon, (WPARAM)  
  26. lpszName);  
  27.     return true;                               
    // 返回,继续枚举  
  28. }  
  29. void CDLLAppSampleDlg::OnIconMessage(WPARAM 
    wParam,LPARAM lParam)  
  30. {// 显示图标  
  31.     int iIconRet = imagelist.Add((HICON)wParam)
    ;// 将位图添加到列表中  
  32.     if (iIconRet!=-1)  
  33.     {  
  34.         m_iconList.SetImageList (&imagelist,
    LVSIL_SMALL);  
  35.                                               
    // 设置位图列表对象  
  36.         int iIndex = m_iconList.GetItemCount();  
  37.         m_iconList.InsertItem(iIndex, (const 
    char*)&lParam, iIndex);  
  38.                                             
    // 插入新项  
  39.     }  

在上面代码中,OnButtonGetallicon()函数首先调用LoadLibraryEx()函数装载MORICONS.DLL,返回DLL的句柄,然后调用EnumResourceNames()函数枚举图标资源。此函数中的第三个参数指定了回调函数,即每次查找到一个图标资源时,要执行的函数,即EnumIconProcedure()函数。在回调函数中,通过传入的实例句柄和资源名称,使用LoadIcon()函数装载图标资源,并将图标资源句柄通过消息发送给主对话框。主对话框接收消息,并进入OnIconMessage()函数,将wParam参数传入的图标资源句柄,增加到CimageList变量中,并将其与列表控件关联起来,将图标资源的名称和图标显示出来。程序运行效果如图22-6所示。

 
图22-6  枚举模块中的所有图标
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇22.2.5 从动态库中获取位图资源 下一篇22.2.3 应用程序链接DLL

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: