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杂乱笔记的更多相关文章

  1. [百度空间] [原]跨平台编程注意事项(三): window 到 android 的 移植

    大的问题 先记录一下跨平台时需要注意的大方向. 1.OS和CPU 同一个操作系统, CPU也可能是不一样的, 比如windows也有基于arm CPU的版本,而android目前有x86,arm,mi ...

  2. [百度空间] [原] 全局operator delete重载到DLL

    由于很久没有搞内存管理了,很多细节都忘记了今天项目要用到operator delete重载到DLL,发现了问题,网上搜索以后,再对比以前写的代码,发现了问题:原来MSVC默认的operator new ...

  3. [百度空间] [原]跨平台编程注意事项(二): windows下 x86到x64的移植

    之前转的: 将程序移植到64位Windows 还有自己乱写的一篇: 跨平台编程注意事项(一) 之前对于x64平台的移植都是纸上谈兵,算是前期准备工作, 但起码在写代码时,已经非常注意了.所以现在移植起 ...

  4. [百度空间] [原]DLL导出实例化的模板类

    因为模板是在编译的时候根据模板参数实例化的,实例化之后就像一个普通的类(函数),这样才有对应的二进制代码;否则,没有模板参数,那么编译器就不知道怎么生成代码,所以生成的DLL就没有办法导出模板了.但是 ...

  5. [百度空间] [原]CImageList支持32位透明位图

    32位的位图主要是包含Alpha值(0-255)可以有半透效果的.之前用FreeImage加载 的DIB, CImageList直接绘制会有黑色背景.即便用了ILC_MASK,也创建了mask map ...

  6. [百度空间] [原] 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 ...

  7. [百度空间] [原]android下的各种坑

    一堆so文件安装不正确: apk里面都是全的, 但是安装完后/data/data/$pkg/lib下面就没有 google了好长时间没有结果.最后发现是因为没库有加lib前缀(当时想了一下觉得不加更好 ...

  8. 毕业论文评审意见、导师意见范文、模板_Smile~风_百度空间

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  9. centos5.5字体为方块问题的解决_深入学习编程_百度空间

    centos5.5字体为方块问题的解决_深入学习编程_百度空间 centos5.5字体为方块问题的解决 一.yum -y install fonts-chinese二.yum -y install f ...

随机推荐

  1. Php output buffering缓存及程序缓存

       在php中有时为了控制程序的输出显示顺序,提供了output buffering缓存(php自身缓存机制). 若Ob缓存开启,需要输出的就先存在ob缓存里,再到程序缓存里.若没有开启,则直接进入 ...

  2. wordpress学习-plugins-001

    plugins-插件 Akismet(Automattic Kismet)是应用广泛的一个垃圾留言过滤系统,其作者是大名鼎鼎的WordPress创始人Matt Mullenweg,Akismet也是W ...

  3. 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. ...

  4. js常用函数收集

    在js中,可以使用typeof获取变量或函数的类型,如下: <head runat="server"> <title></title> < ...

  5. 2016/09/21 java关键字static

    1.static方法     static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上th ...

  6. Maven学习随记

    慕课网视频教程:http://www.imooc.com/learn/443 ====Maven是什么 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建.报告和文档的软件 ...

  7. jQuery toggle方法的一个奇怪表现。

    function buildTree() { //$('.tree li:has(ul)').addClass('parent_li').find(' > span').attr('title' ...

  8. feel

    昨天我大脑中还在盘旋几个关键字:健康 选择 方向 方法今天只有选择了,健康 是你选择了一种生活习惯,你能掌控的也就是好的习惯,选择了一种正确的价值观,选择了一个好的开始方向有很多,你的选择是结果方法 ...

  9. JAVA基础-子类继承父类实例化对象过程

    之前在项目中碰到这样一个问题: 类B继承了类A,B在实例化的时候,A的构造方法中调用了B的某个方法,并且B的方法中对B的成员属性进行了初始化,然后最后得到的B对象的成员属性为空. 代码场景如下: 这里 ...

  10. [原创]PostgreSQL Plus Advanced Server监控工具PEM(二)

    2.安装PEM Client 简单两条命令,开始PEM Client的安装. 我们在SUSE 11sp2上安装PEM Client 安装结束,运行PEM Client后可以看到如下的界面: 目前我们并 ...