MFC-菜单的动态(增加 插入 删除 响应)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nvcgkk/article/details/53709729
  1. 增加菜单
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  CMenu menu;
  menu.CreateMenu();//新建菜单
  menu.AppendMenu(MF_STRING, 101, "刷新");//新建子菜单的菜单项1
  menu.AppendMenu(MF_STRING, 102, "复制");//新建子菜单的菜单项2
  menu.AppendMenu(MF_STRING, 103, "搜索");//新建子菜单的菜单项3
  GetMenu()->AppendMenu(MF_POPUP, (UINT)menu.m_hMenu, "TEST");//增加子菜单     
  menu.Detach();//将menu对象与菜单句柄脱开,析构menu对象不影响句柄的使用。

  /*如果不想使用menu.Detach(), 也可以将menu定义成CMainFrame的数据成员 */
}

2.菜单插入

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
//在index为2的子菜单前面插入新的子菜单,注意:子菜单序号从0开始
  CMenu menu;
  menu.CreateMenu();
  GetMenu()->InsertMenu(2,MF_POPUP| MF_BYPOSITION,(UINT)menu.m_hMenu, "TEST");
  menu.Detach();
}

3.菜单删除

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  GetMenu()->DeleteMenu(0, MF_BYPOSITION);//删除子菜单
  GetMenu()->GetSubMenu(2)->DeleteMenu(0, MF_BYPOSITION);//删除子菜单的菜单项
}

响应动态创建的菜单项4步骤
1.编辑Resource.h文件

//Resource.h
#define IDR_MYUPDATE 101
#define IDR_MYCOPY   102
#define IDR_MYSEARCH 103

将刚才动态创建的菜单项,改为对应宏

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  ......
  menu.AppendMenu(MF_STRING, IDR_MYUPDATE, "刷新");//新建子菜单的菜单项1
  menu.AppendMenu(MF_STRING, IDR_MYCOPY,   "复制");//新建子菜单的菜单项2
  menu.AppendMenu(MF_STRING, IDR_MYSEARCH, "搜索");//新建子菜单的菜单项3
  ......
} 

2.在响应这个菜单项的程序类的.h文件中,添加响应函数原型,

3.在响应这个菜单项的程序类的源文件中,添加消息映射表

//注意添加的位置
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    //{{AFX_MSG_MAP(CMainFrame)
    ON_WM_CREATE()
    //}}AFX_MSG_MAP
  ON_COMMAND(IDR_MYUPDATE, OnMyUpdate)
  ON_COMMAND(IDR_MYCOPY, OnMyCopy)
  ON_COMMAND(IDR_MYSEARCH, OnMySearch)
END_MESSAGE_MAP()

4.响应函数的实现

void CMainFrame::OnMyUpdate()
{
  MessageBox("OnMyUpdate");
}

void CMainFrame::OnMyCopy()
{
  MessageBox("OnMyCopy");
}

void CMainFrame::OnMySearch()
{
  MessageBox("OnMySearch");
}
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页