rc 是resource的简称,对应着VS中的资源视图文件。rc 文件是资源文件,包括比如对话框、菜单、图标、字符串、版本等资源信息。使用.rc 资源文件的目的是为了对程序中用到的大量的资源进行统一的管理。在win32编程中,为方便项目中的资源统一管理,提供了一个格式统一的资源文件,对各种资源进行管理。它的扩展名是.rc,在程序编译时它会被资源编译器编译生成一个.res的二进制文件。
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 }
//定义
<控件类型> 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
根据资源的不同而不同,有的资源有“声明”,有的资源则没有,且每一种资源对应特定的声明。比如 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 |
如果不在工作目录下需要使用完整路径,需要使用引号扩住 |
见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
http://msdn.microsoft.com/en-us/library/aa381058%28v=VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/ms646997%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/aa381018%28v=VS.85%29.aspx