【MFC】菜单与状态栏(15)

news2024/11/26 2:36:05

菜单

一般菜单的使用步骤:

1.编辑菜单资源,设置菜单属性(包括菜单名和ID);

2.用ClassWizard自动映射菜单消息和成员函数;

3.手工编辑成员函数,加入菜单消息处理代码。

单文档窗口可以设置默认的主菜单,在资源视图中可以进行修改:

 类向导中可以很方便点挂上消息处理函数:

值得注意的是更新菜单命令是用于响应菜单命令后对菜单项进行更新的消息(比如勾选、变灰等等)

在视图类中响应菜单命令,做一个简单测试:

 

......
void CMFC07View::OnPause()
{
	// TODO: 在此添加命令处理程序代码
	::AfxMessageBox("暂停");
	state=1;
}


void CMFC07View::OnStart()
{
	// TODO: 在此添加命令处理程序代码
	::AfxMessageBox("启动");
	state=0;
}

.....
void CMFC07View::OnUpdatePause(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	 pCmdUI->SetCheck(state==1);	
}


void CMFC07View::OnUpdateStart(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->SetCheck(state==0);
}

其中 state定义在视图类中,标记当前状态,实现菜单显示勾选。 

 设置快捷键:打开资源视图,设置菜单ID对应的快捷键

 这样也可以通过键盘输入来启动菜单命令。

菜单命令的更新也可以利用代码来动态实现:如停止(退出)菜单的更新

void CMFC07View::OnStop()
{
	// TODO: 在此添加命令处理程序代码
	static bool flag=true; //静态变量
	::AfxMessageBox("退出");   
	CMenu *menu=::AfxGetMainWnd()->GetMenu();
	if(menu)
	{
		if(flag) menu->CheckMenuItem(ID_STOP,MF_BYCOMMAND|MF_CHECKED);
		else menu->CheckMenuItem(ID_STOP,MF_BYCOMMAND|MF_UNCHECKED);
	}
	flag=!flag;
}

右键菜单:类向导中OnContextMenu可以响应右键菜单

 当然,弹出右键菜单需要自己来动态加载:

新建一个菜单(当然可以可以使用主菜单)

 动态加载菜单代码:

void CMFC07View::OnContextMenu(CWnd* pWnd, CPoint point)
{
	// TODO: 在此处添加消息处理程序代码	
	CMenu menu;
	menu.LoadMenu(IDR_TEST);
	CMenu* pPopup = menu.GetSubMenu(0);
	pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,pWnd);
}

如果需要利用快捷键打开右键菜单则需要丢point进行处理(因为按键的时候,鼠标点位置可能不在窗口区域)。另外,默认添加的右键菜单响应函数屏蔽了pWnd 和 point,手动取消即可。

状态栏

状态栏实际上是个窗口,一般分为几个窗格,每个窗格显示不同的信息。AppWizard会为应用程序自动创建一个状态栏,该状态栏包括几个窗格,分别用来显示状态栏提示和CAPS LOCK、NUM LOCK 、SCROLL LOCK键的状态。在MFC中,状态栏的功能由CStatusBar类实现。

ID数组

static UINT indicators[] =

{

ID_SEPARATOR, // status line indicator

ID_INDICATOR_CAPS,

ID_INDICATOR_NUM,

ID_INDICATOR_SCRL,

};

indicator数组提供了状态栏窗格的分配信息,它的第一项一般为ID_SEPARATOR,该ID对应的窗格用来显示命令提示信息,后三项都是字符串ID,可以在StringTable中找到:

 添加状态栏显示信息,以添加动态更新的时钟为例:

 首先在主框架类中添加时钟响应消息:(主框架管理状态栏)

 然后,在StringTable里添加一个字符串:显示格式为 00:00:00

 在主框架类的indicators中添加对应的ID(可能报错,添加resource.h可以解决问题)

OnCreate 函数中启动定时(不能在构造函数里,窗口没有创建)

 this->SetTimer(1,100,NULL); //100毫秒刷新定时,可以换成1000

修改定时消息响应函数:

void CMainFrame::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CTime time;
	time=CTime::GetCurrentTime();
	CString s=time.Format("%H:%M:%S");
	m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_CLOCK),s);
	CFrameWnd::OnTimer(nIDEvent);
}

获取当前时间,格式化成字符串,然后更新到状态栏。可以在析构函数或者WM_CLOSE消息响应中清除定时:this->KillTimer(1);  // 1 是SetTimer 的定时编号,可以设置多个定时

定时消息也可以自定义处理函数,在动画、刷新等等处理中经常用到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/336483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2年时间,涨薪20k,想拿高薪还真不能老老实实的工作...

2016年开始了我的测试生活。 2016年刚到公司的时候,我做的是测试工程师。做测试工程师是我对自己的职业规划。说实话,我能得到这份工作真的很高兴。 来公司的第一个星期,因为有一个项目缺人,所以部门经理提前结束了我的考核期&a…

C语言预处理

文章目录 目录 文章目录 前言 一、程序编译的过程 二、编译阶段 1.预处理(*.i) 2.编译(*.s) 3.汇编(*.o) 4.链接 总结 前言 提示:使用vs code(gcc编译器)与vs2022来演示c语言的预处理 提示:以下是本篇文章正文内容,下面…

KEIL编译报错,解决方法汇总

目录 背景 最近在跟着野火码uCosiii的代码时,感觉非常完美,结果一编译,报了120个莫名其妙的问题,下面是踩过的坑,一起记录下,免得下次又掉进去了~ 1. 编译汇编文件,报错 error: unexpected t…

看海泰方圆类ChatGPT技术模型!

ChatGPT,上线2个月便以破亿的用户群引爆了全网。 ChatGPT是由OpenAI公司开发的AI聊天机器人程序,于2022年11月底推出,能够通过学习和理解人类的语言来进行对话、互动,甚至能完成撰写邮件、视频脚本、文案、翻译、代码等任务&…

南卡和JBL无线蓝牙耳机哪款更值得买?横向评测后秒懂差距!

蓝牙耳机想必大家都很熟悉,无论是商务办公还是休闲娱乐,它都起到了至关重要的作用。但蓝牙耳机发展速度太快,耳机品质也参差不齐,最近看到大多数人都有一个疑问:买什么蓝牙耳机比较好?作为一个资深的耳机爱…

动态规划:状态压缩DP(2)(P1896 互不侵犯 ,矩阵计数)

文章目录互不侵犯矩阵计数互不侵犯 题目传送门 在NN的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。 升级版的八皇后问题&#xf…

(一)随处可见的LED广告屏是怎么工作的呢?

笔者前段时间项目上正好用到一块32*128分辨率的单色LED,正式介入开发的时候,才发现网上的资料少之又少,供应商也给不出有价值的参考信息。故打算分成三篇详细的介绍下开发过程中遇到的问题。本篇主要介绍LED屏幕的一些基础信息,第…

C#互联网医院源码 智慧医院小程序源码 在线问诊在线开方源码

互联网医院平台源码 智慧医院管理系统源码 开发环境:ASP.NET C# VS2019 SQL2008 依托于实体医院利用互联网技术对接院内业务信息系统,向患者提供基于线上问诊、预约挂号、缴费结算、医患互动、诊后随访、健康科普和复诊等全面的医疗健康互联网服务。…

关于apifox和postman接口工具我有话要说~~

Apifox 和 Postman 都是流行的接口测试工具,各自有其优势和缺点。Apifox 的优势在于它提供了强大的可视化界面,可以方便地测试和监控 API。它还支持多种请求方式,并且支持对请求和响应进行代码生成。但是,Apifox 的缺点在于它不太…

详解指针(1)(初阶版)

前言:本篇是详解指针(1),内容包括:指针是什么,指针和指针类型,野指针 part 1:指针是什么 1 指针就是地址,口语中说的指针通常指的是指针变量 2 指针变量:存…

shiro721——CVE-2019-12422

这两个漏洞主要区别在于Shiro550使⽤已知密钥碰撞,后者Shiro721是使⽤ 登录后rememberMe {value}去爆破正确的key值 进⽽反序列化,对⽐Shiro550条件只要有 ⾜够密钥库 (条件⽐较低)、Shiro721需要登录(要求⽐较⾼鸡肋 …

Unity基于GraphView的行为树编辑器

这里写自定义目录标题概述基于GitHub上:目前这只是做了一些比较基础的功能节点开发,仅仅用于学习交流,非完成品。项目GitHub连接:[https://github.com/HengyuanLee/BehaviorTreeExamples](https://github.com/HengyuanLee/Behavio…

GNSS 精密钟差产品介绍与DCB改正详解

文章目录前言参考前言 IGS 提供的 GNSS 轨道产品和钟差产品的解算基准并非完全一样, 对于精密产品,各 GNSS 系统的参考基准均为双频无电离层组合;对于广播星历,则区分 GPS 类卫星(GPS,Galileo,QZSS) 基于双频无电离组合的伪距以及 BDS 卫星系…

CAPL(vTESTStudio) - DoIP - TCP发送_05

TCP发送 参数定义 版本号:02 FD or 01 FE or 其他任意值数据类型:00 05 or 00 06 or 80 01 or其他任意值数据长度:想要发送的任意长度

Node.js http 模块详解:request 对象

前言 前文介绍了 http 模块的基本用法,主要就是调用 createServer 和 listen 方法来创建和启动服务。要处理具体的 HTTP 请求,就要在 createServer 方法中写点什么。本文来介绍处理请求的两个核心对象之一的 request 。 URL HTTP 协议最早设计出来&am…

车载TBOX嵌入式设备软件的性能测试

作者 | 李伟 上海控安安全测评中心安全测评部总监 来源 | 鉴源实验室 01 ECU软件和通用软件性能测试的区别 通用软件进行性能测试时通常会通过压力测试、负载测试、稳定性测试、疲劳强度测试、用户并发访问测试等等方法来了解当前软件系统的各项性能指标数据,并在…

【mybatis】实现分页查询

一 .使用原生分页器的实体类 1.1 java代码部分 方法多 不易书写 package cn.bdqn.entity;public class Page {private Integer pageIndex;//页码private Integer pageSize;//页大小 显示多少行数据private Integer totalCounts;//数据的总行数private Integer totalPages;//…

docker安装部署dragonfly2镜像加速服务

Dragonfly安装部署文档 ​ Dragonfly 作为龙蜥社区的镜像加速标准解决方案,是一款基于 P2P 的智能镜像和文件分发工具。它旨在提高大规模文件传输的效率和速率,最大限度地利用网络带宽。在应用分发、缓存分发、日志分发和镜像分发等领域被大规模使用。 …

鸟哥的Linux私房菜读书笔记:Linux磁盘与文件系统管理

系统管理员很重要的任务之一就是管理好自己的磁盘文件系统, 每个分区不可太大也不能太小, 太大会造成磁盘容量的浪费, 太小则会产生文件无法储存的困扰。 前面谈到的文件权限与属性中, 这些权限与属性分别记录在文件系统的哪个区块…

[Golang实战]如何快速接入chatgpt/openai?[引入go-gpt3][新手开箱可用]

如何快速接入chatgpt?[引入go-gpt3]上文介绍了如何在网页使用chatgpt?V1.介绍下在golang中使用chatgpt?1.查看官网推荐的chatgpt项目2.访问go-gpt33.使用并运行在自己的项目中...(是因为例子很难理解,所以一一对应了属性做了配置)3.1安装项目3.2换上自己的代码3.3换上自己的…