15、Windows资源开发指南

Windows资源开发指南

1. 资源概述

资源是在程序源代码之外定义的二进制数据对象,是Windows程序的重要组成部分。使用Visual C++的资源编辑器可以创建以下类型的资源:
- 菜单
- 键盘加速器
- 位图(包括图标和光标)
- 工具栏
- 对话框窗口
- 字符串表
- 版本信息

Visual C++项目通常包含一个扩展名为 .rc 的资源文件,它实际上是一个文本文件,由Visual C++的资源编辑器生成,无需手动编辑。每个资源都有一个对应的所见即所得(WYSIWYG)工具用于创建和编辑。资源文件使用资源编译器编译生成 .res 文件,在构建过程中与可执行文件链接。应用程序通过资源的标识符来访问 .res 文件中的资源。

2. 资源视图(Resource View)

资源视图窗口位于工作区窗口中,通过选择“Resource View”选项卡来显示。需要注意的是,如果项目中没有资源,该选项卡和窗口将不可用,添加资源后会变得可见。在资源视图窗口中,每个资源都显示其ID,双击ID可在资源编辑器中打开该资源。若要从项目中移除资源,可在资源视图窗口中选择该资源并按“Del”键。

添加资源到项目有以下几种方法:
- 从菜单中选择“Insert/Resource”,显示“Insert Resource”对话框。
- 使用快捷键“Ctrl - R”,同样会显示“Insert Resource”对话框。
- 在资源视图窗口中右键单击文件夹,在弹出菜单中选择相应的菜单项。

在“Insert Resource”对话框中,选择要添加的资源类型并点击“New”按钮,资源将被创建并在资源编辑器中打开。每种资源类型在资源视图的树状视图中以文件夹形式显示,右键单击文件夹可添加相应资源。

3. 资源头文件(resource.h)

每次编辑资源并保存更改时,Visual C++会创建一个新的 .rc 文本文件,同时还会创建一个 resource.h 文件,其中包含每个标识符的 define 指令。每个资源、菜单项、工具栏按钮、字符串表条目等都由一个标识符表示,标识符为整数值。在源代码中包含 resource.h 文件,即可在程序中使用这些标识符。通常不需要手动为每个标识符分配唯一值,资源编辑器会自动完成。若要更改 resource.h 中标识符的值,可通过Visual C++菜单选择“View/Resource Symbols”打开“Resource Symbols”对话框进行查看和编辑。

4. 菜单(Menus)

4.1 菜单概述

菜单是几乎所有显示框架窗口的Windows应用程序中都有的资源。“菜单”包含多个组件,窗口顶部的栏称为顶级菜单,顶级菜单包含下拉菜单,用户选择下拉菜单时会展开,下拉菜单包含菜单项,菜单项会生成消息供应用程序处理。自Windows 95推出以来,用户对弹出菜单也很熟悉,弹出菜单通常在鼠标右键点击的位置显示。

4.2 创建菜单

在项目中添加菜单,可在“Insert Resource”对话框中选择“Menu”并按下“New”按钮,新菜单将在资源编辑器中显示为一个空的顶级菜单。通过直接在顶级菜单上输入菜单名称来添加下拉菜单。每个资源都有一个供源代码使用的ID,菜单的ID显示在资源视图窗口中,资源编辑器会提供默认ID(如 ID_MENU1 ),可通过右键点击资源并选择“Properties”打开属性窗口来更改ID,主应用程序菜单的ID通常为 IDR_MAINFRAME

菜单可通过按下“Alt”键和一个字母来使用快捷键访问,创建菜单时在所需字母前放置“&”符号即可指定快捷键,菜单会对该字母加下划线。双击菜单或菜单项可打开“Menu Item Properties”窗口,用于更改菜单项的ID和各种设置。需要注意的是,下拉菜单没有ID,因为它们不生成程序需要处理的消息。

4.3 添加菜单项

下拉菜单中的菜单项可通过直接在下拉菜单上输入名称添加,也可双击条目在“Menu Item Properties”窗口中输入。每个菜单项也可使用“&”符号指定快捷键。用户选择菜单项时会生成 WM_COMMAND 消息,该消息与一个ID相关联,因此每个菜单项需要一个唯一的ID,资源编辑器会根据菜单项名称生成ID,也可自行选择。

“Menu Item Properties”窗口中的“Prompt”编辑框可输入描述信息,“\n”之前的文本在用户高亮菜单项时会显示在窗口状态栏,“\n”之后的文本在菜单项有对应的工具栏按钮时会作为工具提示显示。菜单项可以是下拉菜单,形成级联菜单,在“Menu Item Properties”窗口中选择“Pop - up”可将菜单项设为级联菜单,选择“Separator”属性可创建分隔符菜单项。创建完菜单后,通过Visual C++菜单选择“File/Save”保存资源文件以保存更改。

4.4 将菜单添加到窗口

顶级菜单在窗口创建时添加。 CFrameWnd 类的 Create() 成员函数有一个用于菜单ID的参数,该参数接受字符串类型,但菜单ID是整数值,MFC提供 MAKEINTRESOURCE 宏将整数转换为字符串。以下是一个创建带有菜单的框架窗口的示例:

DuckHuntFrameWnd::DuckHuntFrameWnd() {
    Create(NULL, "Duck Hunt Game", WS_OVERLAPPEDWINDOW,
           rectDefault, NULL,
           MAKEINTRESOURCE(IDR_MAINFRAME));
}

其中, rectDefault CFrameWnd 类的成员变量,让Windows确定窗口的初始大小和位置,第五个参数是指向父窗口的指针,默认为 NULL ,第六个参数是通过 MAKEINTRESOURCE 宏创建的菜单名称字符串。显示此窗口时,菜单会出现在窗口顶部,但菜单项会呈灰色不可用状态,这是因为尚未为菜单项添加消息处理程序。

4.5 ON_COMMAND()宏

用户选择菜单项时会生成 WM_COMMAND 消息,命令消息的处理方式与典型的Windows消息略有不同,调用的处理程序取决于消息源的ID。在窗口的消息映射中使用 ON_COMMAND() 宏将ID与特定的处理程序关联。例如,当用户选择“Color/Yellow”菜单项时,程序要将对象颜色更改为黄色,若菜单项ID为 ID_COLOR_YELLOW ,要调用的函数为 OnYellow() ,则应在相应的消息映射中添加以下条目:

ON_COMMAND(ID_COLOR_YELLOW, OnYellow)

OnYellow() 消息处理程序应声明为:

afx_msg void OnYellow();

每个标识符在消息映射中最多只能有一个 ON_COMMAND() 条目,即一个标识符不能映射到两个不同的消息处理程序。 ON_COMMAND() 宏将资源ID与消息处理程序关联,与事件源无关,这意味着同一ID可用于其他资源,无需在消息映射中重复输入。如果找不到对应的 ON_COMMAND() 消息处理程序,菜单项将被禁用(呈灰色),可通过将 CFrameWnd 类的成员变量 m_bAutoMenuEnable 设置为 FALSE 来覆盖此属性。

4.6 命令范围(Command Ranges)

为每个菜单项添加消息处理程序可能会导致代码重复。例如,从菜单中选择颜色时,执行的代码基本相同。可以使用命令范围编写一个消息处理程序来处理连续ID范围内的消息, ON_COMMAND_RANGE() 宏在相应的消息映射中进行关联。

例如,在某个菜单的“Color”菜单中有五个代表不同颜色的菜单项,若ID值连续(如 ID_COLOR_YELLOW = 40001 ID_COLOR_GREEN = 40002 等),可使用以下消息映射条目将所有ID映射到 OnChangeColor() 处理程序:

ON_COMMAND_RANGE(ID_COLOR_YELLOW, ID_COLOR_BLUE, OnChangeColor)

OnChangeColor() 函数应声明为:

afx_msg void OnChangeColor(UINT);

其实现可能如下:

void DuckHuntFrameWnd::OnChangeColor(UINT id) {
    switch (id) {
        case ID_COLOR_YELLOW:
            m_Duck.SetColor(RGB(255, 255, 0));
            break;
        case ID_COLOR_GREEN:
            m_Duck.SetColor(RGB(0, 255, 0));
            break;
        // and so forth
    }
    Invalidate();
    UpdateWindow();
}

由于每个标识符是常量整数,因此可以使用 switch 语句。在此示例中,鸭子的颜色会更改为相应的值,并重新绘制窗口以反映更改。

5. 键盘加速器(Keyboard Accelerators)

5.1 键盘加速器概述

前面讨论菜单时提到可使用“Alt”键通过键盘导航菜单,此外,还可以创建直接链接到菜单项的快捷键,即键盘加速器,它无需通过菜单导航,效果与选择菜单项相同。键盘加速器在加速器表中定义,加速器表是Windows应用程序的一种资源。

常见的加速器键如“Ctrl - X”用于剪切,“Ctrl - C”用于复制,“Ctrl - V”用于粘贴,按下这些加速器键与从菜单中选择相应项的效果相同,会生成包含事件源ID的 WM_COMMAND 消息,并调用该ID对应的消息处理程序。

5.2 加速器表(Accelerator Table)

Windows资源文件可以包含多个加速器表,每个加速器表都有一个ID。使用“Insert Resource”对话框可将加速器表添加到项目,在资源视图窗口中双击其ID可在资源编辑器中打开加速器表。加速器表是键盘加速器的列表,每个条目由加速器键、ID和加速器键类型组成,键类型可以是虚拟键(VIRTUAL)或ASCII键,大多数情况下使用虚拟键(如“Ctrl”、“Alt”或“Shift”)。

5.3 向加速器表添加项

资源编辑器提供了一个简单的对话框用于向加速器表添加条目。打开加速器表后,最后一行是空白行,双击该行会显示“Accel Properties”对话框。该对话框显示加速器的ID、要按下的键(包括修饰键如“Ctrl”或“Alt”)以及键的类型(ASCII或VIRTUAL)。为要按下的键赋值的最简单方法是按下“Next Key Typed”按钮并输入加速器键,对话框会显示输入的键。

可以从“Accel Properties”对话框的下拉列表中选择加速器键的ID,列表包含之前定义的所有ID,也可以直接输入ID(如果所需ID之前未定义)。例如,将“Ctrl - Y”与 ID_COLOR_YELLOW 标识符关联,如果程序已经处理了该ID的 WM_COMMAND 消息,则键盘加速器的行为与菜单项相同,无需额外的消息处理。如果键盘加速器的ID是该加速器独有的,则需要处理相应的消息。

以下是创建和使用资源的流程图:

graph TD
    A[开始项目] --> B[使用资源视图管理资源]
    B --> C{是否有资源}
    C -- 否 --> D[添加资源]
    C -- 是 --> E[编辑资源]
    D --> E
    E --> F[保存资源更改]
    F --> G[生成.rc和resource.h文件]
    G --> H[编译资源生成.res文件]
    H --> I[链接.res文件到可执行文件]
    I --> J[在代码中使用资源标识符]
    J --> K[处理资源相关消息]

通过以上步骤和方法,可以有效地创建、管理和使用Windows应用程序中的各种资源。

6. 位图资源(Bitmaps)

6.1 位图资源概述

位图资源包括图标和光标等,是Windows应用程序中常用的视觉元素。图标用于代表应用程序或特定功能,光标则提供了用户交互的视觉反馈。在Visual C++中,可使用资源编辑器方便地创建和管理位图资源。

6.2 创建位图资源

要创建位图资源,可在“Insert Resource”对话框中选择“Bitmap”并点击“New”按钮。资源编辑器将打开一个空白的位图编辑区域,可使用绘图工具绘制所需的位图。也可以导入现有的位图文件,只需在资源编辑器中选择“Import”选项,然后选择相应的位图文件即可。

每个位图资源同样有一个唯一的ID,可在资源视图窗口中查看和修改。位图的ID在代码中用于引用和加载位图,例如在创建窗口图标或设置光标时使用。

6.3 使用位图资源

在代码中使用位图资源,首先需要包含 resource.h 文件,以便获取位图资源的ID。以下是一个简单的示例,展示了如何在窗口中设置图标:

BOOL CMyApp::InitInstance()
{
    CMyFrameWnd* pFrame = new CMyFrameWnd;
    m_pMainWnd = pFrame;
    pFrame->LoadIconW(IDR_MAINFRAME); // 使用资源ID加载图标
    pFrame->ShowWindow(SW_SHOW);
    pFrame->UpdateWindow();
    return TRUE;
}

在上述示例中, LoadIconW 函数使用资源ID IDR_MAINFRAME 加载图标,并将其设置为窗口的图标。

7. 工具栏资源(Toolbars)

7.1 工具栏资源概述

工具栏是Windows应用程序中常见的用户界面元素,提供了快速访问常用功能的方式。工具栏通常包含多个按钮,每个按钮对应一个特定的操作。

7.2 创建工具栏资源

在“Insert Resource”对话框中选择“Toolbar”并点击“New”按钮,即可创建一个新的工具栏资源。资源编辑器将显示一个空白的工具栏编辑区域,可通过拖放按钮或绘制图标来添加工具栏按钮。

每个工具栏按钮都有一个对应的ID,该ID与相应的操作关联。可通过右键点击按钮并选择“Properties”来设置按钮的ID和其他属性,如文本标签、图标等。

7.3 将工具栏添加到窗口

要将工具栏添加到窗口,需要在窗口类的代码中进行相应的设置。以下是一个简单的示例:

BOOL CMyFrameWnd::CreateToolBar()
{
    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
        TRACE0("Failed to create toolbar\n");
        return FALSE;
    }
    return TRUE;
}

在上述示例中, CreateEx 函数创建了一个工具栏控件, LoadToolBar 函数使用资源ID IDR_MAINFRAME 加载工具栏资源。

7.4 处理工具栏按钮消息

当用户点击工具栏按钮时,会生成 WM_COMMAND 消息,处理方式与菜单项消息类似。在窗口的消息映射中使用 ON_COMMAND() 宏将按钮ID与相应的处理程序关联。例如:

BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
    ON_COMMAND(ID_TOOLBAR_BUTTON1, OnToolbarButton1)
END_MESSAGE_MAP()

void CMyFrameWnd::OnToolbarButton1()
{
    // 处理按钮点击事件
}

8. 字符串表资源(String Tables)

8.1 字符串表资源概述

字符串表资源用于存储应用程序中使用的文本字符串,避免在代码中硬编码文本。使用字符串表资源的好处是便于维护和本地化,可在不修改代码的情况下更改文本内容。

8.2 创建字符串表资源

在“Insert Resource”对话框中选择“String Table”并点击“New”按钮,即可创建一个新的字符串表资源。资源编辑器将显示一个表格,可在表格中添加、编辑和删除字符串条目。

每个字符串条目都有一个唯一的ID和对应的文本内容。在代码中,可通过ID来获取字符串的内容。

8.3 使用字符串表资源

在代码中使用字符串表资源,可通过 LoadString 函数来获取字符串的内容。以下是一个示例:

CString str;
str.LoadString(ID_STRING_HELLO); // 使用字符串ID加载字符串
AfxMessageBox(str); // 显示字符串

在上述示例中, LoadString 函数使用字符串ID ID_STRING_HELLO 加载字符串,并将其存储在 CString 对象中,然后使用 AfxMessageBox 函数显示该字符串。

以下是使用各种资源的操作步骤总结表格:
| 资源类型 | 创建步骤 | 使用步骤 |
| ---- | ---- | ---- |
| 菜单 | 1. 在“Insert Resource”对话框中选“Menu”并按“New”
2. 添加下拉菜单和菜单项
3. 设置ID和快捷键 | 1. 在窗口创建时使用 MAKEINTRESOURCE 添加菜单
2. 使用 ON_COMMAND() 关联消息处理程序 |
| 键盘加速器 | 1. 在“Insert Resource”对话框中选“Accelerator Table”并按“New”
2. 在资源编辑器中添加条目 | 1. 关联ID和消息处理程序 |
| 位图 | 1. 在“Insert Resource”对话框中选“Bitmap”并按“New”或导入文件
2. 设置ID | 1. 包含 resource.h 文件
2. 使用 LoadIconW 等函数加载位图 |
| 工具栏 | 1. 在“Insert Resource”对话框中选“Toolbar”并按“New”
2. 添加按钮并设置ID和属性 | 1. 在窗口类中创建和加载工具栏
2. 使用 ON_COMMAND() 处理按钮消息 |
| 字符串表 | 1. 在“Insert Resource”对话框中选“String Table”并按“New”
2. 添加字符串条目并设置ID和文本 | 1. 使用 LoadString 函数获取字符串内容 |

通过以上对各种Windows资源的介绍和操作步骤说明,开发者可以全面地掌握在Windows应用程序中创建、管理和使用资源的方法,从而提升应用程序的用户体验和可维护性。无论是菜单、图标还是字符串,合理利用资源能够让应用程序更加完善和专业。

以下是使用资源的整体流程的另一个流程图:

graph LR
    subgraph 创建资源
        A[选择资源类型] --> B[使用资源编辑器创建]
        B --> C[设置资源ID和属性]
    end
    subgraph 使用资源
        D[包含resource.h文件] --> E[在代码中引用资源ID]
        E --> F[处理资源相关消息]
    end
    C --> D

这个流程图清晰地展示了从创建资源到使用资源的整个过程,开发者可以按照这个流程来进行资源的开发和应用。通过不断实践和探索,能够更好地发挥Windows资源的优势,开发出高质量的应用程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值