孙鑫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();//取出一个集合元素;