模式对话框非模式对话框添加工具栏、菜单、状态栏总结

2024-05-10 08:08

本文主要是介绍模式对话框非模式对话框添加工具栏、菜单、状态栏总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

         一、菜单与工具按钮同步响应的问题

 要使菜单、工具栏按钮响应同一个事件只需要将两者ID号设置为相同即可;我在这里主要说明怎样使两者的ON_UPDATE_COMMAND_UI命令得到一致的响应

        (1)无论是模态对话框还是非模态对话框,要更新菜单与工具按钮的状态,即添ON_UPDATE_COMMAND_UI消息响应。但是,结果出乎我们意料,对话并没有任何响应:

从命令用户界面处理函数(Command UI handler)改变菜单状态(启用/禁用,选择/取消选择,更改文字)在由对话框处理时没有正常工作。

void CTestDlg::OnUpdate**********(CCmdUI*pCmdUI)

{

   pCmdUI->SetCheck(TRUE); // 没有文字前显示选定标记.

   pCmdUI->SetRadio(TRUE); // 没有在文字前显示点.

   pCmdUI->SetText("Close"); //没有更改菜单文字.

}

原因:下拉菜单显示的时候, WM_INITMENUPOPUP消息被先发送以显示菜单项MFC CFrameWnd::OnInitMenuPopup函数遍历菜单项并为每个菜单项调用更新命令处理函数(如果有的话),.菜单的外观被更新以反映它的状态(启用/禁用,选择/取消选择),更新用户界面机制在基于对话框的应用程序中不能工作,因为CDialog没有OnInitMenuPopup处理函数,而使用CWnd's默认处理函数,该函数没有为菜单项调用更新命令处理函数。

解决办法:添加该函数。可以使用类向导来添加(即:项目->类向导->类名选”CXXXDlg”->消息里搜” WM_INITMENUPOPUP”->添加)如果消息里没有该消息,可以使用类向导类的”添加自定义消息”进行添加或进行手动添加。

具体细节见:http://blog.csdn.net/johnnyhu90/article/details/9623207

在此主要补充http://blog.csdn.net/johnnyhu90/article/details/9623207中所说在非模态对话框中的不同。

对于非模态对话框,它没有自己单独的消息循环,工具条总是无法响应ON_UPDATE_COMMAND_UI消息大哭大哭;所以我的解决

办法是:

        在工具按钮对应的消息响应函数汇总手动添加更改工具按钮状态的代码:m_ToolBar.GetToolBarCtrl().CheckButton(nID,bcheck);以此来更新工具按钮的状态。

二、工具按钮提示信息

“工具按钮的提示信息”就是希望我们鼠标落在工具条按钮上时,能够自动的给出按钮的功能简介:


(1)对于模态对话框,也需要手动添加消息映射。网上已有成功的解决方案:http://blog.163.com/zero_li/blog/static/1727255720110130508138/
(2)对于非模态对话框,我们发现应用程序无法响应上面手动添加的消息响应快哭了,这里给出一种解决方案:添加一个HOOK(钩子)。
   1.定义一个全局变量:HHOOK hMeasureHook;
2.头文件添加函数声明:static LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam);
     3.源文件添加定义:
LRESULT CALLBACK CtestDialog::GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam)
{//AFX_MANAGE_STATE(AfxGetStaticModuleState( ));LPMSG lpMsg = (LPMSG) lParam;if( (nCode >= 0) ){CWnd *pWnd = CWnd::FromHandlePermanent(lpMsg->hwnd);if (pWnd)    // a CWnd existspWnd->PreTranslateMessage(lpMsg);}return ::CallNextHookEx(hMeasureHook, nCode, wParam, lParam);
}

  4.在OnInitDialog()中添加钩子:
hMeasureHook = SetWindowsHookEx(WH_GETMESSAGE,GetMessageProc,NULL,GetCurrentThreadId());ASSERT (hMeasureHook);


这样就OK了大笑

这篇关于模式对话框非模式对话框添加工具栏、菜单、状态栏总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975904

相关文章

C# List.Sort四种重载总结

《C#List.Sort四种重载总结》本文详细分析了C#中List.Sort()方法的四种重载形式及其实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录1. Sort方法的四种重载2. 具体使用- List.Sort();- IComparable

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

python3中正则表达式处理函数用法总结

《python3中正则表达式处理函数用法总结》Python中的正则表达式是一个强大的文本处理工具,用于匹配、查找、替换等操作,在Python中正则表达式的操作主要通过内置的re模块来实现,这篇文章主要... 目录前言re.match函数re.search方法re.match 与 re.search的区别检索

C++中的解释器模式实例详解

《C++中的解释器模式实例详解》这篇文章总结了C++标准库中的算法分类,还介绍了sort和stable_sort的区别,以及remove和erase的结合使用,结合实例代码给大家介绍的非常详细,感兴趣... 目录1、非修改序列算法1.1 find 和 find_if1.2 count 和 count_if1

Redis中群集三种模式的实现

《Redis中群集三种模式的实现》Redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1. Redis三种模式概述2、Redis 主从复制2.1 主从复制的作用2.2 主从复制流程2

深入理解MySQL流模式

《深入理解MySQL流模式》MySQL的Binlog流模式是一种实时读取二进制日志的技术,允许下游系统几乎无延迟地获取数据库变更事件,适用于需要极低延迟复制的场景,感兴趣的可以了解一下... 目录核心概念一句话总结1. 背景知识:什么是 Binlog?2. 传统方式 vs. 流模式传统文件方式 (非流式)流

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装