一。消息分类
- 命令消息:WM_COMMOND 菜单处理函数
- 标准消息:view->属性->消息
- 通告消息:控件处理函数
二。菜单操作
在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中进行菜单操作
1 //标志 2 //获取菜单 3 //或者主菜单 4 CMenu* menu = GetMenu(); 5 //获取第一个子菜单 6 CMenu* fileMenu = menu->GetSubMenu(0); 7 //标记“新建”,第一个若下标,则MF_BYPOSITION 8 fileMenu->CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED); 9 //标记“打开”,第一个若ID,则MF_BYCOMMAND 10 fileMenu->CheckMenuItem(ID_FILE_OPEN, MF_BYCOMMAND | MF_CHECKED); 11 12 //设置默认项,加粗,一个菜单只有一个默认项 13 //FALSE:ID 14 //TRUE:位置 15 fileMenu->SetDefaultItem(ID_FILE_SAVE, FALSE); 16 //变灰 17 //需要CFrameWnd::m_bAutoMenuEnable = FALSE; 18 fileMenu->EnableMenuItem(5, MF_BYPOSITION | MF_DISABLED); 19 20 //移除菜单 21 SetMenu(NULL); 22 23 //加载菜单 24 CMenu menu2; 25 menu2.LoadMenuW(IDR_MENU1); 26 SetMenu(&menu2); 27 //分离 28 menu2.Detach();
点击B,更新A是否高亮显示
1.为A添加事件处理函数
//菜单更新是自动更新的,通过标志位 void CMainFrame::OnUpdateA(CCmdUI* pCmdUI) { // TODO: 在此添加命令更新用户界面处理程序代码 if (m_isUpdate == TRUE) { pCmdUI->Enable(TRUE); } else { pCmdUI->Enable(FALSE); } }
2.B添加事件处理函数
1 void CMainFrame::OnB() 2 { 3 // TODO: 在此添加命令处理程序代码 4 m_isUpdate = !m_isUpdate; //点击更新标志位 5 }
三。左键弹出菜单
1 void CMenuView::OnLButtonDown(UINT nFlags, CPoint point) 2 { 3 // TODO: 在此添加消息处理程序代码和/或调用默认值 4 5 //创建菜单项 6 CMenu menu; 7 menu.LoadMenuW(IDR_MENU1); 8 //获取第一个子菜单 9 CMenu* subMenu = menu.GetSubMenu(0); 10 11 //坐标转换 12 ClientToScreen(&point); 13 //子菜单作为快捷菜单,右击菜单 14 subMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, 15 point.x, point.y, this); 16 17 CView::OnLButtonDown(nFlags, point); 18 }
四。动态更新窗口图标
1.首先在资源中导入图标ico,在class CMainFrame : public CFrameWnd中添加图标数组
2.在OnCreate中创建定时器,并生成处理函数
1 void CMainFrame::OnTimer(UINT_PTR nIDEvent) 2 { 3 // TODO: 在此添加消息处理程序代码和/或调用默认值 4 static int i = 0; 5 //修改标题 6 SetClassLong(m_hWnd, GCL_HICON, (LONG)icon[i]); 7 i++; 8 if (i == 4) 9 i = 0; 10 CFrameWnd::OnTimer(nIDEvent); 11 }