[百度空间] [原]MFC杂乱笔记
1.
创建动态菜单
假如ID是动态分配的,那么重载
virtual BOOLOnCmdMsg(UINT,int,void*,AFX_CMDHANDLERINFO*);
据MSDN不详细解释,当第二个参数值为CN_COMMAND时,是执行Command的消息,不过要看最后一个参数,如果最后一个参数为空,则为真正执行该命令.否则是查找是否有该命令ID的handler
BOOL TheWindow::OnCmdMsg(UINT nID,int nCode,void* pExtra,AFX_CMDHANDLERINFO* pHandlerInfo)
{
if( nCode == CN_COMMAND )
{
if( nID >= BaseMenuID && nID < MaxMenuID )
{
if( pHandlerInfo == NULL )
{
//handle the Command nID here
}
return TRUE;
}
}
return ParentWnd::OnCmdMsg(nID,nCode,pExtra,pHandlerInfo);
}
根据MSDN,菜单的ID应该是全局的(貌似应该大于0x8000), 又根据WM_COMMAND消息格式,ID最好是一个WORD,ID如果超过一个WORD,例如0x10000,那么WM_COMMAND可以收到这个菜单的命令ID(但跟MSDN的描述LOWORD不一致,而是整个DWORD,这个可能是凑巧),但是MFC的OnCmdMsg只能收到更新消息(CN_UPDATE_COMMAND_UI),不能收到执行消息.
实时设置Menu的Enable和Disable状态(MF_ENABLED,MF_DISABLED,MF_GRAYED)为何无效?比如为何不能禁用菜单项?
在查了MSDN半天之后,终于在一个code example中看到了一段不起眼的注释:
// The code fragment below shows how to disable (and gray out) the
// File\New menu item.
// NOTE: m_bAutoMenuEnable is set to FALSE in the constructor of
// CMainFrame so no ON_UPDATE_COMMAND_UI or ON_COMMAND handlers are
// needed, and CMenu::EnableMenuItem() will work as expected.
大意就是说如果设置m_bAutoMenuEnable该标志为FALSE的话,EnableMenuItem()就可以正常使用了
没有设置该标志呢?猜测framework会自动更新菜单:根据消息映射检查菜单ID是否有handler,如果有,就将其激活,否则就禁用.所以每次手动设置之后就被自动改回来了....
2.
CMDIFrameWnd为何不能处理WM_KEYDOWN消息?(MFC9) 经研究发现,接受焦点的不是他本身,而是他的Client - m_hWndMDIClient,经测试GetFocus() 的返回值的HWND与m_hWndMDIClient的值一致.
因为焦点在他的客户区m_hWndMDIClient上,不在他自己身上,所以他自己无法接受WM_KEYDOWN等等.
3.
MFC DLL注意事项: 每次从外部调用,第一次进入MFC的DLL,都需要调用 AFX_MANAGE_STATE(::AfxGetStaticModuleState());
关于AFX_MANAGE_STATE,MSDN已经说得很清楚了: Call this macro to protect an exported function in a DLL.
4.
如何在控件反射了自己的消息之后,还能让父窗口处理?答: ON_CONTROL_REFLECT_EX ,使用一个BOOL的返回值来确定是否让父窗口继续处理,TRUE表示让父窗口跳过该消息,FLASE则继续让父窗口处理.
ON_CONTROL_REFLECT 的消息处理函数返回值是void,即父窗口不能处理.但是这个消息会自动检查数据变化(如果数据没有变化,则不会调用该handler)
ON_CONTROL_REFLECT_EX 则不同,一旦控件被操作,就调用该handler,所以要手动检查数据.
ON_CONTROL_REFLECT_EX(CBN_SELCHANGE,&TheCombbox::OnSelectChange)
BOOL TheCombbox::OnSelectChange()
{
//数据真的改变?
{
处理数据,返回FALSE ,通知父窗口
}
否则
{
返回TRUE,跳过
}
}
暂时到这里.
[百度空间] [原]MFC杂乱笔记的更多相关文章
- [百度空间] [原]跨平台编程注意事项(三): window 到 android 的 移植
大的问题 先记录一下跨平台时需要注意的大方向. 1.OS和CPU 同一个操作系统, CPU也可能是不一样的, 比如windows也有基于arm CPU的版本,而android目前有x86,arm,mi ...
- [百度空间] [原] 全局operator delete重载到DLL
由于很久没有搞内存管理了,很多细节都忘记了今天项目要用到operator delete重载到DLL,发现了问题,网上搜索以后,再对比以前写的代码,发现了问题:原来MSVC默认的operator new ...
- [百度空间] [原]跨平台编程注意事项(二): windows下 x86到x64的移植
之前转的: 将程序移植到64位Windows 还有自己乱写的一篇: 跨平台编程注意事项(一) 之前对于x64平台的移植都是纸上谈兵,算是前期准备工作, 但起码在写代码时,已经非常注意了.所以现在移植起 ...
- [百度空间] [原]DLL导出实例化的模板类
因为模板是在编译的时候根据模板参数实例化的,实例化之后就像一个普通的类(函数),这样才有对应的二进制代码;否则,没有模板参数,那么编译器就不知道怎么生成代码,所以生成的DLL就没有办法导出模板了.但是 ...
- [百度空间] [原]CImageList支持32位透明位图
32位的位图主要是包含Alpha值(0-255)可以有半透效果的.之前用FreeImage加载 的DIB, CImageList直接绘制会有黑色背景.即便用了ILC_MASK,也创建了mask map ...
- [百度空间] [原] Empty base class optimization
最近遇到了一个诡异的问题, 数组的数据不对, 最后发现是两个类型的大小不一样导致的. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
- [百度空间] [原]android下的各种坑
一堆so文件安装不正确: apk里面都是全的, 但是安装完后/data/data/$pkg/lib下面就没有 google了好长时间没有结果.最后发现是因为没库有加lib前缀(当时想了一下觉得不加更好 ...
- 毕业论文评审意见、导师意见范文、模板_Smile~风_百度空间
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- centos5.5字体为方块问题的解决_深入学习编程_百度空间
centos5.5字体为方块问题的解决_深入学习编程_百度空间 centos5.5字体为方块问题的解决 一.yum -y install fonts-chinese二.yum -y install f ...
随机推荐
- Php output buffering缓存及程序缓存
在php中有时为了控制程序的输出显示顺序,提供了output buffering缓存(php自身缓存机制). 若Ob缓存开启,需要输出的就先存在ob缓存里,再到程序缓存里.若没有开启,则直接进入 ...
- wordpress学习-plugins-001
plugins-插件 Akismet(Automattic Kismet)是应用广泛的一个垃圾留言过滤系统,其作者是大名鼎鼎的WordPress创始人Matt Mullenweg,Akismet也是W ...
- Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
问题提示:Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace. ...
- js常用函数收集
在js中,可以使用typeof获取变量或函数的类型,如下: <head runat="server"> <title></title> < ...
- 2016/09/21 java关键字static
1.static方法 static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上th ...
- Maven学习随记
慕课网视频教程:http://www.imooc.com/learn/443 ====Maven是什么 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建.报告和文档的软件 ...
- jQuery toggle方法的一个奇怪表现。
function buildTree() { //$('.tree li:has(ul)').addClass('parent_li').find(' > span').attr('title' ...
- feel
昨天我大脑中还在盘旋几个关键字:健康 选择 方向 方法今天只有选择了,健康 是你选择了一种生活习惯,你能掌控的也就是好的习惯,选择了一种正确的价值观,选择了一个好的开始方向有很多,你的选择是结果方法 ...
- JAVA基础-子类继承父类实例化对象过程
之前在项目中碰到这样一个问题: 类B继承了类A,B在实例化的时候,A的构造方法中调用了B的某个方法,并且B的方法中对B的成员属性进行了初始化,然后最后得到的B对象的成员属性为空. 代码场景如下: 这里 ...
- [原创]PostgreSQL Plus Advanced Server监控工具PEM(二)
2.安装PEM Client 简单两条命令,开始PEM Client的安装. 我们在SUSE 11sp2上安装PEM Client 安装结束,运行PEM Client后可以看到如下的界面: 目前我们并 ...