博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MFC之菜单
阅读量:6425 次
发布时间:2019-06-23

本文共 2440 字,大约阅读时间需要 8 分钟。

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);
}

你可能感兴趣的文章
HTML5标准学习 - 编码
查看>>
JS 时间戳转星期几 AND js时间戳判断时间几天前
查看>>
UVa11426 最大公约数之和(正版)
查看>>
mime
查看>>
SQL练习之求解填字游戏
查看>>
DOM
查看>>
UIApplication
查看>>
12:Web及MySQL服务异常监测案例
查看>>
数据库性能优化之冗余字段的作用
查看>>
DBA_实践指南系列9_Oracle Erp R12应用补丁AutoPatch/AutoControl/AutoConfig(案例)
查看>>
数据库设计三大范式
查看>>
ionic 字体的导入方法
查看>>
IP路由原理
查看>>
内部类详解
查看>>
洛谷P2726 阶乘 Factorials 数学
查看>>
类加载机制
查看>>
火柴棒等式(2008年NOIP全国联赛提高组)
查看>>
mongodb int型id 自增
查看>>
【转】关于大型网站技术演进的思考(十八)--网站静态化处理—反向代理(10)...
查看>>
Java中的4种代码块
查看>>