VC动态添加菜单类(测试通过)

这个博客介绍了如何在VC++中动态创建、修改和管理菜单。`CDynamicMenu`类提供了添加菜单项、子菜单,设置菜单项启用状态以及删除菜单等功能。示例代码展示了如何添加新的菜单项,修改现有菜单项的文本,以及如何添加子菜单。
摘要由CSDN通过智能技术生成

///.H//

// DynamicMenu.h: interface for the CDynamicMenu class.
//
//

#if !defined(AFX_DYNAMICMENU_H__69C5595A_B3B2_4C21_B34C_156FCE65304F__INCLUDED_)
#define AFX_DYNAMICMENU_H__69C5595A_B3B2_4C21_B34C_156FCE65304F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CDynamicMenu 
{
public:
 CDynamicMenu();
 virtual ~CDynamicMenu();
protected:
 void appendMenuItem(int m_iItemID, CString m_strItemText);
 void appenMenu(int m_nMenuPosition, CString m_strMenuText);
 void setEnable(CString m_strMenu, int m_iItemID, int m_enable);
 void deleteMenu();
 void addMenu(CString m_strMenu, int m_iPosition, int m_iMenuID);
 void addMenu(CString m_strMenu,CString m_strAddMenu, int m_iMenuID);
 void addMenuItem(CString m_strMenu, int m_iPosition, int m_iMenuID);
 void addMenuItem(CString m_strMenu, CString m_strMenuItem, int m_iMenuItemID);
 void addMenuItem(CString m_strMenu, CString m_strMenuItem, CString m_strMenuPosition, int m_iMenuItemID);
 void modifyMenuItem(CString m_strMneu, int m_iMenuItemID);
 void modifyMenuItem(CString m_strMenu, CString m_strMenuItem, CString m_strModiyText);
 void createMenuItemChild();
 void deleteMenuItemChild();
private:
 void setMenu();
 void createMenu();
 void createMenuItem();
 void drawMenuBar();
 CMenu* getMenuItem(int m_iPosition);
 int  FindMenuItem(CMenu* Menu, LPCTSTR MenuString);
 int getMenuItemCount(CMenu* Menu);
 CMenu* getMenu();
private:
 CMenu* m_bMenu;
 CMenu* m_bMenuItem;
 CMenu* m_bMenuItemChild;
 int i;
};
#endif // !defined(AFX_DYNAMICMENU_H__69C5595A_B3B2_4C21_B34C_156FCE65304F__INCLUDED_)
/,CPP/

// DynamicMenu.cpp: implementation of the CDynamicMenu class.
//
//

#include "stdafx.h"
#include "YXRM.h"
#include "DynamicMenu.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//
// Construction/Destruction
//

CDynamicMenu::CDynamicMenu()
{
 m_bMenu = new CMenu;
 m_bMenuItem = new CMenu;
}

CDynamicMenu::~CDynamicMenu()
{
 if( m_bMenu != NULL)
  m_bMenu = NULL;
 if( m_bMenuItem != NULL)
  m_bMenuItem = NULL;
 delete m_bMenu;
 delete m_bMenuItem;

}

/
//add new menu item child
void CDynamicMenu::createMenuItemChild()
{
 m_bMenuItemChild = new CMenu;
 m_bMenuItemChild->CreatePopupMenu();
}
//delete menu item child
void CDynamicMenu::deleteMenuItemChild()
{
 if(m_bMenuItemChild != NULL)
  m_bMenuItemChild = NULL;
 delete m_bMenuItemChild;
}
/
void CDynamicMenu::appendMenuItem(int m_iItemID, CString m_strItemText)
{
 m_bMenuItemChild->AppendMenu(MF_STRING, m_iItemID, m_strItemText);
}
//add new menu
void CDynamicMenu::appenMenu(int m_nMenuPosition, CString m_strMenuText)
{
 m_bMenu->InsertMenu(m_nMenuPosition, MF_BYPOSITION | MF_POPUP,(UINT)m_bMenuItemChild->m_hMenu, m_strMenuText);
 deleteMenuItemChild();

}
/
//setting menu enable
void CDynamicMenu::setEnable(CString m_strMenu, int m_iItemID, int m_enable)
{
 int m_iPos;
 m_iPos = this->FindMenuItem(m_bMenu, m_strMenu);
 getMenuItem(m_iPos);
 m_bMenuItem->EnableMenuItem(m_iItemID,m_enable);
}

/
//delete menu
void CDynamicMenu::deleteMenu()
{
}
/
//add menu
void CDynamicMenu::addMenu(CString m_strMenu, int m_iPosition, int m_iMenuID)
{
 ASSERT_VALID(m_bMenu);
 ASSERT(m_strMenu);
 m_bMenu->InsertMenu(m_iPosition, MF_STRING | MF_ENABLED | MF_BYPOSITION, m_iMenuID, m_strMenu);
}
//add menu
void CDynamicMenu::addMenu(CString m_strMenu,CString m_strAddMenu, int m_iMenuID)
{
 int m_iPos;
 m_iPos = this->FindMenuItem(m_bMenu, m_strMenu);
 appenMenu(m_iPos + 1, m_strAddMenu);
 //addMenu(m_strAddMenu, m_iPos + 1, m_iMenuID);
}
//add menu item
void CDynamicMenu::addMenuItem(CString m_strMenu, int m_iPosition, int m_iMenuID)
{
 ASSERT_VALID(m_bMenuItem);
 ASSERT(m_strMenu);
 m_bMenuItem->InsertMenu(m_iPosition, MF_STRING | MF_ENABLED | MF_BYPOSITION, m_iMenuID, m_strMenu);
}

//add menu item
void CDynamicMenu::addMenuItem(CString m_strMenu, CString m_strMenuItem, int m_iMenuItemID)
{
 /*int m_iPos;
 getMenu();
 m_iPos = this->FindMenuItem(m_bMenu, m_strMenu);
 getMenuItem(m_iPos);
 addMenuItem(m_strMenuItem, getMenuItemCount(m_bMenuItem),m_iMenuItemID);*/
}

//add menu item
void CDynamicMenu::addMenuItem(CString m_strMenu, CString m_strMenuItem, CString m_strMenuPosition, int m_iMenuItemID)
{
 int m_iPos, m_iItemPos;
 getMenu();
 m_iPos = this->FindMenuItem(m_bMenu, m_strMenu);
 getMenuItem(m_iPos);
    m_iItemPos = this->FindMenuItem(m_bMenuItem, m_strMenuPosition);
 addMenuItem(m_strMenuItem, m_iItemPos + 1,m_iMenuItemID);
}
/
//modify menu item
void CDynamicMenu::modifyMenuItem(CString m_strMneu, int m_iMenuItemID)
{
 m_bMenu->ModifyMenu(m_iMenuItemID, MF_BYCOMMAND, m_iMenuItemID, m_strMneu);
}
//modify menu item
void CDynamicMenu::modifyMenuItem(CString m_strMenu, CString m_strMenuItem, CString m_strModiyText)
{
 int m_iPos;
 getMenu();
 m_iPos = this->FindMenuItem(m_bMenu, m_strMenu);
    getMenuItem(m_iPos);
 m_iPos = this->FindMenuItem(m_bMenuItem, m_strMenuItem);
 int id = m_bMenuItem->GetMenuItemID(m_iPos);
 this->modifyMenuItem(m_strModiyText, id);
}

/
/
CMenu* CDynamicMenu::getMenuItem(int m_iPosition)
{
 m_bMenuItem = m_bMenu->GetSubMenu(m_iPosition);
 ASSERT(m_bMenuItem);
 return m_bMenuItem;
}

int CDynamicMenu::FindMenuItem(CMenu* Menu, LPCTSTR MenuString)
{
   CString m_strMenu;
   ASSERT(Menu);
   ASSERT(::IsMenu(Menu->GetSafeHmenu()));

   int count = getMenuItemCount(Menu);
   for (int i = 0; i < count; i++)
   {
      if(Menu->GetMenuString(i, m_strMenu, MF_BYPOSITION) &&
   (strcmp(m_strMenu, MenuString) == 0))
         return i;
   }
   return -1;
}

int CDynamicMenu::getMenuItemCount(CMenu* Menu)
{
 if(Menu != NULL)
  return Menu->GetMenuItemCount();
 else
  return 0;
}

void CDynamicMenu::setMenu()
{
 ASSERT(m_bMenu);
 ASSERT(::IsMenu(m_bMenu->GetSafeHmenu()));
 AfxGetMainWnd()->SetMenu(m_bMenu);
}

CMenu* CDynamicMenu::getMenu()
{
 m_bMenu = AfxGetMainWnd()->GetMenu();
    ASSERT_VALID(m_bMenu);
 return m_bMenu;
}

void CDynamicMenu::drawMenuBar()
{
 AfxGetMainWnd()->DrawMenuBar();
}

void CDynamicMenu::createMenu()
{
 m_bMenu->CreateMenu();
 ASSERT_VALID(m_bMenu);
}

void CDynamicMenu::createMenuItem()
{
 VERIFY(m_bMenuItem->CreateMenu());
 ASSERT_VALID(m_bMenuItem);
}
/
///测试代码如下///

//
void CMenuMain::ModifySystem()
{
 this->modifyMenuItem("系统(&S)", "登录(&L)", "注销(&Z)");
 this->addMenuItem("系统(&S)", "用户管理(&U)","注销(&Z)",140002);
}

//
void CMenuMain::addEqupmentManagerMenuItem()
{
 this->createMenuItemChild();
 this->appendMenuItem(150001, "设备管理(&D)");
 this->appendMenuItem(150002,"用户编号管理(&U)");
 this->addMenu("系统(&S)", "设备管理(&M)", 150000);
}

void CMenuMain::addCopyDataMenuItem()
{
 this->createMenuItemChild();
 this->appendMenuItem(160001, "抄录电表(&R)");
 this->addMenu("设备管理(&M)", "抄录电表(&R)", 160000);
}

void CMenuMain::setEnableItem()
{
 this->setEnable("设备管理(&M)", 150001, 1);
}
//

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值