超级复杂的写法( 动态设置菜单项为灰色)

zrdongjiao zrdongjiao 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
动态设置菜单项为灰色


on_upate_command_ui 里难道不可以吗?

比如可以这样处理:

pCmdUI->Enable(FALSE); //就可以禁止菜单, 让其为灰色了。



网上的代码居然搞了那么复杂,看个例子:


OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu)
{
if (bSysMenu)
return; // don't support system menu

ASSERT(pMenu != NULL);

// check the enabled state of various menu items

CCmdUI state;
state.m_pMenu = pMenu;
ASSERT(state.m_pOther == NULL);
ASSERT(state.m_pParentMenu == NULL);

// determine if menu is popup in top-level menu and set m_pOther to
// it if so (m_pParentMenu == NULL indicates that it is secondary popup)
HMENU hParentMenu;
if (AfxGetThreadState()->m_hTrackingMenu == pMenu->m_hMenu)
state.m_pParentMenu = pMenu; // parent == child for tracking popup
else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL)
{
CWnd* pParent = GetTopLevelParent();
// child windows don't have menus -- need to go to the top!
if (pParent != NULL &&
(hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL)
{
int nIndexMax = ::GetMenuItemCount(hParentMenu);
for (int nIndex = 0; nIndex < nIndexMax; nIndex++)
{
if (::GetSubMenu(hParentMenu, nIndex) == pMenu->m_hMenu)
{
// when popup is found, m_pParentMenu is containing menu
state.m_pParentMenu = CMenu::FromHandle(hParentMenu);
break;
}
}
}
}

state.m_nIndexMax = pMenu->GetMenuItemCount();
for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
state.m_nIndex++)
{
state.m_nID = pMenu->GetMenuItemID(state.m_nIndex);
if (state.m_nID == 0)
continue; // menu separator or invalid cmd - ignore it

ASSERT(state.m_pOther == NULL);
ASSERT(state.m_pMenu != NULL);
if (state.m_nID == (UINT)-1)
{
// possibly a popup menu, route to first item of that popup
state.m_pSubMenu = pMenu->GetSubMenu(state.m_nIndex);
if (state.m_pSubMenu == NULL ||
(state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||
state.m_nID == (UINT)-1)
{
continue; // first item of popup can't be routed to
}
state.DoUpdate(this, FALSE); // popups are never auto disabled
}
else
{
// normal menu item
// Auto enable/disable if frame window has 'm_bAutoMenuEnable'
// set and command is _not_ a system command.
state.m_pSubMenu = NULL;
state.DoUpdate(this, state.m_nID < 0xF000);
}

// adjust for menu deletions and additions
UINT nCount = pMenu->GetMenuItemCount();
if (nCount < state.m_nIndexMax)
{
state.m_nIndex -= (state.m_nIndexMax - nCount);
while (state.m_nIndex < nCount &&
pMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)
{
state.m_nIndex++;
}
}
state.m_nIndexMax = nCount;
}
}


真是无语至极


...全文

相关推荐

当鼠标移出灰色区域时候,菜单项怎么隐藏起来

### 如何实现鼠标移出特定区域后菜单项自动隐藏的功能在网页开发中,经常会遇到需要根据用户的交互行为(如鼠标悬停、点击等)来动态改变页面元素显示状态的需求。

weixin_38664612

实现系统菜单项添加的多种编程技术

在操作系统中,菜单是用户与软件交互的重要界面元素。它们为用户提供一系列的命令选项,从而实现对程序的控制。菜单通常由多个菜单项组成,每个菜单项代表着一个可执行的操作或功能。在Windows操作系统中,菜单项(MenuItem)是用户交互的一个基本单元,它可以是命令、子菜单、分隔符等。每个菜单项都有一系列的属性来定义其行为和外观:标识符(ID):每个菜单项都需要一个唯一的标识符,用于程序中识别该菜单项并处理用户操作。标题(Caption):显示在菜单上的文本,可以包含快捷键的描述。

徐子贡

SwiftUI macOS 设计之Menu设计规范

菜单解剖 菜单显示用户可以从中选择的项目列表(命令,属性或状态)。菜单内的一项称为菜单项,可以被配置为启动动作,打开或关闭状态,或者在被选中或响应于相关的键盘快捷键时显示其他菜单项的子菜单。菜单还可以包含分隔符,菜单项可以包含图标和符号,例如复选标记。默认情况下,所有菜单都采用半透明。 当菜单显示在屏幕上时,它将保持打开状态,直到用户选择菜单项,导航到另一个菜单,在菜单外单击,切换到另一个应用程序或退出该应用程序为止;或直到系统显示警报为止。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直

知识大胖

C# WinForm MDI窗体菜单动态合并实现详解

为了便于后续查找与管理,每个动态生成的都应赋予唯一的Name属性。推荐采用“功能_窗体类型_行为”的命名规范,例如表示“文档编辑器中的保存操作”。var exportItem = new ToolStripMenuItem("导出PDF")Tag = activeChild // 关联来源窗体此命名方式具有以下优势:可读性强:开发者可通过名称快速识别菜单项来源;便于调试:在 Visual Studio 的 UI 检查器中易于定位;支持批量操作。

laforet

jQuery 浅灰色、绿色相间的三级动态导航条

在构建动态导航条时,jQuery的强大功能能够实现复杂的效果,而无需过多的代码。创建这个动态导航条,我们需要以下步骤:1.

weixin_38678510
评论 3
收藏 已收藏
分享
返回顶部
zrdongjiao
VC/MFC 16,550 成员 421,606 内容