VS2015动态库编程之导出位图资源

来源:互联网 发布:我的世界fps优化 编辑:程序博客网 时间:2024/05/23 12:01

文章相关视频教程下载地址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();

其中,CDCMFC中设备上下文对应的类。

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 将内存中的位图在对话框中显示

接下来通过CDCBitBlt()函数将内存中的位图在对话框中显示出来。

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的位图资源