设为首页 加入收藏

TOP

22.2.5 从动态库中获取位图资源
2013-10-07 13:11:07 来源: 作者: 【 】 浏览:58
Tags:22.2.5 动态 获取 位图 资源

22.2.5  从动态库中获取位图资源

从动态库中获取位图资源的第一步需要使用LoadLibraryEx()函数状态动态库,通过此函数返回的句柄对动态库中的资源进行处理。第二步需要调用EnumResourceNames()函数枚举指定类型的资源。此函数会查找模块中的指定类型的每个资源,并将当前枚举出的资源名称传递给应用程序定义的回调函数。其原型为:

  1. BOOL EnumResourceNames(  
  2. HINSTANCE hModule,              // 指定要枚举资
    源的可执行文件的模块句柄  
  3. LPCTSTR lpszType,               // 指定要枚举的资源类型  
  4. ENUMRESNAMEPROC lpEnumFunc,     // 指定查找到每个
    资源后都要执行的回调函数  
  5. LONG lParam);                   // 传递给回调函
    数的用户自定义参数值 

其中,lpszType参数指定要枚举的资源类型,有效取值如表22-2所示。

表22-2  可以枚举的资源的类型


其中回调函数的格式如下:

  1. BOOL CALLBACK EnumResNameProc(  
  2.   HANDLE hModule,   // 枚举函数正在枚举的资源所在的可执行文件的句柄  
  3. LPCTSTR lpszType,   // 正在枚举创建当前进程的模块的资源  
  4. LPTSTR lpszName,    // 当前枚举项的资源名称  
  5.  LONG lParam);  // EnumResourceNames()函
    数的lParam参数传进来的用户自定义参数值 

如果需要继续枚举,则函数应该返回true返回值,如果要停止枚举,则应该返回false。下面是使用这些函数枚举位图资源的实例。

  1. void CDLLAppSampleDlg::OnButtonGetbitmap()      
    // 枚举位图资源的处理函数  
  2. {  
  3.     m_iconList.ShowWindow(SW_HIDE);             // 显示窗口  
  4.     if( (hLibrary = LoadLibraryEx( "MORICONS.DLL", NULL,  
  5.             LOAD_LIBRARY_AS_DATAFILE )) == NULL )   // 装载动态库  
  6.     {   WriteLog("文件载入错误!");        return; }  
  7.     // 枚举资源名称  
  8.     if(!EnumResourceNames(hLibrary,RT_BITMAP,  
  9.         (ENUMRESNAMEPROC)EnumBitmapProcedure,(LPARAM)
    GetSafeHwnd()))  
  10.         WriteLog("列举位图资源停止!");              // 输出提示信息  
  11.     FreeLibrary(hLibrary);                          
    // 释放动态链接库  
  12. }  
  13. BOOL CALLBACK EnumBitmapProcedure(HANDLE hModule, 
    LPCTSTR lpszType,  
  14. LPTSTR lpszName, LONG lParam)                      
    // 枚举回调函数  
  15. {  
  16.     HBITMAP bitmap = LoadBitmap((HINSTANCE)hModule,
    lpszName);// 装载位图  
  17.     SendMessage((HWND)lParam, WM_BITMAP_MESSAGE,  
  18.             (LPARAM)bitmap, (WPARAM)lpszName);      // 发送消息  
  19.     return false;                                   // 返回false  
  20. }  
  21. void CDLLAppSampleDlg::OnBitmapMessage(WPARAM wParam,LPARAM lParam)  
  22. {  
  23.     Cstatic* m_Bitmap = (Cstatic*)GetDlgItem(IDC_STATIC_BITMAP);  
  24.                                                    
    // 定义静态控件变量  
  25.     m_Bitmap->SetBitmap((HBITMAP)wParam);           // 装载位图  
  26.     WriteLog((const char*)&lParam);            
    // 输出提示信息  

上面代码首先使用LoadLibraryEx()函数装载MORICONS.DLL,返回DLL的句柄,然后调用EnumResourceNames()函数枚举位图资源。此函数中的第三个参数指定了回调函数,即每次查找到一个位图资源时要执行的函数,即EnumBitmapProcedure()函数。在回调函数中,通过传入的实例句柄和资源名称,使用LoadBitmap()函数装载位图资源,并将位图资源通过消息发送给主对话框。这里可以看到,返回值为false,表示不再继续枚举,只显示动态库中的第一幅位图。主对话框接收消息,并进入OnBitmapMessage()函数,将wParam参数传入的位图资源句柄,显示在静态文本框中。程序运行效果如图22-5所示。

 
图22-5  从动态库中获取位图资源
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇22.1.3 Visual C++ 6.0可开发的DLL 下一篇22.2.6 枚举模块中的所有图标

评论

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