文章相关视频教程下载地址http://pan.baidu.com/s/1c1SeUFQ
DLL文件不但可以导出函数、变量和类,还可以导出对话框资源或者位图资源。之前我们学习了在DLL文件中导出对话框资源的方法,今天我们将学习在DLL文件中导出位图的方法。
1 DLL文件的编写
1.1 添加位图资源
创建一个静态链接的MFC规则动态库,接下来在“资源视图”中选中“rc”文件夹,在右键菜单中选择“添加资源”,接下来在弹出的“添加资源”对话框中的“资源类型”中选择“Bitmap”,之后选择“导入”对话框,将指定位图资源导入到动态库中,如图1所示。
图1 在DLL中添加位图
在“资源视图”中的“rc”目录下,可以看到添加了一个名为“Bitmap”的子目录,该子目录下有一个名为“IDB_BITMAP1”的位图资源,即为刚刚添加的位图,如图2所示。
图2 添加后的位图资源
1.2 查看位图资源的ID值
要在其他程序中使用DLL文件中的位图资源,需要知道该位图资源的ID值。在“解决方案管理器”中,双击“头文件”中的“Resource.h文件”,可以查看位图资源即IDB_BITMAP1的值为3003,如图3所示:
图3 位图资源ID值
最后,编译生成DLL文件。
2 调用DLL程序的编写
通过一个基于对话框的MFC程序来调用该DLL文件。在对话框中添加一个按键,将该按键的“Caption”设置为“显示位图”,接下来为该按键添加鼠标单击的消息响应函数。在该消息响应函数中完成导入DLL并且调用DLL中位图资源。
2.1 DLL文件的导入
采用动态方式导入DLL文件
HINSTANCE hDll;
hDll = LoadLibrary(_T("MFC_Regular_Static_DLL_Test.dll"));
if (hDll == NULL)
{
MessageBox(_T("导入动态库失败"));
return;
}
2.2 获取DLL文件中位图的句柄
通过LoadBitmap()函数实现位图句柄的获取。
m_hBitmap = LoadBitmap(hDll, MAKEINTRESOURCE(3003));
其中,第一个参数表示位图所在模块的句柄,hDll即为导入的DLL文件的句柄;第二个参数是位图的名称,该参数的类型是LPCWSTR,因此需要用到MAKEINTRESOURCE()宏将整形的位图资源ID转换为LPCWSTR类型,其中3003是在“1.2查看位图资源的ID值”中查看到的位图资源ID值。LoadBitmap()函数的返回值是HBITMAP类型的变量,表示获取到的位图的句柄,m_hBitmap是对话框类的成员变量,在对话框类的头文件中声明:
private:
HBITMAP m_hBitmap;
2.3 释放动态库
在获取了DLL文件中位图的句柄之后,接下来都是针对该句柄的处理,DLL就不再使用了。因此,释放该动态库。
FreeLibrary(hDll);
2.4 显示位图
将DLL中的位图资源在对话框中显示,首先需要将位图句柄与CBitmap类关联,之后通过对话框的设备上下文(Device Context)显示位图。
2.4.1 关联位图句柄与CBitmap类
使用CBitmap类的Attach()函数将句柄与类关联。
CBitmap bmp;
bmp.Attach(m_hBitmap);
其中,m_hBitmap是在“2.2获取DLL文件中位图的句柄”中获取到的位图句柄。
2.4.2 获取对话框的设备上下文
通过GetDC()获取对话框设备上下文的指针。
CDC *pDC = GetDC();
其中,CDC是MFC中设备上下文对应的类。
2.4.3 创建兼容设备上下文
在显示位图时,一般首先将位图拷贝到内存中,之后内存中的位图显示到对话框中。向内存中拷贝位图是通过兼容设备上下文实现的。
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CDC类的CreateCompatibleDC()函数的作用是创建兼容的设备上下文,该函数的参数即为指定的设备上下文的指针,pDC是在“2.4.2获取对话框的设备上下文”中获取到的对话框的设备上下文。此时,memDC即为新创建的与pDC兼容的设备上下文。
2.4.4 将位图拷贝到内存中
通过CDC类的SelectObject()函数将位图拷贝到内存中。
memDC.SelectObject(&bmp);
其中,bmp是“2.4.1关联位图句柄与CBitmap类”中与DLL位图资源关联的CBitmap类。
2.4.5 将内存中的位图在对话框中显示
接下来通过CDC的BitBlt()函数将内存中的位图在对话框中显示出来。
pDC->BitBlt(0, 0, 500, 600, &memDC, 0, 0, SRCCOPY);
其中,BitBlt()函数的前两个参数表示显示位图的起点横坐标和纵坐标;第三和第四个参数表示显示位图的宽度和高度;第五个参数&memDC指定了位图的来源,即内存中的兼容设备上下文;第六和第七个参数表示兼容设备上下文的起点的横坐标和纵坐标;第八个参数SRCCOPY表示显示的方式。
2.4.6 释放资源
在显示了位图之后,需要释放CBitmap与位图资源的关联,并且还要释放内存中的兼容设备上下文。
bmp.Detach();
memDC.DeleteDC();
运行该MFC程序,点击“显示位图”按键后的效果如图4所示。
图4 在对话框中显示DLL的位图资源