MFC学习之菜单栏创建
来源:互联网 发布:mac 10.12 降级 编辑:程序博客网 时间:2024/05/20 02:51
在开始学习MFC创建菜单时,根据书上的例子先在资源文件里建立好菜单,然后在代码中将菜单加载出来,其代码如下
`int CMyFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码CMenu menu;menu.LoadMenuA(IDR_MENU1);SetMenu(&menu);menu.Detach();return CFrameWnd::OnCreate(lpCreateStruct);return 0;
}`
当运行程序时,菜单已经建立
当点击菜单项的时,没有弹出子菜单,而是产生中断
经过查阅资料和MSDN上的介绍原来是没有调用CMenu::Detach()
产生中断的原因是menu 是我在OnCreate中定义的一个局部对象,当OnCreate函数执行完成之后会自动调用CMenu的析构函数,进行资源的释放,在析构函数中,调用了Destroy函数,代码如下
BOOL CMenu::DestroyMenu(){ if (m_hMenu == NULL) return FALSE; return ::DestroyMenu(Detach());}从代码可以看出来,如果在OnCreate结束前没有释放menu句柄,会调用WIN32API函数::DestroyMenu(Detach));继续单步调试进入这个函数
会自己调用Detach函数将menu对象与菜单句柄分离,然后才将menu对象销毁,当在OnCreate函数返回之前加入menu.Detach函数时,再次运行程序,点击菜单项不会中断,如图所示
虽然问题得到了解决,也大致明白了为什么会产生中断,但是心中却多了个疑问,因为从调试步骤看,虽然自己没有调用Detach函数,但是在menu对象析构的过程中,系统调用了Detach函数,感觉跟自己手动调用的效果不应该有区别,为什么会一个报错一个正常呢,肯定是还有那个地方没有弄清楚
ps:再次跟断点在析构函数里进入DestroyMenu(Detach))函数时发现此时menu对象未定义,是否是已经被释放了,如果是的那就正面后面调用的Detach函数没有起到作用
- MFC学习之菜单栏创建
- MFC可停靠菜单栏的创建过程
- MFC菜单栏的创建和使用
- Flex3学习轨迹:创建菜单栏
- MFC学习笔记.day03-菜单,图形标记菜单创建,菜单栏禁用,命令响应,右键弹出菜单,添加菜单
- 创建window应用程序(win32 非 mfc) 去掉菜单栏
- 如何创建 MFC 应用程序在 Visual C++ 中没有菜单栏
- MFC基于对话框的菜单栏,工具栏和状态栏的创建
- 创建菜单栏
- 创建“菜单栏”
- MFC学习之 创建ActiveX控件 遇到的问题
- mfc学习之主框架窗口创建过程
- MFC中的菜单栏相关
- MFC取消菜单栏
- MFC 个性化菜单栏
- MFC对话框添加菜单栏
- MFC 菜单栏的使用
- MFC菜单栏(CMenu)控件
- RDD, DataFrame or Dataset
- 以项目管理的理念制作高质量的标书
- 玩转树莓派之五----安装chrome,flash
- 设计模式--单一职责原则,开放封闭原则,依赖倒转原则
- HTML5之地理位置
- MFC学习之菜单栏创建
- NYOJ-盗梦空间
- Paxos算法证明
- Android开发——数据库框架Sugar出现no such table xxxx错误的解决办法
- 关于struts2
- 定时取指定进程内存脚本
- 项目中遇到的问题,解决的方法
- git ignore 添加后不生效 解决办法
- 解决Android studio中min sdk xx >device sdk xx的问题