博客
关于我
《Windows程序设计》读书笔十 菜单和其他资源
阅读量:375 次
发布时间:2019-03-04

本文共 3802 字,大约阅读时间需要 12 分钟。

菜单和资源

在Windows程序中,菜单和资源是开发应用程序的重要组成部分。菜单可以帮助用户更方便地访问功能,而资源则包括图标、鼠标指针、字符串和自定义资源等,能够提升程序的外观和用户体验。


10.1 图标、鼠标指针、字符串和自定义资源

10.1.1 向程序添加图标

在Visual Studio中,可以通过以下步骤添加图标资源:

  • 右键点击项目文件,选择 Build > Export Makefile
  • 使用 nmake 编译项目。
  • 配置 nmake 时,确保生成的资源文件包含图标。
  • :在Visual Studio 2015中,Export Makefile 已不可用。建议手动生成 makefile 或使用 makefile project

    使用 LoadIcon 加载图标:

    hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON));

    10.1.2 获得图标的句柄

    通过 LoadIcon 函数获取图标句柄:

    #define MAKEINTRESOURCE(i) (LPTSTR)((DWORD)((WORD)(i)))
    hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON));

    10.1.3 字符串资源

    使用字符串资源时,可以通过 LoadString 函数加载:

    LoadString(hInstance, id, szBuffer, iMaxLength);

    支持 Unicode 格式,LoadStringWLoadStringA 分别处理 Unicode 和 ANSI 字符串。


    10.1.4 自定义资源

    加载自定义资源时,使用 LoadResourceLockResource

    hResource = LoadResource(hInstance, FindResource(hInstance, MAKEINTRESOURCE(IDR_BINTYPE), TEXT("BINTYPE")));
    pData = LockResource(hResource);

    释放资源后使用 FreeResource


    10.2 菜单

    10.2.1 菜单的基本概念

    • 主菜单顶级菜单:用户最常接触的菜单层级。
    • 子菜单下拉菜单:提供更多功能选项。

    菜单可以是 启用禁用,并可以是 活动非活动


    10.2.2 菜单结构

    每个菜单有三个特征:

  • 显示内容:文本或位图。
  • ID:菜单项的唯一标识符或指向菜单句柄。
  • 属性:是否禁用或选中。

  • 10.2.3 定义菜单

    使用 F 键激活菜单(默认行为),菜单项可以设置为灰色(gray),启用(enabled)或选中(checked)。Separator 用于添加水平分割线。


    10.2.4 在程序中引用菜单

    通过窗口类设置菜单:

    wndClass.lpszMenuName = szAppName; // 给菜单指定名称

    或者动态加载菜单:

    hMenu = LoadMenu(hInstance, TEXT("MyMenu"));

    在窗口创建时传递菜单句柄:

    CreateWindow(..., hMenu);

    10.2.5 菜单与消息

    Windows发送以下消息类型:

  • WM_INITMENU:用户打开菜单。
  • WM_MENUSELECT:用户选择菜单项。
  • WM_INITMENUPOPUP:用户点击弹出菜单。
  • WM_SYSCOMMAND:对应系统菜单(如关闭窗口)。

  • 10.2.6 菜单设计规范

    • 菜单项 ID 必须唯一。
    • 系统菜单 ID 必须小于 0xF000
    • 使用 DrawMenuBar 强制重绘菜单。

    10.3 键盘加速

    10.3.1 为什么使用键盘加速键

    键盘加速键(如 F1F6)在多窗口环境中非常重要,用于通过 WM_COMMANDWM_SYSCOMMAND 消息传递命令。


    10.3.2 加速键的使用

    使用 LoadAccelerators 加载加速键表:

    hAccel = LoadAccelerators(hInstance, TEXT("MyAccelerators"));

    在消息循环中,使用 TranslateAccelerator 处理加速键消息:

    while (GetMessage(&msg, NULL, 0, 0)) {
    if (!TranslateAccelerator(hwnd, hAccel, &msg)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }

    10.4 示例程序

    poepoem.cpp

    #include 
    #include "resource.h"
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    // ... 事件处理逻辑 ...
    }
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
    // ... 窗口创建和显示 ...
    }

    #include 
    #include "resource.h"
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    // ... 菜单事件处理逻辑 ...
    }
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
    // ... 窗口创建和菜单加载 ...
    }

    10.5 资源文件

    poepoem.rc

    // Microsoft Visual C++ 生成的资源脚本。
    #include "resource.h"
    #define APSTUDIO_READONLY_SYMBOLS
    // 菜单资源
    MENUDemo MENU DISCARDABLE BEGIN
    POPUP "&File" BEGIN
    MENUITEM "&New", 40001
    MENUITEM "&Open", 40002
    MENUITEM "&Save", 40003
    MENUITEM "Save &As...", 40004
    MENUITEM SEPARATOR
    MENUITEM "E&xit", 40005
    END
    POPUP "&Edit" BEGIN
    MENUITEM "&Undo", 40006
    MENUITEM SEPARATOR
    MENUITEM "C&ut", 40007
    MENUITEM "&Copy", 40008
    MENUITEM "&Paste", 40009
    MENUITEM "De&lete", 40010
    END
    POPUP "&Background" BEGIN
    MENUITEM "&White", 40011, CHECKED
    MENUITEM "&Light Gray", 40012
    MENUITEM "&Gray", 40013
    MENUITEM "&Dark Gray", 40014
    MENUITEM "&Black", 40015
    END
    POPUP "&Help" BEGIN
    MENUITEM "&Help...", 40016
    MENUITEM "&About MenuDemo...", 40017
    END
    END

    10.6 其他资源

    popmenu.cpp

    #include 
    #include "resource.h"
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    // ... 弹出菜单处理逻辑 ...
    }
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
    // ... 窗口创建和菜单加载 ...
    }

    通过以上内容,可以清晰地了解如何在Windows程序中使用菜单和资源,提升用户体验和程序功能。

    转载地址:http://nxbg.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现factorial阶乘算法(附完整源码)
    查看>>
    Objective-C实现Factors因数算法(附完整源码)
    查看>>
    Objective-C实现Farey Approximation近似算法(附完整源码)
    查看>>
    Objective-C实现Fast Powering算法(附完整源码)
    查看>>
    Objective-C实现Fedwick树算法(附完整源码)
    查看>>
    Objective-C实现fenwick tree芬威克树算法(附完整源码)
    查看>>
    Objective-C实现FenwickTree芬威克树算法(附完整源码)
    查看>>
    Objective-C实现fermat little theorem费马小定理算法(附完整源码)
    查看>>
    Objective-C实现FermatPrimalityTest费马素数测试算法(附完整源码)
    查看>>
    Objective-C实现fft2函数功能(附完整源码)
    查看>>
    Objective-C实现FFT快速傅立叶变换算法(附完整源码)
    查看>>
    Objective-C实现FFT算法(附完整源码)
    查看>>
    Objective-C实现fibonacci search斐波那契查找算法(附完整源码)
    查看>>
    Objective-C实现fibonacci斐波那契算法(附完整源码)
    查看>>
    Objective-C实现fibonacci斐波那契算法(附完整源码)
    查看>>
    Objective-C实现FIFO(附完整源码)
    查看>>
    Objective-C实现FigurateNumber垛积数算法(附完整源码)
    查看>>
    Objective-C实现finding bridges寻找桥梁算法(附完整源码)
    查看>>
    Objective-C实现first come first served先到先得算法(附完整源码)
    查看>>
    Objective-C实现FIR滤波器(附完整源码)
    查看>>