acmilan作者
11年4个月前修改于 11年4个月前IP:四川
783418
4楼
(五)给窗口添加菜单

给窗口添加菜单要用到资源文件,资源文件的扩展名为.rc,保存有各种可集成在程序内部的资源(如图标、光标、位图、菜单模板、对话框模板、快捷键、字符串表等),可以在程序中方便地加载。

一、新建资源文件

右击“解决方案资源管理器”中的“资源文件”,选择添加-》添加新项
在对话框中选择Visual C++-》资源-》资源文件(.rc),点击“添加”

主窗口3.png

再次转到“解决方案资源管理器”,可以发现多了两个文件:resource.h和resource.rc,其中前者为符号定义文件,后者为资源文件的主体

主窗口5.png

二,添加菜单资源

双击resource.rc,将转到“资源视图”,右击顶层项目“Win32Project1”,选择添加-》添加资源

主窗口4.png

在对话框中,选择Menu,双击或点击“新建”

主窗口6.png

在打开的菜单编辑器中编辑刚刚插入的菜单资源,这里菜单结构如下,其中字符&可以指定助记键:
通用(&G) - Popup菜单项
关于(&A) - 编号ID_ABOUT
退出(&X) - 编号ID_EXIT

主窗口7.png

三、修改代码加载菜单

转到“解决方案资源管理器”,双击打开myfirst.c源文件,添加一行导入资源符号
#include "resource.h"

加载菜单有若干种方法,其中最方便的是直接在窗口类中指定菜单的编号。
转到wWinMain函数,找到我们的窗口类,修改菜单字段为我们的编号,要注意需要转换为(wchar_t*):
// 窗口类设定
// 样式、函数
// 类增、窗增            (高级参数)
// 模块、图标、光标     (光标=鼠标指针)
// 背景、菜单、类名
WNDCLASS wc = {
    CS_HREDRAW | CS_VREDRAW, // 样式:横向、纵向改变大小时重绘
    WndProc, // 窗口消息处理函数
    0, 0,
    hInst, // 模块句柄
    LoadIcon(NULL, IDI_APPLICATION), // 图标:默认图标
    LoadCursor(NULL, IDC_ARROW), // 光标:箭头
    GetStockObject(WHITE_BRUSH), // 背景画刷:白色
    (wchar_t*)IDR_MENU1, // 菜单:IDR_MENU1
    L"MyWindow", // 窗口类名称
};

四、处理菜单消息

和按钮一样,菜单的项的消息也是WM_COMMAND,因此处理方法也是一样的,这里就不多讲了:
case WM_COMMAND: // 接收到命令消息
    switch (LOWORD(wp)) // 判断来源编号(包含在参数wp的低16位中)
    {
    case ID_BUTTON: // 来自ID_BUTTON按钮
        MessageBox(hWnd, L"欢迎来到Win32编程世界", L"消息框", 0); // 弹出消息框
        return 0;
    case ID_ABOUT: // 来自ID_ABOUT菜单项
        MessageBox(hWnd, L"我的第一个Win32程序", L"关于", 0); // 弹出消息框
        return 0;
    case ID_EXIT: // 来自ID_EXIT菜单项
        SendMessage(hWnd, WM_CLOSE, 0, 0); // 关闭窗口
        return 0;
    }
    break; // 消息未处理

五、运行

运行效果:

主窗口8.png
评论
文号 / 783418

千古风流
名片发私信
学术分 4
总主题 466 帖总回复 2942 楼拥有证书:进士 学者 笔友
注册于 2009/05/30 21:22:42最后登录 2019/01/31 17:16:38
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:0

个人简介

暂未填写
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的