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

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

相关文章

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li