资源在应用程序开发中具有重要的作用。尤其是将界面元素(菜单、图标、位图等)作为资源,对降低程序设计的工作量大有帮助。
资源脚本(. rc)
资源是在资源脚本(. rc)中进行配置的。例如,把资源名字起为Window,再对Window进行如下配置,
1 添加资源
通过添加资源窗口,可以向.rc文件中添加需要的资源,比如常用的Dialog,Bitmap,Menu等。
添加完相应的资源后,Window.rc 文件内容如下:
2 绘制资源
这部不需要写代码,智能的Visual Studio允许使用“所见即所得”的方式来对资源的界面进行开发,姑且使用“绘制”来表示吧。这步主要使用工具箱中的控件来“绘制”出需要的各种资源。这里需要注意资源ID的命名,起的名字要便于记忆且符合一定的规律,因为这样便于之后的开发与程序的维护。
Dialog:
Icon:
MENU_MAIN:
MENU_POPUP:
资源ID定义和头文件
资源 ID 是一个资源或资源子项的唯一标识,很多资源和子项都具有标识。上文中已经提过资源ID的重要性。如IDD_DIALOG_ABOUT、ID_FILE_COPY 等就是资源 ID。这些 ID 实际是由用户定义的常数,都定义于自动生成的 resource.h 头文件中。
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Windows.rc
//
#define IDD_DIALOG_ABOUT 101
#define IDR_MENU_MAIN 101
#define IDR_MENU_POPUP 102
#define IDI_ICON_MAIN 103
#define IDC_EDIT_ABOUT 1001
#define ID_FILE_COPY 40001
#define ID_FILE_SAVE40002 40002
#define ID_FILE_EXIT 40003
#define ID_EIDT_COPY 40004
#define ID_EIDT_PASTE 40005
#define ID_HELP_ABOUT 40006
#define ID_COPY_PASTE 40007
#define ID_COPY_PASTE40008 40008
#define ID_POPUP_COPY 40009
#define ID_POPUP_PASTE 40010
#define ID_POPUP_CUT 40011
#define ID_POPUP_INFO 40012
#define ID_INFO_A 40013
#define ID_INFO_B 40014
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 104
#define _APS_NEXT_COMMAND_VALUE 40015
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
资源脚本文件和需要使用资源的程序文件都需要包含 Resource.h。在引用资源时,需要指明资源的 ID,资源 ID 在资源和程序中都是唯一标识,作为程序和资源的接口。
在程序中使用资源
在图形用户界面一文中,也涉及到了如何在程序中使用资源。该文提供的源码内也有相应的实现。这里就详细的介绍在程序中使用资源。
源代码中引用图标和菜单资源,如下所示:
wcx.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_ICON_MAIN)); // 图标
......
wcx.lpszMenuName = MAKEINTRESOURCE(IDR_MENU_MAIN); // 菜单资源
源代码中引用菜单项 ID 和对话框资源,如下所示:
case ID_HELP_ABOUT:
{
DialogBox(
hinst, (LPCTSTR)IDD_DIALOG_ABOUT, hwnd, (DLGPROC)About
);
return 0;
}
这里的IDI_ICON_MAIN、IDR_MENU_MAIN、ID_HELP_ABOUT 和 IDD_DIALOG_ABOUT都是资源 ID。在 Resource.h 可以查找到其定义。
MAKEINTRESOURCE 是一个宏,这个宏的功能是将资源 ID 转换为资源名(字符串型),很多 API 函数在引用资源时都是通过资源名。
当然不是只有界面才会使用资源,任何程序都可以使用资源。资源中程序中也并非只用与图形用户界面。资源可以是任意的数据。比如完全可以将一些配置信息、动态连接库文件编译为exe的资源。在程序运行后,将资源数据写入到文件再使用。这样就可以将所有程序和数据集中在一个可执行文件里。