.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代码

//格式:

nameID BITMAP filename

//例子:

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代码

//模板

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

//模板

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代码

//定义:

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

//定义:

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

//定义

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

//定义

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)自定义类型:

Cpp代码

nameID typeID filename

nameID typeID { raw-data }

nameID typeID filename

nameID typeID { raw-data }

2. 控件(Controls):

Cpp代码

//定义

<控件类型> 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

//定义

<控件类型> 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代码

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

//{{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代码

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);

}

}

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

相关推荐

最励志演说家!失去双腿,却走遍中国3000余城市,攀上100余座山
罗盘是什么组成的?什么是内盘,外盘和天池?陈灏明
你的手机为什么发热?揭秘8大原因及解决方案!
beat365在线登录app

你的手机为什么发热?揭秘8大原因及解决方案!

📅 07-16 👁️ 6758

友情链接