C++动态添加菜单类(存在BUG)

MFC控件全解析:从标准控件到高级应用与实战技巧 在Windows桌面开发领域,GUI编程是构建用户界面的核心。其底层原理基于消息循环、窗口句柄和资源管理机制,这些概念构成了现代UI框架的基础。理解控件的创建、消息映射与数据交换机制,对于开发稳定高效的桌面应用具有重要技术价值,尤其在维护遗留系统、工业软件等场景中至关重要。本文聚焦MFC控件体系,涵盖标准控件如CButton、CEdit,以及高级公共控件如CListCtrl、CTreeCtrl的使用,并深入探讨了子化、多线程安全等实战技巧,帮助开发者应对实际开发中的常见问题与性能挑战。 阅读详情

////////////////////////////////////////////////////////////////.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(CString m_strMenuText);
 void setEnable(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);
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;
};
#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()
{
 m_bMenu->DestroyMenu();
 m_bMenuItem->DestroyMenu();
 if( m_bMenu != NULL)
  m_bMenu = NULL;
 if( m_bMenuItem != NULL)
  m_bMenuItem = NULL;
 delete m_bMenu;
 delete m_bMenuItem;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////
//add new menu item
void CDynamicMenu::appendMenuItem(int m_iItemID, CString m_strItemText)
{
 m_bMenuItem->AppendMenu(MF_STRING, m_iItemID, m_strItemText);
}
//add new menu
void CDynamicMenu::appenMenu(CString m_strMenuText)
{
 m_bMenu->AppendMenu(MF_POPUP,(UINT)m_bMenuItem->m_hMenu, m_strMenuText);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//setting menu enable
void CDynamicMenu::setEnable(int m_iItemID, int m_enable)
{
  m_bMenu->EnableMenuItem(m_iItemID,1);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////
//delete menu
void CDynamicMenu::deleteMenu()
{

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//add menu
void CDynamicMenu::addMenu(CString m_strMenu, int m_iPosition, int m_iMenuID)
{
 m_bMenu->InsertMenu(m_iPosition, MF_BYPOSITION, m_iMenuID, m_strMenu);
}
//add menu
void CDynamicMenu::addMenu(CString m_strMenu,CString m_strAddMenu, int m_iMenuID)
{
 int m_iPos;
 getMenu();
 m_iPos = this->FindMenuItem(m_bMenu, m_strMenu);
 addMenu(m_strAddMenu, m_iPos + 1, m_iMenuID);
 setMenu();
}
//add menu item
void CDynamicMenu::addMenuItem(CString m_strMenu, int m_iPosition, int m_iMenuID)
{
 m_bMenuItem->InsertMenu(m_iPosition, 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_bMenu->LoadMenu(m_bMenu->GetMenuItemID(m_iPosition));
 m_bMenuItem = m_bMenu->GetSubMenu(m_iPosition);//////////////////////////存在BUG????????????
 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()
{
 if(m_bMenu != NULL)
  m_bMenu = NULL;
 m_bMenu = AfxGetMainWnd()->GetMenu();
    ASSERT(m_bMenu);
 return m_bMenu;
}

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

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

}

void CDynamicMenu::createMenuItem()
{
 m_bMenuItem->CreateMenu();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////

25分钟DIY发光毛衣:免焊接编程的可穿戴技术入门实践 可穿戴技术将电子元件与日常服饰结合,通过柔性电路和集成控制器实现智能交互。其核心原理是利用低功耗LED、微型控制器和柔性基板,在保证穿戴舒适性的同时提供动态视觉效果。这项技术的价值在于极大降低了硬件开发门槛,使非专业用户也能快速实现创意。在应用场景上,它广泛用于个性化时尚、舞台表演、安全警示和互动艺术装置。本文以DIY发光毛衣为例,详细解析如何利用免焊接、免编程的预制套件,通过基础缝纫将柔性LED灯带集成到织物中,实现快速、安全的可穿戴光效制作,为时尚科技爱好者提供了一条零基础入门的实践路径。 阅读详情

相关推荐

d3d c++实现绘制辅助菜单界面-完整源码

1-界面通过d3d绘图实现,c++ d3d绘制方框、文字的函数封装见。注册热键的一般步骤 ,以HOME键为例。,该api注册完热键后,在窗口消息。中检测和处理热键的回调方法。2-控制通过注册热键实现。

陈子青的博客 2832

vc++源码C++动态创建Startmenu菜单.rar

vc++源码C++动态创建Startmenu菜单

MFC列表与树控件滚动条美化包:支持高DPI、可调样式、零第三方依赖

一套开箱即用的MFC滚动条定制方案,专为CListCtrl和CTreeCtrl控件设计,实现垂直/水平滚动条的完整重绘。核心是ScrollBarEx封装,通过消息拦截(如WM_NCCALCSIZE、WM_MOUSEWHEEL)接管原生滚动行为,结合GDI完成箭头按钮、滑块轨道、拖拽反馈等UI元素绘制。提供ScrollBarList.cpp和ScrollBarTree.cpp两个独立实现模块,分别适配列表和树形控件;ScrollBarDlg.cpp为演示入口,含完整对话框集成示例。配套头文件定义统一接口,支

jump7的博客 162

Maya2016 SDK Windows

Maya2016 SDK 开发包,Windows平台 环境搭建方法参考官方文档这里 http://help.autodesk.com/view/MAYAUL/2016/ENU/?guid=__files_Setting_up_your_build_env_Windows_env_32bit_and_64bit_htm

VC++.Net2003中自己添加菜单不可用(灰色)的原因

VC++.Net 2003 MFC MDI。自己在Mainframe中添加菜单,并在向导中添加了相应的消息处理函数,但菜单就是不可用,一直是灰色。经师兄指点,是消息处理函数放错的地方。在王华、朱时银、史兰等编著《VC++.NET 开发指南与实例详析》, 机械工业出版社中是添加在CMyProjectDoc中。而Mainframe菜单在有文档时是不出现的,只在Doc全部被关闭时才出现。这里Doc

germanzs的专栏 1134

AppendMenu函数添加菜单

这个函数添加新项目到指定菜单的末尾。你可以使用appendmenu指定内容,外观,和菜单项行为。 BOOL AppendMenu( HMENU hMenu, UINT uFlags, UINT uIDNewItem, LPCTSTR lpNewItem ); 参数 来 [in]处理菜单,下拉菜单,子菜单或快...

weixin_30919235的博客 1547

menubar控件 qt_2.21 MenuBar控件的使用 - Qt-UI.com | Qt可视化跨平台软件开发工具 软件界面开发 软件界面设计 UI开发 软件UI设计 软件UI开发 Python ...

MenuBar控件的使用功能功能属性介绍Background 背景样式ItemBg item背景演示ItemText item文字样式ItemSpace item之间的间隔PopupBg 弹出菜单背景样式PoupItemBg 弹出item背景样式ItemText 弹出item文字样式BingMenu 绑定菜单名绑定菜单是指通过菜单编辑工具编辑的菜单文件通过page的新建菜单按钮进行新建菜单文件将M...

weixin_32200729的博客 524

VC++动态加入和删除菜单的方法

<br />在应用程序中,往往要根据当前的操作来增加相应的菜单动态增加菜单的方法有多种,本文只讲述利用资源编辑器预创建菜单资源,然后在程序运行中动态加入(或删除)到主菜单中去的方法。<br /><br />  一、用AppWizard建立一个单文档工程,默认一切选项。在WorkSpace(工作空间)的ResourecView页中右击Menu资源,加入一个新的菜单,其ID为:IDR_MENU1。为IDR_MENU1加入一个菜单项和相应的子菜单。如(图一)所示。<br /><br />  二、编辑IDR_MA

scollins的专栏 905

c语言动态菜单代码,c语言入门之C++BUILDER动态建立菜单菜单事件

首先新建一个工程文件(File->New Application)。然后在Form1上面建立一个PopupMenu1,一个Button1,一个RichEdit1。在头文Unit1.H的内容,其中黑体是自已加的。#ifndef Unit1H#define Unit1H#include#include#include#include#include#include#includeclass TF...

weixin_39795845的博客 447

MFC_CImageList control

Using CImageList Visual Studio 2015 Other Versions   For the latest documentation on Visual Studio 2017, see Visual Studio 2017 Documentation. An image list, represe

Coder_LCB的博客 568

在工程中使用同个函数多次,最好将函数分开命名

在工程中使用同个函数多次,最好将函数分开命名 在工程中使用同个函数多次,最好将函数分开命名 本人在使用ctreectrl构建mfc树过程中,想要多次使用该函数生成不同的树,并对该树进行点选操作。一开始在头文件pubilc区域进行声明,生成树是没有问题的,但是在对树进行相关操作时就会产生无法识别的错误。在重新命名函数名称之后情况得到解决。key_feature8工程项目中的应用。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能

Avenger_6的博客 332

MFC对话框动态添加右键快捷菜单-多级菜单

MFC 基于对话框的程序,在对话框上右键显示快捷菜单菜单为多级菜单

D3D9Menu虚幻引擎完整菜单源码

d3d9菜单,辅助菜单,外怪菜单,游戏窗口绘制菜单

动态创建菜单

一个小demo,动态创建右键菜单,对话的系统菜单,右键中的二级菜单

c++ mfc 动态生成菜单

1.新建MFC对话框工程 2 添加菜单资源,并添加Test菜单,在Test菜单下面添加菜单-添加菜单 3 在Resource.h里面添加菜单宏定义 #define ID_CMD1 200 #define ID_CMD2 201 4 添加菜单消息函数声明 afx_msg void OnCmd1(); afx_msg void OnCmd2(); 5 添加菜单消息映射 ON_COMMAND(ID_CMD1, &CMenuDemoDlg::OnCmd1) ON_COMMAN...

dxm809的博客 624

MFC中的CMenu---如何动态添加菜单/菜单项、子菜单、右键菜单

如何动态添加菜单/菜单项、子菜单、右键菜单 有关菜单的操作主要用到CMenu,当然也可用相应API函数,CMenu只是MFC对API中操作菜单的函数的封装而已。 不过能用就尽量用的组织方式好呗,代码看着也舒服。 若是SDK编程,那就用API吧 。      CMenu menuMain,menu1; //首先 定义CMenu对象 一、 创建菜单,有两种方法 1. 用LoadMe

liqing19850102的专栏 4万+

添加menu的item的两种方法

方法一:直接在Activity中添加 使用menu.add(groupId, itemId, order, title)的方法添加menu的item,在实现事件时只需使用itemId的值作判断。 方法二:在res/menu/main.xml中添加item。 在xml中添加item方便管理。但要注意,在实现事件时item.getItemId是int型,R.id.xxx是string

u013503686的专栏 1612
上一篇: VC(ADO类)
下一篇: VC动态调用DLL
wei801004
博客等级 码龄22年 57粉丝 184原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值