22.2.5 从动态库中获取位图资源
从动态库中获取位图资源的第一步需要使用LoadLibraryEx()函数状态动态库,通过此函数返回的句柄对动态库中的资源进行处理。第二步需要调用EnumResourceNames()函数枚举指定类型的资源。此函数会查找模块中的指定类型的每个资源,并将当前枚举出的资源名称传递给应用程序定义的回调函数。其原型为:
- BOOL EnumResourceNames(
- HINSTANCE hModule, // 指定要枚举资
源的可执行文件的模块句柄 - LPCTSTR lpszType, // 指定要枚举的资源类型
- ENUMRESNAMEPROC lpEnumFunc, // 指定查找到每个
资源后都要执行的回调函数 - LONG lParam); // 传递给回调函
数的用户自定义参数值
其中,lpszType参数指定要枚举的资源类型,有效取值如表22-2所示。
表22-2 可以枚举的资源的类型
其中回调函数的格式如下:
- BOOL CALLBACK EnumResNameProc(
- HANDLE hModule, // 枚举函数正在枚举的资源所在的可执行文件的句柄
- LPCTSTR lpszType, // 正在枚举创建当前进程的模块的资源
- LPTSTR lpszName, // 当前枚举项的资源名称
- LONG lParam); // EnumResourceNames()函
数的lParam参数传进来的用户自定义参数值
如果需要继续枚举,则函数应该返回true返回值,如果要停止枚举,则应该返回false。下面是使用这些函数枚举位图资源的实例。
- void CDLLAppSampleDlg::OnButtonGetbitmap()
// 枚举位图资源的处理函数 - {
- m_iconList.ShowWindow(SW_HIDE); // 显示窗口
- if( (hLibrary = LoadLibraryEx( "MORICONS.DLL", NULL,
- LOAD_LIBRARY_AS_DATAFILE )) == NULL ) // 装载动态库
- { WriteLog("文件载入错误!"); return; }
- // 枚举资源名称
- if(!EnumResourceNames(hLibrary,RT_BITMAP,
- (ENUMRESNAMEPROC)EnumBitmapProcedure,(LPARAM)
GetSafeHwnd())) - WriteLog("列举位图资源停止!"); // 输出提示信息
- FreeLibrary(hLibrary);
// 释放动态链接库 - }
- BOOL CALLBACK EnumBitmapProcedure(HANDLE hModule,
LPCTSTR lpszType, - LPTSTR lpszName, LONG lParam)
// 枚举回调函数 - {
- HBITMAP bitmap = LoadBitmap((HINSTANCE)hModule,
lpszName);// 装载位图 - SendMessage((HWND)lParam, WM_BITMAP_MESSAGE,
- (LPARAM)bitmap, (WPARAM)lpszName); // 发送消息
- return false; // 返回false
- }
- void CDLLAppSampleDlg::OnBitmapMessage(WPARAM wParam,LPARAM lParam)
- {
- Cstatic* m_Bitmap = (Cstatic*)GetDlgItem(IDC_STATIC_BITMAP);
-
// 定义静态控件变量 - m_Bitmap->SetBitmap((HBITMAP)wParam); // 装载位图
- WriteLog((const char*)&lParam);
// 输出提示信息 - }
上面代码首先使用LoadLibraryEx()函数装载MORICONS.DLL,返回DLL的句柄,然后调用EnumResourceNames()函数枚举位图资源。此函数中的第三个参数指定了回调函数,即每次查找到一个位图资源时要执行的函数,即EnumBitmapProcedure()函数。在回调函数中,通过传入的实例句柄和资源名称,使用LoadBitmap()函数装载位图资源,并将位图资源通过消息发送给主对话框。这里可以看到,返回值为false,表示不再继续枚举,只显示动态库中的第一幅位图。主对话框接收消息,并进入OnBitmapMessage()函数,将wParam参数传入的位图资源句柄,显示在静态文本框中。程序运行效果如图22-5所示。
|
| 图22-5 从动态库中获取位图资源 |