孙鑫VC++第6章菜单
来源:互联网 发布:seo外包hane888 编辑:程序博客网 时间:2024/06/05 18:14
第六章、菜单
1. 默认顶层菜单为弹出式菜单,这种菜单不能响应命令。
菜单命令响应函数的添加
先添加菜单资源,有了菜单资源ID后,用类向导,找到框架类,在消息中选中COMMAND,
然后添加一个响应函数。
2. C**app类和 C**doc类都不是从cwnd类派生的,所以他们没有Messagebox成员函数,
我们可以使用全局的MessageBox函数,或者使用应用程序框架函数AfxMessageBox
3. 响应菜单项命令的顺序依次是:视类、文档类、框架类,最后才是应用程序类;
4. Windows消息的分类:1.标准消息(除了WM_COMMAND之外的消息);
2.命令消息:WM_COMMAND消息,MFC中,通过菜单项的ID来区分不同的命名消息;在SDK中,通过消息的wParam参数识别;
3.通告消息:由控件产生的消息;
5. CWnd类实际上派生于CCmdTarget类,所以,凡是从CWnd派生的类,它们既可以接受标准消息,也可以接受命令消息和通告消息;而从CCmdTarget派生的类,则只能接受命令消息和通告消息;
文档类和应用程序类都派生于CCmdTarget类,所以不接收标准消息类;
6. 标记菜单
在OnCreate函数的最后面添加这一句;
GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION| MF_CHECKED);
7. 默认菜单项(比较黑的字体)
GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE);//1表示位置,从0开始第一项
在【另存为】和【打印】菜单项之间有一个很长的分隔栏,这个分隔栏是占据索引位置的;
一个子菜单只能有一个默认菜单项;
8. 图形标记菜单
//图形标记菜单
//获取标记菜单项上标记图形的默认尺寸
CString str;
str.Format("x=%d,y=%d",GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK));
MessageBox(str);
//然后在画位图的时候再认真按照这个尺寸画
m_bitmap.LoadBitmap(IDB_BITMAP1);
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap,&m_bitmap);//两张图,选中和没选中
9. 禁用菜单项
通常将菜单禁用跟变灰一起使用,虽然不是必须的;
MF_GRAYED和MF_DISABLED这两个标志一起使用;
MFC为菜单提供了一种命令更新的机制,程序运行的时候,根据此机制去判断哪个菜单是可以使用的;
如果我们想自己更改菜单的状态,那么就必须把m_bAutoMenuEnable变量设置为False,(在框架类的构造函数中初始化),然后我们的菜单项的更新才能起作用;
GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION| MF_DISABLED | MF_GRAYED);
10. 移除和装载菜单
//移除菜单
SetMenu(NULL);
//装载菜单
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
SetMenu(&menu);
menu.Detach();//将菜单句柄和菜单对象分离开来;因为menu在这里是局部变量;
11. MFC菜单命令更新机制
MFC编程时,菜单项状态依赖于CN_UPDATE_COMMAND_UI消息;
手动可用类向导来实现;ID_EDIT_CUT是【剪切】菜单项的标志;然后增加一个消息响应函数;函数有一个指向CCmdUI类的参数,它可以决定一个菜单项是否可以使用,是否有标记,还可以改变菜单项的文本;
UI是User Interface的简写,即用户接口;菜单项就是一个用户接口;
12. 如果要把工具栏上的一个工具按钮与菜单栏上的某个菜单项相关联,只要将他们的ID设置为同一个标志就行了;
13. 菜单项和工具按钮的位置索引计算方式不同;
14. 快捷菜单??(上下文菜单,或右键菜单)
在【Project】->【Add toProject】->【Componets and Controls…】
组件和控件库的内容是VC++为我们已经写好的一些功能,就一些组件和ActiveX控件;
15. 自定义右快捷键
1. 先曾经一个新的菜单资源。因为在显示快捷菜单时顶级菜单是不会出现的,所以可以随便命名;
2. 给视图类添加EM_RBUTTONDOWN消息响应函数;
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu *pPopup = menu.GetSubMenu(0);//因为这里只有一个子菜单
//将客户区坐标转变为屏幕坐标
ClientToScreen(&point);
//这里的坐标是屏幕坐标,而鼠标点击的是窗口客户区的坐标,所以必须的转换
pPopup->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,point.x,point.y,this);
3. 在菜单资源里面用类向导,为程序添加快捷菜单项命令的响应函数;
16. 动态菜单操作
CMenumenu;
menu.CreateMenu();
//添加菜单项Test
//GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"Test");
//插入菜单项
GetMenu()->InsertMenu(2,MF_POPUP| MF_BYPOSITION, (UINT)menu.m_hMenu,"Test");//在2这个位置插入
//插入子菜单项
menu.AppendMenu(MF_STRING,11,"Hello");//11是随便赋给的ID号
menu.AppendMenu(MF_STRING,22,"Bye");
menu.AppendMenu(MF_STRING,33,"Mybole");
menu.Detach();
17,删除菜单
//删除菜单
GetMenu()->DeleteMenu(1,MF_BYPOSITION);
//删除子菜单的菜单项
GetMenu()->GetSubMenu(0)->DeleteMenu(1,MF_BYPOSITION);
17. 动态添加的菜单项的命令响应
手工在Resource.h文件中为菜单项资源添加一个新的ID号
#defineIDM_HELLO 111
然后在修改添加菜单项的函数中修改:
Menu.AppendMenu(MF_STRING,IDM_HELLO,”Hello”);
然后在三个地方修改,(MFC消息映射机制修改的是三个地方)
18.动态添加子菜单的实现
m_menu.CreatePopupMenu();
//视类窗口是没有菜单的,因此在视类中直接调用GetMenu函数是无法获得程序的菜单栏对象的;
//必须先使用GetParent();
GetParent()->GetMenu()->AppendMenu(MF_POPUP,(UINT)m_menu.m_hMenu,"PhoneBook");
//CWnd类提供了一个DrawMenuBar成员函数用来完成菜单栏的重绘操作
//因为菜单是属于框架类的,所以同样不能在视类中操作
GetParent()->DrawMenuBar();
18. 将第一个空格前的字符串添加为子菜单项
//添加菜单项,利用Find方法找到第一个空格前的东西,用Left输出
//注意这里的Find方法找到的是下标是从1开始的;
m_menu.AppendMenu(MF_STRING,110,m_strLine.Left(m_strLine.Find('')));
19.集合类
CStringArraym_strArray
M_strArray.add();//往字符数组里面增加;
M_strArray.GetAt();//取出一个集合元素;
- 孙鑫VC++第6章菜单
- VC++深入详解 第6章 菜单
- 孙鑫VC学习(第6课--菜单)
- VC++深入详解笔记---第6章_菜单---6.4 动态菜单操作
- VC++深入详解笔记---第6章_菜单---6.3_基本菜单操作---6.3.7_快捷菜单
- 《VC++深入详解》学习笔记[5]——第6章 菜单
- 孙鑫VC++讲座笔记-(6)菜单编程
- 孙鑫VC++讲座笔记-(6)菜单编程
- 孙鑫VC++讲座笔记-(6)菜单编程
- 孙鑫VC++讲座笔记-(6)菜单编程
- 孙鑫VC++讲座笔记-(6)菜单编程
- MOOC清华《VC++面向对象与可视化程序设计》第5章:菜单资源例程(创建统计计算菜单项)
- 第6课菜单
- 第6课 菜单
- Lesson6 菜单 ---孙鑫VC++教程
- 孙鑫vc第六课,菜单
- VC 6 添加右键菜单
- 孙鑫VC++讲座笔记Lesson 6 菜单编程
- String && StringBuffer && StringBuilder
- [学习笔记] 4个有用程序
- 集合
- 受尽苦难而不厌,此乃修罗之道
- 0911
- 孙鑫VC++第6章菜单
- Android 应用开发笔记 - 文本框(TextView)
- Hibernate xml配置方法之ManyToOne(单向关联关系)
- [学习笔记] Linux 文件系统
- 孙鑫VC++第7章对话框(一)
- 关于驱动开发中mmap函数的实现
- C# 委托初探
- 利用tcpcopy引流做模拟在线测试
- 孙鑫VC++第8章对话框(二)