1.当对某菜单添加消息响应函数时,4个类的消息响应优先次序分别是:1.View;2.CDOC;3.CMainFrame.4.CWinAPP.为什么?请参阅《深入浅出》2.消息分类:a;标准消息(以WM_开头的消息,但不包括ON_COMMAND);b;命令消息 ON_COMMAND(IDM_PHONE1, OnPhone1),菜单和工具栏的消息。c.通告消息:按钮,列表框发出的消息。CCmdTarget只能接受命令消息。而从CCmdTarget派生的CWnd可以接收命令消息,也可以接受标准消息。3.确定菜单的索引号,注意从0开始,分隔符也算数。什么叫弹出菜单(Popup Menu)?一个子菜单只能有一个缺省菜单。 //GetMenu()->GetSubMenu(0)->SetDefaultItem(5,TRUE);str.Format("x=%d,y=%d",GetSystemMetrics(SM_CXMENUCHECK), GetSystemMetrics(SM_CYMENUCHECK));//获得系统的菜单的位图的大小。/* SetMenu(NULL);//移除菜单 CMenu menu;menu.LoadMenu(IDR_MAINFRAME);SetMenu(&menu);menu.Detach();*/增加菜单,此处detach(),如果是局部变量。4.void CMainFrame::OnUpdateEditCut(CCmdUI* pCmdUI) {if(2==pCmdUI->m_nIndex) pCmdUI->Enable();//当此菜单显示时,设为可用。}5.右键弹出菜单功能的实现方法有两个: a.Project->Add to Project->component and controls->文件夹VC components->Popup Menu OK b.用TrackPopupMenu()实现。CMenu menu;menu.LoadMenu(IDR_MENU1);CMenu *pPopup=menu.GetSubMenu(0);ClientToScreen(&point);pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, GetParent());6.动态创建菜单的方法: CMenu menu;menu.CreatePopupMenu();// GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"WinSun");GetMenu()->InsertMenu(2,MF_BYPOSITION | MF_POPUP,(UINT)menu.m_hMenu,"WinSun");menu.AppendMenu(MF_STRING,IDM_HELLO,"Hello");menu.AppendMenu(MF_STRING,112,"Weixin");menu.AppendMenu(MF_STRING,113,"Mybole");menu.Detach();GetMenu()->GetSubMenu(0)->AppendMenu(MF_STRING,114,"Welcome");GetMenu()->GetSubMenu(0)->InsertMenu(ID_FILE_OPEN, MF_BYCOMMAND | MF_STRING,115,"维新");// GetMenu()->DeleteMenu(1,MF_BYPOSITION);// GetMenu()->GetSubMenu(0)->DeleteMenu(2,MF_BYPOSITION);7.为动态创建的菜单增加消息响应的步骤 a.在resource.h中增加#define IDM_HELLO 123 b.在MainFrm.h中加入afx_msg void OnHello(); c.MainFrm.cpp中加入ON_COMMAND(IDM_HELLO,OnHello) d.最后加入void CMainFrame::OnHello(){MessageBox("Hello!");}8.动态增加电话号码本步骤 a.处理WM_Char消息。如果回车,则清空字符串,窗口重绘invalidate,将人名加入到菜单中,将字符串保存集合类CStringArray中,用的是成员函数Add方法。 b.取出动态创建的菜单的数据的方法。 1)创建一个弹出菜单,弹出菜单下面有4个子菜单。将子菜单的ID号连续。 2)在resource.h中添加#define IDM_PHONE1 123.... 3)添加其消息响应函数。注意注释中的文字BEGIN_MESSAGE_MAP(CMenu2View, CView)//{{AFX_MSG_MAP(CMenu2View)ON_WM_CHAR()ON_COMMAND(ID_EDIT_COPY, OnEditCopy)//下面的4句代码原来在此处。//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(IDM_PHONE1, OnPhone1)//一定要这4句代码移到此处。ON_COMMAND(IDM_PHONE2, OnPhone2)ON_COMMAND(IDM_PHONE3, OnPhone3)ON_COMMAND(IDM_PHONE4, OnPhone4)ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP() 4)填写代码9.如何在MainFrame中拦截OnCommand消息?答,在它增加OnCommand的消息处理函数即可。10.错误调试方法:Missing ";" before "*"CMenu2Doc* GetDocument();//因为CMenu2Doc是个不认识的变量,将其头文件包含进即可。

评论