MFC之菜单

来源:互联网 发布:linux定时器重启 编辑:程序博客网 时间:2024/05/17 00:17

1菜单与菜单项的操作

//获取菜单指针----CWnd::GetMenu()
//GetSubMenu()获取子菜单
/CheckMenuItem()添加/取消标记
GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MFS_CHECKED);
//创建缺省菜单SetDefaultItem()一个子菜单只能有一个
//GetMenu()->GetSubMenu(0)->SetDefaultItem(1,1);
GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN);
//图形菜单的创建SetMenuItemBitmaps()
m_Bitmap.LoadBitmapW(IDB_BITMAP1);
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_Bitmap,&m_Bitmap);
//使某项不能使用EnableMenuItem()
//NOTE: m_bAutoMenuEnable is set to FALSE in the constructor of 
GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION|MF_DISABLED|MF_GRAYED);
//将整个菜单取消SetMenu()可以加载自己的菜单,若将Cmenu为局部变量则在setmenu后调用detach()
//SetMenu(NULL);

2MFC菜单项的更新

(1)为菜单某一项添加ON_UPDATE_COMMAND_UI消息并添加处理程式(在CMainframe类中)

(2)在处理程式中决定某一菜单项是否可用是否标记等(若涉及到工具栏中的菜单项则为保持与菜单项中的同步最好采用ID标记而不是位置)

(3)实例:void CMainFrame::OnUpdateEditCut(CCmdUI *pCmdUI)

{
// TODO: 在此添加命令更新用户界面处理程序代码
pCmdUI->Enable();
}

3右击弹出菜单的使用

在VC++6.0中,在project -》addtoproject-》……之后进行选择就可以为工程添加一个单击右键弹出菜单功能,但是在VS中没有Pop-Up Menu组件,右键菜单需要手动添加。添加方法如下:
1、在资源视图中添加所需的右键菜单
2、选择相应的类,单文档时选中View类在属性中添加WM_CONTEXTMENU消息
3、在OnContextMenu添加如下代码

void CMenuView::OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/Point)
{
// TODO: 在此处添加消息处理程序代码
if(Point.x==-1&&Point.y==-1)
{
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
Point=rect.TopLeft();
Point.Offset(5,5);
}
CMenu menu;
menu.LoadMenuW(IDR_MENU1);
CMenu* pPopup=menu.GetSubMenu(0);
ASSERT(pPopup!=NULL);
CWnd* PwndPopupOwner=this;
while (PwndPopupOwner->GetStyle()&WS_CHILD)
{
PwndPopupOwner=PwndPopupOwner->GetParent();
}
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,Point.x,Point.y,PwndPopupOwner);

}

4动态添加菜单

在CMainframe::OnCreate()函数中

(1)CMenu::AppendMenu()将一个菜单项添加到现有菜单项末尾

(2)创建popup菜单CMmenu::CreatePopMenu();

(3)插入PopUpMenu菜单CMenu::InsertMenu()

(4)删除菜单CMenu::DeleteMenu()

(5)代码示例:


(6)对添加的菜单进行命令响应

手动添加消息响应函数和消息映射

(7)其他操作

void CMenuView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
static int indexm=313;
CClientDC dc(this);//获取客户区画布
if(0x0d==nChar)
{
if(0==index++)
{
m_Menu.CreatePopupMenu();
GetParent()->GetMenu()->AppendMenuW(MF_POPUP,(UINT)m_Menu.m_hMenu,_T("phonenote"));
//重绘菜单栏CWnd::DrawMenuBar()
GetParent()->DrawMenuBar();//重绘菜单
}
m_Menu.AppendMenuW(MF_STRING,indexm++,m_PStr.Left(m_PStr.Find(' ')));
m_PStr.Empty();
Invalidate();//重绘画布
}


else
{
m_PStr+=(char)nChar;
dc.TextOutW(0,0,m_PStr);


}


CView::OnChar(nChar, nRepCnt, nFlags);
}




0 0
原创粉丝点击