• .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 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) 菜单资源类型:

    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 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)字符串表类型:

    Cpp代码 复制代码 收藏代码
    1. //定义   
    2. STRINGTABLE [[optional-statements]] {stringID string ...}   
    3.   
    4. //例子   
    5. STRINGTABLE   
    6. BEGIN   
    7. IDS_1 L"5x00BC-Inch Floppy Disk"  
    8. IDS_1a "5xBC-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 ...}
    
    //例子
    STRINGTABLE
    BEGIN
    IDS_1 L"5x00BC-Inch Floppy Disk"
    IDS_1a "5xBC-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 filename
    nameID 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    //  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 头文件中。如下:

    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 函数在引用资源时都是通过资源名来引用的。

  • 相关阅读:
    Prism 4 文档 ---第6章 高级MVVM场景
    Prism 4 文档 ---第5章 实现MVVM模式
    Prism 4 文档 ---第4章 模块化应用程序开发
    Prism 4 文档 ---第3章 管理组件间的依赖关系
    Prism 4 文档 ---第2章:初始化Prism应用程序
    阿里人都在使用的在线诊断工具—Arthas
    开发人员如何规范你的Git commit?
    重磅:Java 16 正式发布了!
    MySQL 要分表分库怎么进行数据切分?
    Kafka 中所谓的 ‘零拷贝’ 技术到底是什么?
  • 原文地址:https://www.cnblogs.com/For-her/p/3914659.html
Copyright © 2020-2023  润新知