首页 > 代码库 > .rc Windows资源文件定义和使用

.rc Windows资源文件定义和使用

统一资源管理:

在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 等

 

Java代码 复制代码 收藏代码
  1. //格式:   
  2. nameID BITMAP filename   
  3. //例子:   
  4. IDI_ICON_MAIN       ICON       "res\\icon.ico"  //ICON RESOURCE  
//格式:nameID BITMAP filename//例子:IDI_ICON_MAIN       ICON       "res\\icon.ico"  //ICON RESOURCE

 

 

(2) 对话框资源类型:(DIALOG,DIALOGEX 等对话框可以包括若干子控件,如菜单,按钮等,定义语法如下)

 

 

Cpp代码 复制代码 收藏代码
  1. //模板   
  2. nameID DIALOGEX x, y, width, height [ , helpID]] [[ optional-statements]]  {control-statements }   
  3.   
  4. //例子   
  5. IDD_DIALOG_ABOUT DIALOGEX 0, 0, 290, 59        //DIALOGEX RESOURCE   
  6. STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU   
  7. CAPTION "Dialog"        // CAPTION   STATEMENT   
  8. FONT 8, "MS Shell Dlg", 400, 0, 0x1        // FONT  STATEMENT   
  9. BEGIN   
  10.     LTEXT           "Windows Resource Demo",3001,26,14,119,8,SS_NOPREFIX    //  CONTROL   
  11.     LTEXT           "Copyright (C) 2008",3002,26,30,119,8                        //  CONTROL   
  12.     DEFPUSHBUTTON   "OK",IDOK,234,14,32,14,WS_GROUP                //  CONTROL   
  13.     DEFPUSHBUTTON   "Quit",IDCANCEL,234,31,32,14,WS_GROUP            //   CONTROL   
  14. END  
//模板nameID DIALOGEX x, y, width, height [ , helpID]] [[ optional-statements]]  {control-statements }//例子IDD_DIALOG_ABOUT DIALOGEX 0, 0, 290, 59        //DIALOGEX RESOURCESTYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENUCAPTION "Dialog"        // CAPTION   STATEMENTFONT 8, "MS Shell Dlg", 400, 0, 0x1        // FONT  STATEMENTBEGIN    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            //   CONTROLEND

 

 

 

(3) 菜单资源类型:

 

Cpp代码 复制代码 收藏代码
  1. //定义:   
  2. //MENU:   
  3. menuID MENU [[optional-statements]] { item-definitions ... }   
  4. //POPUP:   
  5. POPUP text, [[optionlist]] { item-definitions ... }   
  6.   
  7. //例子   
  8. //MENU:   
  9. IDR_MENU_MAIN MENU        //MENU RESOURCE   
  10. BEGIN   
  11.     POPUP "File"        // POPUP RESOURCE   
  12.     BEGIN   
  13.         MENUITEM "&Open",        ID_FILE_COPY    // MENUITEM  STATEMENT   
  14.         MENUITEM "&Save",        ID_FILE_SAVE40002// MENUITEM  STATEMENT   
  15.         MENUITEM SEPARATOR            // MENUITEM  STATEMENT   
  16.         MENUITEM "E&xit",         ID_FILE_EXIT  // MENUITEM  STATEMENT   
  17.     END   
  18.     POPUP "Eidt"        // POPUP RESOURCE   
  19.     BEGIN   
  20.         MENUITEM "&Copy",        ID_EIDT_COPY// MENUITEM  STATEMENT   
  21.         MENUITEM "&Paste",     ID_EIDT_PASTE// MENUITEM  STATEMENT   
  22.     END   
  23.     POPUP "Help"        // POPUP RESOURCE   
  24.     BEGIN   
  25.         MENUITEM "&About",    ID_HELP_ABOUT// MENUITEM  STATEMENT   
  26.     END   
  27. END   
  28.   
  29. //POPUP:   
  30. IDR_MENU_POPUP MENU    
  31. BEGIN   
  32.     POPUP "POPUP"  
  33.     BEGIN   
  34.         MENUITEM "&Copy",        ID_POPUP_COPY   
  35.         MENUITEM "&Paste",        ID_POPUP_PASTE   
  36.         MENUITEM "Cu&t",        ID_POPUP_CUT   
  37.         POPUP "&Info"  
  38.         BEGIN   
  39.             MENUITEM "Co&unt",         ID_INFO_A   
  40.             MENUITEM "&Size",            ID_INFO_B   
  41.         END   
  42.     END   
  43. END  
//定义://MENU:menuID MENU [[optional-statements]] { item-definitions ... }//POPUP:POPUP text, [[optionlist]] { item-definitions ... }//例子//MENU:IDR_MENU_MAIN MENU        //MENU RESOURCEBEGIN    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    ENDEND//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    ENDEND

 

 

(4)字符串表类型:

 

Cpp代码 复制代码 收藏代码
  1. //定义   
  2. STRINGTABLE [[optional-statements]] {stringID string ...}   
  3.   
  4. //例子   
  5. STRINGTABLE   
  6. BEGIN   
  7. IDS_1 L"5\x00BC-Inch Floppy Disk"  
  8. IDS_1a "5\xBC-Inch Floppy Disk"  
  9. IDS_2 L"Don‘t confuse \x2229 (intersection) with \x222A (union)"  
  10. IDS_3 "Copyright \xA92001"  
  11. IDS_3a L"Copyright \x00a92001"  
  12. END  
//定义STRINGTABLE [[optional-statements]] {stringID string ...}//例子STRINGTABLEBEGINIDS_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)自定义类型:

 

Cpp代码 复制代码 收藏代码
  1. nameID typeID filename   
  2. nameID typeID { raw-data }  
nameID typeID filenamenameID typeID { raw-data }

 

2. 控件(Controls):

 

Cpp代码 复制代码 收藏代码
  1. //定义   
  2. <控件类型> text, id, x, y, width, height [[, style [[, extended-style]]]]   
  3. <控件类型>, id, x, y, width, height [[, style [[, extended-style]]]]   
  4.   
  5. //例子   
  6. LTEXT           "Windows Resource Demo",3001,26,14,119,8,SS_NOPREFIX    //  CONTROL   
  7. LTEXT           "Copyright (C) 2008",3002,26,30,119,8                        //  CONTROL   
  8. DEFPUSHBUTTON   "OK",IDOK,234,14,32,14,WS_GROUP                //  CONTROL   
  9.     DEFPUSHBUTTON   "Quit",IDCANCEL,234,31,32,14,WS_GROUP            //   CONTROL  
//定义<控件类型> 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    //  CONTROLLTEXT           "Copyright (C) 2008",3002,26,30,119,8                        //  CONTROLDEFPUSHBUTTON   "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 头文件中。如下:

 

 

Cpp代码 复制代码 收藏代码
  1. //{{NO_DEPENDENCIES}}   
  2. // Microsoft Visual C++ generated include file.   
  3. // Used by Windows.rc   
  4. //   
  5. #define IDD_DIALOG_ABOUT                101   
  6. #define IDR_MENU_MAIN                   101   
  7. #define IDR_MENU_POPUP                  102   
  8. #define IDI_ICON_MAIN                   103   
  9. #define IDC_EDIT_ABOUT                  1001   
  10. #define ID_FILE_COPY                    40001   
  11. #define ID_FILE_SAVE40002               40002   
  12. #define ID_FILE_EXIT                    40003   
  13. #define ID_EIDT_COPY                    40004   
  14. #define ID_EIDT_PASTE                   40005   
  15. #define ID_HELP_ABOUT                   40006   
  16. #define ID_COPY_PASTE                   40007   
  17. #define ID_COPY_PASTE40008              40008   
  18. #define ID_POPUP_COPY                   40009   
  19. #define ID_POPUP_PASTE                  40010   
  20. #define ID_POPUP_CUT                    40011   
  21. #define ID_POPUP_INFO                   40012   
  22. #define ID_INFO_A                       40013   
  23. #define ID_INFO_B                       40014   
  24.   
  25. // Next default values for new objects   
  26. //    
  27. #ifdef APSTUDIO_INVOKED   
  28. #ifndef APSTUDIO_READONLY_SYMBOLS   
  29. #define _APS_NEXT_RESOURCE_VALUE        104   
  30. #define _APS_NEXT_COMMAND_VALUE         40015   
  31. #define _APS_NEXT_CONTROL_VALUE         1000   
  32. #define _APS_NEXT_SYMED_VALUE           101   
  33. #endif   
  34. #endif  
//{{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

 

 

在程序中使用资源:

 

Cpp代码 复制代码 收藏代码
  1. case WM_COMMAND:   
  2.         {   
  3.             switch (LOWORD(wParam))   
  4.             {   
  5.                 // 在“帮助”菜单中选择“关于”   
  6.             case ID_HELP_ABOUT:   
  7.                 {   
  8.                     DialogBox(   
  9.                         hinst, (LPCTSTR)IDD_DIALOG_ABOUT, hwnd, (DLGPROC)About   
  10.                         );   
  11.                     return 0;   
  12.                 }   
  13.             default:   
  14.                 return DefWindowProc(hwnd, uMsg, wParam, lParam);   
  15.             }   
  16.         }  
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 函数在引用资源时都是通过资源名来引用的。