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

本文深入探讨了Win32编程中资源管理的实现方式,重点介绍了rc文件的使用及其语法,详细阐述了如何通过资源ID在程序中操作资源,包括位图、图标、对话框、菜单、字符串表等多种类型,以及资源ID在资源文件中的定义和程序中的应用。

统一资源管理:

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

 

 

编写 Windows 资源脚本(`.rc` 文件)是开发 Windows 应用程序时管理应用程序资源(如图标、位图、字符串、对话框、版本信息等)的重要手段。资源脚本通过 `rc.exe`(Windows SDK 提供的资源编译器)被编译为 `.res` 文件,最终链接到可执行文件中[^1]。 以下是一些常见的资源类型及其 `.rc` 文件编写方法: ### 1. 定义图标资源 图标资源通常用于应用程序的主窗口图标。可以使用 `ICON` 指令定义: ```rc IDI_ICON1 ICON DISCARDABLE "icon.ico" ``` 其中: - `IDI_ICON1` 是资源的标识符,可在代码中引用。 - `ICON` 表示这是一个图标资源。 - `DISCARDABLE` 表示该资源可以被丢弃以节省内存。 - `"icon.ico"` 是图标文件的路径。 ### 2. 定义版本信息资源 版本信息资源使用 `VS_VERSION_INFO` 类型定义,通常用于指定应用程序的版本、版权、产品名称等元数据: ```rc VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,1 FILEFLAGSMASK 0x3fL FILEFLAGS 0x0L FILEOS VOS__WINDOWS32 FILETYPE VFT_APP FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "CompanyName", "My Company\0" VALUE "FileDescription", "My Application\0" VALUE "FileVersion", "1.0.0.1\0" VALUE "InternalName", "MyApp\0" VALUE "LegalCopyright", "Copyright © 2025\0" VALUE "OriginalFilename", "MyApp.exe\0" VALUE "ProductName", "My Application\0" VALUE "ProductVersion", "1.0.0.1\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x0409, 0x04E4 END END ``` 该资源块定义了文件版本、产品版本、公司名称、版权等信息[^2]。 ### 3. 定义字符串资源 字符串资源用于存储应用程序中使用的本地化文本内容: ```rc STRINGTABLE BEGIN IDS_APP_TITLE "My Application" IDS_HELLO "Hello, Windows!" END ``` 其中 `IDS_APP_TITLE` `IDS_HELLO` 是字符串标识符,可在代码中通过 `LoadString()` 函数加载。 ### 4. 定义对话框资源 对话框资源用于定义用户界面布局: ```rc IDD_ABOUTBOX DIALOGEX 0, 0, 200, 100 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About My Application" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK", IDOK, 140, 70, 50, 14 PUSHBUTTON "Cancel", IDCANCEL, 140, 40, 50, 14 LTEXT "Version 1.0.0.1", IDC_STATIC, 10, 10, 180, 20 END ``` 该定义创建了一个包含两个按钮一个静态文本的对话框。 ### 5. 使用头文件定义资源标识符 通常资源标识符(如 `IDI_ICON1`, `IDS_APP_TITLE`, `IDD_ABOUTBOX` 等)会在头文件(如 `resource.h`)中定义: ```c #define IDI_ICON1 101 #define IDS_APP_TITLE 102 #define IDD_ABOUTBOX 103 ``` 在 `.rc` 文件中使用 `#include` 引入该头文件: ```rc #include "resource.h" ``` ### 6. 编译资源文件 使用 `rc.exe` 编译 `.rc` 文件为 `.res` 文件: ```bash rc.exe myapp.rc ``` 生成的 `myapp.res` 可以链接到应用程序中,或进一步转换为 `.syso` 文件供 Go 等语言使用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值