3.3.1 使用位图资源
本节将先介绍一下资源文件的知识,然后重点介绍位图资源的使用。由于资源的使用方法大同小异,所以熟悉位图资源的使用就能大概了解其他资源的使用。
1.为什么要使用资源
在一个Windows应用程序.EXE文件中,除了必要的程序代码数据之外,还有各种资源文件。Windows程序预定义的资源文件类型有:
(1)图标:小位图图形。它可用做应用程序的图标,使用.ICO作为扩展名。
(2)光标:表示鼠标指针的位图。
(3)字符串:Windws允许将一个字符串表作为一种资源放到程序中,并且通过标志符来访问它们。
(4)位图:标准的位图。它可以是单色、4位、8位、16位或32位格式的像素矩阵。
(5)声音:大部分Windows程序至少都可以通过.WAV文件来使用声音。
(6)对话框:对话框在Windows中也很常用,设计者可以让对话框作为一种资源,而不是在外部装载的东西。
(7)图元文件:它们允许将一个图像操作作为一个序列记录在一个文件中,然后再回放它。
把资源文件同代码编译在一起是一个非常好的想法:(1)同时含有代码和资源数据的.EXE文件更容易分配;(2)把.WAV,.BMP,.ICO等文件放在程序的外部而非编译进.EXE中,可能会由于外部的删除,转移或者更名而导致程序无法运行。
2.资源的集成和处理过程
以前需要使用一个外部资源编译器,如RC.EXE将所有的资源编译到一起。而现在可以使用Visual Studio C++(www.cppentry.com) 6.0来轻松完成这些工作。在Visual Studio C++(www.cppentry.com) 6.0中,按快捷键“CTRL+R”,既可以弹出如图3-6所示的【Insert Resource】对话框,在对话框中可以选择相应的资源类型,单击New按钮则可以添加一个新资源;或者通过“Import”导入已经存在的资源;或者通过“Custom”创建一种新的资源类型。每当通过该对话框添加了一个新资源时,系统都会将新资源的相关信息集成到工程的资源文件中。当编译工程时,Visual Studio C++(www.cppentry.com) 6.0会一起编译所有的资源文件,从而形成了一个资源数据库,最后附加在.EXE文件的后部。
在程序运行过程中,可以访问资源数据库,并且可以从程序本身(而不是作为一个单独的文件从磁盘中)装载资源数据。
 |
| 图3-6 【Insert Resource】对话框 |
3.如何使用位图资源
明白了资源的相关知识以后,这里将通过一个程序实例讲解位图资源的使用。
步骤1:打开Visual Studio C++(www.cppentry.com) 6.0,按照第1章中介绍的步骤,利用【App Wizard】创建一个名为BitMap的Win32 Application工程,并将Winows应用程序的类型设置为:A typical “Hello World!” application。
步骤2:按快捷键CTRL+R将弹出如图3-6所示的【Insert Resource】对话框。在对话框的ResourceType中选择类型为Bitmap,然后单击Import按钮,这时将弹出如图3-7所示的【Import Resource】对话框。
 |
| 图3-7 【Import Resource】对话框 |
步骤3:在【Import Resource】对话框中选择一个需要插入的位图,选择Bitmap.bmp文件,然后单击Import按钮,这时会弹出导入结果提示框。如果导入位图大于256色,导入提示框将提示该位图无法正常显示,这时可以忽略它。
步骤4:导入Bitmap.bmp后,在Visual Studio C++(www.cppentry.com) 6.0开发环境的左侧可以看到如图3-8所示的资源视图。新导入的位图在Bitmap目录下展开为IDB_BITMAP1。
 |
| 图3-8 资源视图 |
步骤5:用鼠标右键单击【IDB_BITMAP1】,选择弹出菜单中的【Properties】,弹出如图3-9所示的【Bitmap Proprerties】对话框。在该对话框中可以编辑该位图资源的相关属性。由于导入的图为一个统计图,这里定义位图的ID为:IDB_TONGJI。
 |
| 图3-9 【Bitmap Proprerties】对话框 |
步骤6:保存工程,然后展开工程的源码文件,找到Resource.h文件。如果前面的操作都正确的话,在Resource.h文件中应该有类似下面的代码:
#define IDB_TONGJI 132 //把资源同一符号标志符关联起来 |
经过前面6步的操作,位图资源已经导入到了工程中。下一步将通过在程序中添加代码来实现位图的装入和显示。
步骤7:展开Bitmap.cpp文件,在程序的主窗口处理过程WndProc()函数的开始部分定义变量:
HBITMAP hbmp; //定义位图对象 HDC srchdc; //定义源设备对象 |
然后在WndProc()函数中找到对WM_PAINT消息的处理代码如下:
case WM_PAINT: hdc = BeginPaint(hWnd, &ps); RECT rt; GetClientRect(hWnd, &rt); DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER); //打印出Hello World! EndPaint(hWnd, &ps); break; |
参考本章前面的介绍,WM_PAINT消息通知Windows应用程序进行窗口重画,因此在这里可以添加位图的显示代码,在上面代码段的第二句代码和第三句代码之间添加如下代码。
hbmp = LoadBitmap( hInst, (LPCTSTR)IDB_TONGJI); //装载位图资源 srchdc = CreateCompatibleDC(hdc); //创建源设备并返回句柄 SelectObject(srchdc, hbmp); //将位图对象选入源设备环境 BitBlt(hdc,0,0,403,230,srchdc,0,0,SRCCOPY); //将位图复制到目标设备句柄 DeleteObject(hbmp); //删除位图句柄 DeleteObject(srchdc); //删除源设备句柄 |
步骤8:编译整个工程文件,运行程序。程序的运行结果如图3-10所示。
 |
| 图3-10 位图资源使用实例程序运行结果 |
本实例的源码在本书光盘文件中,如果需要进一步了解,可以参考光盘中的工程。
本节主要讲解的是位图资源的导入和使用,实际上其他资源,如图标,光标,音乐等的使用方法和位图资源大同小异,所以不再阐述。
【责任编辑:
雪花 TEL:(010)68476606】