原文出处:http://support.microsoft.com/kb/242577/zh-cn
如果菜单附加到 VisualC++ 中一个对话框则不能从其命令用户界面处理更改菜单项的状态,
使用以下步骤来解决此问题:
1. ON_WM_INITMENUPOPUP 条目添加到消息映射:
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//}}AFX_MSG_MAP
ON_WM_INITMENUPOPUP()
END_MESSAGE_MAP()
2. 将 OnInitMenuPopup 成员函数添加到对话框类并复制以下代码 (注意, 此代码取自 WinFrm.cpp 中 CFrameWnd::OnInitMenuPopup 主要):
CTestDlg::OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu)
{
ASSERT(pPopupMenu != NULL);
// Check the enabled state of various menu items.
CCmdUI state;
state.m_pMenu = pPopupMenu;
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 == pPopupMenu->m_hMenu)
state.m_pParentMenu = pPopupMenu; // Parent == child for tracking popup.
else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL)
{
CWnd* pParent = this;
// 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) == pPopupMenu->m_hMenu)
{
// When popup is found, m_pParentMenu is containing menu.
state.m_pParentMenu = CMenu::FromHandle(hParentMenu);
break;
}
}
}
}
state.m_nIndexMax = pPopupMenu->GetMenuItemCount();
for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
state.m_nIndex++)
{
state.m_nID = pPopupMenu->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 = pPopupMenu->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, TRUE); // 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, FALSE);
}
// Adjust for menu deletions and additions.
UINT nCount = pPopupMenu->GetMenuItemCount();
if (nCount < state.m_nIndexMax)
{
state.m_nIndex -= (state.m_nIndexMax - nCount);
while (state.m_nIndex < nCount &&
pPopupMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)
{
state.m_nIndex++;
}
}
state.m_nIndexMax = nCount;
}
}
分享到:
相关推荐
在MFC对话框程序中添加工具栏以及工具栏上的Button,并使其能够响应UPDATE_COMMAND_UI消息,需要遵循一系列步骤。首先,我们需要理解UPDATE_COMMAND_UI消息的作用,它是MFC框架用来更新UI元素状态的一种机制,比如...
以下是对`UPDATE_COMMAND_UI`的详细解释以及如何在对话框中使用它的源代码说明。 1. UPDATE_COMMAND_UI 消息:这是MFC框架内部定义的一个消息,用于处理控件的启用状态和可见性。当你在程序中注册了命令ID,MFC会...
在C++ MFC(Microsoft Foundation Classes)框架下开发应用程序时,常常需要在对话框中添加功能丰富的用户界面元素,如菜单栏。MFC提供了一种简单的方法来实现这一功能,使得对话框不仅可以显示数据,还能执行各种...
`OnUpdate`函数通常在响应`UPDATE_COMMAND_UI`消息时被调用。 对话框(Dialog Box)是Windows应用程序中的一个重要组件,它提供了一个独立于主窗口的临时界面,用户可以在其中进行交互。在MFC中,我们通常使用`...
本例在实现了在MFC对话框中使用工具栏(工具...并能较好响应ON_UPDATE_COMMAND_UI消息.同时能在响应函数中用SetCheck和Enable有效.里面也有能同时改变菜单ID相关联的工具栏按钮状态的能力,只是方法和在CMainFrame中不同.
在MFC中,这通常是通过重写`ON_COMMAND()`或`ON_UPDATE_COMMAND_UI()`宏来完成的。例如,对于ID_FILE_OPEN,可以在消息映射中添加以下代码: ```cpp ON_COMMAND(ID_FILE_OPEN, OnFileOpen) ON_UPDATE_COMMAND_UI...
3. **处理菜单事件**:在消息映射中添加对菜单项的响应,例如ON_COMMAND或ON_UPDATE_COMMAND_UI。当用户点击菜单项时,相应的函数会被调用执行相应的操作。 通过这些步骤,你就可以在MFC的对话框应用中实现背景图片...
在对话框应用中,我们通常不会在对话框资源本身中定义菜单,而是通过代码动态加载和显示菜单。 步骤1:创建MFC对话框项目 在VC++中,创建一个新的MFC对话框应用程序,这将自动生成一个包含主对话框资源的工程。 ...
通过ON_WM_COMMAND()和ON_UPDATE_COMMAND_UI()宏可以处理菜单和工具栏的更新及选择事件。 2. 命令ID:每个菜单项和工具栏按钮都有一个唯一的命令ID,用于在消息映射中识别它们。 3. ON_BN_CLICKED:对于工具栏按钮...
此外,为了提供更好的用户体验,我们还可以添加撤销/重做功能,这通常涉及到维护一个操作历史列表,以及实现`ON_UPDATE_COMMAND_UI`消息处理,以便根据当前是否可执行操作来更新菜单项的状态。 总的来说,MFC菜单...
在MFC中,通常通过重载ON_COMMAND或ON_UPDATE_COMMAND宏来处理工具栏按钮的消息。例如: ```cpp ON_COMMAND(IDC_BUTTON1, OnButton1) ON_UPDATE_COMMAND_UI(IDC_BUTTON1, OnUpdateButton1) ``` 然后,定义处理函数...
在MFC中,我们可以使用ON_COMMAND或ON_UPDATE_COMMAND_UI宏来关联菜单项或按钮的事件处理函数。当用户点击特定菜单项时,对应的事件处理函数会被调用,从而实现界面的切换。例如,可以创建新的CFormView实例,并将其...
而ON_UPDATE_COMMAND_UI宏则用于在界面更新时调用处理函数,如: ```cpp ON_UPDATE_COMMAND_UI(IDC_OPEN_FILE, OnUpdateOpenFile) ON_UPDATE_COMMAND_UI(IDC_SAVE_FILE, OnUpdateSaveFile) ON_UPDATE_COMMAND_UI...
MFC 的处理方法是通过消息映射表中的 ON_UPDATE_COMMAND_UI 宏,可以给单个菜单项分配选中的成员函数作为更新处理程序。 对话框 在 MFC 中,对话框是通过 CDialog 类来实现的。CDialog 类提供了许多有用的函数,...
`ON_UPDATE_COMMAND_UI`宏用于在需要更新用户界面时调用相应的成员函数,比如检查菜单项是否应该被禁用。 综上所述,"MFC-MESSAGE.rar_Mfc message"这份文档可能包含了如何在MFC中定义和处理消息、消息映射的原理、...
6. **命令处理机制** - MFC的ON_COMMAND和ON_UPDATE_COMMAND_UI宏定义了命令ID与函数之间的映射,使得命令处理更加灵活。 **使用多窗口框架的优势** 1. **代码复用** - MFC提供了大量的预定义类和模板,减少了重复...
在Microsoft Foundation Classes (MFC)库中,控件是用户界面的基本构建块,它们提供了与用户的交互方式。MFC控件资源综合例子旨在为...通过实践和学习这个示例,开发者可以提升自己在MFC环境下的UI设计和事件处理能力。
处理工具栏按钮的点击事件,我们需要定义消息映射并重写相应的成员函数,如`OnToolHitTest`和`ON_UPDATE_COMMAND_UI`。 3. **调用非模态对话框**:非模态对话框允许用户在对话框打开的同时继续与主窗口交互。MFC...
在源代码中,你可能会发现`ON_COMMAND`和`ON_UPDATE_COMMAND_UI`宏的使用,它们是MFC中处理菜单和工具栏命令的关键。`ON_COMMAND`用于响应用户的菜单选择或按钮点击,而`ON_UPDATE_COMMAND_UI`则在用户界面更新时...