标签:
1.Cmenu3View 键盘获取函数解析
1 void CMenu3View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 2 { 4 CClientDC dc(this);//获取的是view句柄 5 if(0x0d==nChar)//如果检测到回车键进行一下操作 6 { 7 if(0==++m_nIndex)//初始值为-1,说明是第一次回车 8 { 9 m_menu.CreatePopupMenu();//建立菜单 10 GetParent()->GetMenu()->AppendMenu(MF_POPUP,(UINT)m_menu.m_hMenu/*进行强制转换*/,"PhoneBook");//窗口尺寸变了,才出来,是什么情况? 11 GetParent()->DrawMenuBar();//调用父类进行菜单栏重会 12 } 13 m_menu.AppendMenu(MF_STRING,IDM_PHONE1+m_nIndex/*这里是亮点*/,m_strLine.Left(m_strLine.Find(" "))); 14 m_strArray.Add(m_strLine); 15 m_strLine.Empty();//按回车清空 16 17 Invalidate();//窗口重会操作 18 19 } 20 else 21 { 22 m_strLine+=(char)nChar; 23 dc.TextOut(0,0,m_strLine); 24 } 25 26 CView::OnChar(nChar, nRepCnt, nFlags); 27 }
2.进行代码创建菜单的技巧
第一步:在资源选项中添加abc 添加子菜单,设置其ID名
第二步:在resource.h中添加 ID名和ID号
第三步:添加各自的命令窗口函数,并删除
第四步:oncommand映射中必须要放出来,因为已经删除,不能放在系统自定义区域
1 BEGIN_MESSAGE_MAP(CMenu3View, CView) 2 //{{AFX_MSG_MAP(CMenu3View) 3 ON_WM_CHAR() 4 ON_WM_CANCELMODE() 5 6 //}}AFX_MSG_MAP 7 // Standard printing commands 8 ON_COMMAND(IDM_PHONE1, OnPhone1) 9 ON_COMMAND(IDM_PHONE2, OnPhone2) 10 ON_COMMAND(IDM_PHONE3, OnPhone3) 11 ON_COMMAND(IDM_PHONE4, OnPhone4) 12 ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) 13 ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) 14 ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) 15 END_MESSAGE_MAP()
3.了解消息机制oncommand可以提前获知消息
1 BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam) 2 { 3 int MenuCmdId=LOWORD(wParam);//通过LOWORD获取低位 4 CMenu3View *pView=(CMenu3View *)GetActiveView();//这是View类在CMainFrame中的调用,通过创建一个具体的对象来实现,需要包含头文件 5 //GetActiveView()是调取CMainFrame相关的类 6 if(MenuCmdId>=IDM_PHONE1 && MenuCmdId<IDM_PHONE1+pView->m_strArray.GetSize()) 7 { 8 // MessageBox("Test"); 9 CClientDC dc(pView);//因为字符数组在view类,所以dc(pView) 10 dc.TextOut(0,0,pView->m_strArray.GetAt(MenuCmdId-IDM_PHONE1));//m_strArray是public 11 return TRUE;//返回TRUE就不再执行View操作 12 } 13 14 return CFrameWnd::OnCommand(wParam, lParam); 15 }
标签:
原文地址:http://www.cnblogs.com/Alimonky/p/5950596.html