曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6429|回复: 2
打印 上一主题 下一主题

资源脚本文件(*.rc)

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2012-2-7 23:22:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
资源是在资源脚本 (*.rc) 文件中进行配置的。比如下面是一个程序的界面:

它所对应的资源脚本文件内容为:
[Plain Text] 纯文本查看 复制代码
#include <Windows.h>
#include "resource.h"

#pragma code_page(936)

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

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

/////////////////////////////////////////////////////////////////////////////
//
// 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

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


/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

IDI_ICON_MAIN            ICON            "res\\icon.ico"  //ICON RESOURCE


rc 文件的语法包括注释,预处理命令,编译指令和资源定义声明等。其中注释方式和 C 语言相通,单行注释用 // 符号,多行注释用 /* ... */ 符号。

预处理指令包括一些头文件的引用(使用 #include ,也同 C 语言),预定义(#define,常量和宏,不支持带参数的宏) 和 条件编译(#if, #ifdef, #undef, #ifndef, #else, #elif, #endif 等)。

在上面示例中,#pragma code_page(936) 用来指定文本的编码方式,pragma 的语法格式为:
#pragma code_page( [ DEFAULT | CodePageNum ] )
如上,当 CodePageNum 值为 936 时表示使用的是简体中文编码方式。



资源定义的声明中包括“资源”(Resources),"控件"(Controls) 和 “声明”(Statements) 3 类。

1、资源
“资源”具有资源 ID,在程序中可以使用 FindResource ,LoadResource,LoadMenu 等资源相关 API 来操作。有的资源支持子控件,各种资源的声明各不相同,以下是常用的几种系统资源类型。

(1) 从文件导入的资源类型
比如 BITMAP,ICON,HTML,FONT 等,如:
nameID BITMAP filename
在上面的实例中,使用的图标资源 IDI_ICON_MAIN 如下定义:
IDI_ICON_MAIN            ICON            "res\\icon.ico"  //ICON RESOURCE
上面告诉我们图标文件 icon.ico 放在项目目录下的 res 子文件中。

(2) 对话框资源类型
如 DIALOG,DIALOGEX 等,对话框可以包括若干子控件,如菜单,按钮等,定义语法如下:
nameID DIALOGEX x, y, width, height [ , helpID]] [[ optional-statements]]  {control-statements }
上面实例中的 IDD_DIALOG_ABOUT 就是 DIALOGEX 类型的资源。


(3) 菜单资源类型
MENU 包括如下菜单选项:
menuID MENU [[optional-statements]] { item-definitions ... }
通常,菜单资源中一般会包括 POPUP 资源,如下所示:
POPUP text, [[optionlist]] { item-definitions ... }
上面实例中的 IDR_MENU_POPUP, IDR_MENU_MAIN 这些都是 MENU 类型的资源。

(4) 字符串表类型
STRINGTABLE 包括若干字符串,如下所示:
STRINGTABLE [[optional-statements]] {stringID string ...}

(5) 自定义类型
此外,还允许我们自定义资源类型,如下所示:
nameID typeID filename
nameID typeID { raw-data }

2. 控件
“控件” 与系统通用控件相对应,编译器会解析脚本,在程序运行时,脚本中相关声明被引用时会创建控件:
<控件类型> text, id, x, y, width, height [[, style [[, extended-style]]]]
<控件类型>, id, x, y, width, height [[, style [[, extended-style]]]]
如在上面实例中对话框资源中包括的 TEXT 控件为:
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. 声明
“声明”用于设置“资源”的相关属性。根据资源的不同而不同,有的资源有“声明”,有的资源则没有,且每一种资源对应特定的声明。比如 MENU 的资源就会具有 MENUITEM 声明,用于指定菜单项;对话框资源(DIALOG,DIALOGEX)具有 CAPTION 声明,用于指定对话框标题。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
沙发
 楼主| 发表于 2012-2-8 01:37:55 | 只看该作者

资源 ID 定义和头文件

资源 ID 是一个资源或资源子项的唯一标识,很多资源和子项都具有标识。在上面的实例中,IDD_DIALOG_ABOUT ,ID_FILE_COPY 等都是资源 ID 。这些 ID 实际是有用户定义的常数,都定义在 Resource.h 头文件中,比如:
[C++] 纯文本查看 复制代码
//{{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

资源脚本文件和需要使用资源的程序文件都需要包含 Resource.h 。在引用资源时,需要指明资源的 ID,资源 ID 在资源和程序中都是唯一的标识,它们作为程序和资源的接口。

在程序中使用资源
在程序中使用资源也是通过资源 ID 来标识一个资源的。比如在主窗口处理函数中有这么一段代码:
[C++] 纯文本查看 复制代码
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 函数在引用资源时都是通过资源名来引用的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-29 06:37 , Processed in 0.084180 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表