rc 是resource的简称,对应着VS中的资源视图文件。rc 文件是资源文件,包括比如对话框、菜单、图标、字符串、版本等资源信息。使用.rc 资源文件的目的是为了对程序中用到的大量的资源进行统一的管理。在win32编程中,为方便项目中的资源统一管理,提供了一个格式统一的资源文件,对各种资源进行管理。它的扩展名是.rc,在程序编译时它会被资源编译器编译生成一个.res的二进制文件。
rc文件的语法:
1、注释:注释方式和 C 语言相通,单行注释用 // 符号,多行注释用 /* ... */ 符号。
2、预处理命令:预处理指令包括一些头文件的引用(使用 #include ,也同 C 语言)。
3、编译指令:预定义(#define,常量和宏,不支持带参数的宏) 和 条件编译(#if, #ifdef, #undef, #ifndef, #else, #elif, #endif 等)。
4、资源定义声明:资源定义的声明中包括“资源”(Resources),"控件"(Controls) 和 “声明”(Statements) 3 类。
资源定义声明:
1.资源(Resources):“资源”具有资源 ID,在程序中可以使用 FindResource ,LoadResource,LoadMenu 等资源相关 API 来操作。常见的定义如下:
(1)从文件导入的资源类型:(BITMAP,ICON,HTML,FONT,CURSOR 等)
//格式:
nameID BITMAP filename
//例子:
IDI_ICON_MAIN ICON "res\\icon.ico" //ICON RESOURCE
(2) 对话框资源类型:(DIALOG,DIALOGEX 等)(对话框可以包括若干子控件,如菜单,按钮等,定义语法如下)
//模板
nameID DIALOGEX x, y, width, height [ , helpID]] [[ optional-statements]] {control-statements }
//例子
IDD_DIALOG_ABOUT DIALOGEX 0, 0, 290, 59 //DIALOGEX RESOURCE
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog" // CAPTION STATEMENT
FONT 8, "MS Shell Dlg", 400, 0, 0x1 // FONT STATEMENT
BEGIN
LTEXT "Windows Resource Demo",3001,26,14,119,8,SS_NOPREFIX // CONTROL
LTEXT "Copyright (C) 2008",3002,26,30,119,8 // CONTROL
DEFPUSHBUTTON "OK",IDOK,234,14,32,14,WS_GROUP // CONTROL
DEFPUSHBUTTON "Quit",IDCANCEL,234,31,32,14,WS_GROUP // CONTROL
END
(3) 菜单资源类型:
//定义:
//MENU:
menuID MENU [[optional-statements]] { item-definitions ... }
//POPUP:
POPUP text, [[optionlist]] { item-definitions ... }
//例子
//MENU:
IDR_MENU_MAIN MENU //MENU RESOURCE
BEGIN
POPUP "File" // POPUP RESOURCE
BEGIN
MENUITEM "&Open", ID_FILE_COPY // MENUITEM STATEMENT
MENUITEM "&Save", ID_FILE_SAVE40002// MENUITEM STATEMENT
MENUITEM SEPARATOR // MENUITEM STATEMENT
MENUITEM "E&xit", ID_FILE_EXIT // MENUITEM STATEMENT
END
POPUP "Eidt" // POPUP RESOURCE
BEGIN
MENUITEM "&Copy", ID_EIDT_COPY// MENUITEM STATEMENT
MENUITEM "&Paste", ID_EIDT_PASTE// MENUITEM STATEMENT
END
POPUP "Help" // POPUP RESOURCE
BEGIN
MENUITEM "&About", ID_HELP_ABOUT// MENUITEM STATEMENT
END
END
//POPUP:
IDR_MENU_POPUP MENU
BEGIN
POPUP "POPUP"
BEGIN
MENUITEM "&Copy", ID_POPUP_COPY
MENUITEM "&Paste", ID_POPUP_PASTE
MENUITEM "Cu&t", ID_POPUP_CUT
POPUP "&Info"
BEGIN
MENUITEM "Co&unt", ID_INFO_A
MENUITEM "&Size", ID_INFO_B
END
END
END
(4)字符串表类型:
//定义
STRINGTABLE [[optional-statements]] {stringID string ...}
//例子
STRINGTABLE
BEGIN
IDS_1 L"5\x00BC-Inch Floppy Disk"
IDS_1a "5\xBC-Inch Floppy Disk"
IDS_2 L"Don't confuse \x2229 (intersection) with \x222A (union)"
IDS_3 "Copyright \xA92001"
IDS_3a L"Copyright \x00a92001"
END
(5)自定义类型:
nameID typeID filename
nameID typeID { raw-data }
2、控件(Controls):
//定义
<控件类型> text, id, x, y, width, height [[, style [[, extended-style]]]]
<控件类型>, id, x, y, width, height [[, style [[, extended-style]]]]
//例子
LTEXT "Windows Resource Demo",3001,26,14,119,8,SS_NOPREFIX // CONTROL
LTEXT "Copyright (C) 2008",3002,26,30,119,8 // CONTROL
DEFPUSHBUTTON "OK",IDOK,234,14,32,14,WS_GROUP // CONTROL
DEFPUSHBUTTON "Quit",IDCANCEL,234,31,32,14,WS_GROUP // CONTROL
3、声明(Statements)
根据资源的不同而不同,有的资源有“声明”,有的资源则没有,且每一种资源对应特定的声明。比如 MENU 的资源就会具有 MENUITEM 声明,用于指定菜单项;对话框资源(DIALOG,DIALOGEX)具有 CAPTION 声明,用于指定对话框标题。
另外:资源 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
在程序中使用资源:
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
// 在“帮助”菜单中选择“关于”
case ID_HELP_ABOUT:
{
DialogBox(
hinst, (LPCTSTR)IDD_DIALOG_ABOUT, hwnd, (DLGPROC)About
);
return 0;
}
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}
其中,如果处理的是 WM_COMMAND 消息时(当用户从菜单选中一个命令项目、当一个控件发送通知消息给去父窗口或者按下一个快捷键将发送 WM_COMMAND 消息),我们首先一般会用 LOWORD 宏来检查 wParam 参数,从而得出“菜单 ID”或“控件ID”,这两者都是资源 ID,像上面的 ID_HELP_ABOUT 和 IDD_DIALOG_ABOUT 都是资源 ID 。
在使用资源 ID 时经常会看到一个宏 MAKEINTRESOURCE ,这个宏的功能是将资源 ID 转换为资源名(字符串形式),很多 API 函数在引用资源时都是通过资源名来引用的。
图标
见 MSDNICON Resource一文:
格式:
nameID ICON filename
例子:
IDI_ICON1 ICON "main.ico"
IDI_ICON2 ICON "main2.ico"
其中:
nameID | 16位无符号整数 或 唯一的名字 |
filename | 如果不在工作目录下需要使用完整路径,需要使用引号扩住 |
版本信息(VERSIONINFO)
见MSDNVERSIONINFO Resource和VS_FIXEDFILEINFO Structure
格式:
versionID VERSIONINFO fixed-info BEGIN block-statement . . . END
其中,fixed-info 信息:
字段 | 实例值 | |
FILEVERSION | 1,0,0,0 | 文件版本,4个16位整数,(其实是2个32位整数) |
PRODUCTVERSION | 1,0,0,0 | 产品版本,同上 |
FILEFLAGS | 0x0L | 文件属性 |
FILEFLAGSMASK | 0x0L | 属性的掩模 |
FILEOS | VOS_NT_WINDOWS32 | 用于何种操作系统 |
FILETYPE | VFT_APP | 文件一般类型(对于dll,类型为 VFT_DLL) |
FILESUBTYPE | VFT2_UNKNOWN | 细分的类型 |
对应的结构体:
typedef struct tagVS_FIXEDFILEINFO {
DWORD dwSignature;
DWORD dwStrucVersion;
DWORD dwFileVersionMS;
DWORD dwFileVersionLS;
DWORD dwProductVersionMS;
DWORD dwProductVersionLS;
DWORD dwFileFlagsMask;
DWORD dwFileFlags;
DWORD dwFileOS;
DWORD dwFileType;
DWORD dwFileSubtype;
DWORD dwFileDateMS;
DWORD dwFileDateLS;
} VS_FIXEDFILEINFO;
fix 字段后面是可变字段:
-
0个或多个 StringFileInfo 结构
-
1 个或多个 StringTable 结构
-
-
0个或多个 VarFileInfo 结构
#include "winver.h"
IDI_ICON1 ICON "main.ico"
IDI_ICON2 ICON "main2.ico"
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,0
PRODUCTVERSION 1,0,0,0
FILEFLAGS 0x0L
FILEFLAGSMASK 0x3fL
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE VFT2_UNKNOWN
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "000004b0"
BEGIN
VALUE "CompanyName", "Hermes Microvision Inc"
VALUE "FileDescription", "HMI Image EZ USB(2rd)"
VALUE "FileVersion", "1.0.0.0"
VALUE "LegalCopyright", "Copyright (C) 2009-2011 Hermes Microvision Inc"
VALUE "InternalName", "hmiezusb"
VALUE "OriginalFilename", "hmiezusb"
VALUE "ProductName", "HMI Image EZ USB(2rd)"
VALUE "ProductVersion", "1.0.0.0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0, 1200
END
END