消息分三类:
1)标准消息(WM_开头的,除WM_COMMAND,CWND派生的类都可以接收到标准消息);
2)命令消息(来自菜单、工具栏、加速键的消息,都以WM_COMMAND呈现,在MFC中以ID号来标识不同的的命令消息。在SDK中通过消息的wParam参数识别,从CCmdTarget派生的类可以接收到此类消息)
3)通告消息(由控件产生的消息,例如按钮的单击,列表框的选择等均产生此类消息,为的是向父窗口(通常是对话框)通知事件的发生。这类消息也是WM_COMMAND形式呈现。从CCmdTarget派生的类可以接收到此类消息)
代码段:
在mainfrm 中对已有的主框架菜单做一些处理:
GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION | MF_CHECKED); //获取主菜单,并在主菜单的第一个子菜单的第一项修改选中状态
GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND | MF_CHECKED); //同上,只是一个是ID,一个是数字位置,功能相同
GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE); //设置默认菜单,也是可以从ID与数字位置两项中选择,然后第二个参数默认是false,此时只能用ID
GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN);
GetMenu()->GetSubMenu(0)->SetDefaultItem(5,TRUE);
//确认一下菜单项的长度与宽度,好确认菜单项前的图标大小
CString str;
str.Format("x=%d,y=%d",GetSystemMetrics(SM_CXMENUCHECK),
GetSystemMetrics(SM_CYMENUCHECK));
MessageBox(str);
//加载图片,并把图片加载到某一菜单项前
m_bitmap.LoadBitmapA(IDB_BITMAP1);
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap,&m_bitmap);
//使菜单不可用置灰
GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION | MF_DISABLED |MF_GRAYED);
//使菜单先置空,然后再加载一个已有菜单,并把它附加到菜单对象中,最后分离菜单
SetMenu(NULL);
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
SetMenu(&menu);
menu.Detach();
在mainfrm.cpp的oncreate中添加如下代码:
//创建下拉菜单,并把此菜单添加到主菜单中,添加一般是在主菜单的最后添加;插入要指定位置
CMenu menu;
menu.CreatePopupMenu();
GetMenu()->AppendMenuW(MF_POPUP,(UINT)menu.m_hMenu,(LPCTSTR)_T("winsun"));
GetMenu()->InsertMenuW(2,MF_BYPOSITION | MF_POPUP,(UINT)menu.m_hMenu,(LPCTSTR)"winsun");
//添加下拉菜单各项菜单名称
menu.AppendMenuW(MF_STRING,IDM_HELLO,(LPCTSTR)_T("hello"));
menu.AppendMenuW(MF_STRING,112,(LPCTSTR)_T("RLJ"));
menu.AppendMenuW(MF_STRING,113,(LPCTSTR)_T("exit"));
//也可以在已有菜单的下位菜单中添加、插入或者删除菜单项
GetMenu()->GetSubMenu(0)->AppendMenuW(MF_STRING,114,(LPCTSTR)"welcome");
GetMenu()->GetSubMenu(0)->InsertMenuItemW(ID_FILE_OPEN,22222,FALSE);
GetMenu()->DeleteMenu(1,MF_BYPOSITION);
GetMenu()->GetSubMenu(0)->DeleteMenu(1,MF_BYPOSITION);
menu.Detach(); //因为定义的Cmenu句柄变量出了作用域,它所关联的hmenu资源会被销毁,所以需要分离
在视图中创建动态的菜单,手动输入菜单的名称与ID,并在点击时显示
void CMENU2View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
if(0x0d==nChar)
{
if(1==++m_nIndex)
{
m_menu.CreatePopupMenu();
GetParent()->GetMenu()->AppendMenuW(MF_POPUP,(UINT)m_menu.m_hMenu,LPCTSTR(_T("PHONEBOOK")));
GetParent()->DrawMenuBar();
}
m_menu.AppendMenuW(MF_STRING,IDM_PHONE1+m_nIndex-1,m_StrLine.Left(m_StrLine.Find(' ')));
m_strArray.Add(m_StrLine);
m_StrLine.Empty();
Invalidate();
}
else
{
m_StrLine+=TCHAR(nChar);
dc.TextOutW(0,0,m_StrLine);
}
CView::OnChar(nChar, nRepCnt, nFlags);
}
//在视图中点击各菜单项时反应与显示输出
void CMENU2View::OnPhone1()
{
// TODO: 在此添加命令处理程序代码
CClientDC dc(this);
dc.TextOutW(0,0,m_strArray.GetAt(0));
}
void CMENU2View::OnPhone2()
{
// TODO: 在此添加命令处理程序代码
CClientDC dc(this);
dc.TextOutW(0,0,m_strArray.GetAt(1));
}
void CMENU2View::OnPhone3()
{
// TODO: 在此添加命令处理程序代码
CClientDC dc(this);
dc.TextOutW(0,0,m_strArray.GetAt(2));
}
void CMENU2View::OnPhone4()
{
// TODO: 在此添加命令处理程序代码
CClientDC dc(this);
dc.TextOutW(0,0,m_strArray.GetAt(3));
}