MFC 的"更新命令 UI"系统如何工作?
How does MFC's "Update Command UI" system work?
我想更多地了解这个系统是如何工作的,特别是框架何时以及如何实际决定更新UI元素。
我的应用程序有一个"工具"系统,其中单个工具一次可以处于活动状态。我使用"ON_UPDATE_COMMAND_UI"消息在UI中"检查"工具的图标/按钮,这影响了应用程序菜单和工具栏。无论如何,这一切都运行良好,直到最近几天的某个时候,工具栏图标停止正确突出显示。
我调查了一下,发现只有在实际单击图标时才收到更新命令。奇怪的是,这只影响工具栏,而不影响菜单,菜单仍然可以正常工作。即使菜单中的按钮已更新,工具栏图标也保持不变。
显然我已经做了一些事情来打破它 - 有什么想法吗?
编辑:没关系。我覆盖了应用程序的OnIdle()
方法,并且没有调用原始基类方法 - 即CWinApp::OnIdle()
- 我想这是大多数时候调用更新的地方。https://msdn.microsoft.com/en-us/library/3e077sxt.aspx 的以下代码片段说明了:
BOOL CMyApp::OnIdle(LONG lCount)
{
// CWinApp's original method is involved in the update message handling!
// Removing this call will break things
BOOL bMore = CWinApp::OnIdle(lCount);
if (lCount == 0)
{
TRACE(_T("App idle for short period of timen"));
bMore = TRUE;
}
// ... do work
return bMore;
// return TRUE as long as there are any more idle tasks
}
这是一篇很好的文章,解释了如何做到这一点。不过,不要将他的代码示例与WM_KICKIDLE一起使用,而是向下滚动到注释部分。有两个代码示例解释了如何做得更好。我引用:
//Override WM_INITMENUPOPUP
void CDialog::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
// TODO: Add your message handler code here
if(pPopupMenu &&
!bSysMenu)
{
CCmdUI CmdUI;
CmdUI.m_nIndexMax = pPopupMenu->GetMenuItemCount();
for(UINT i = 0; i < CmdUI.m_nIndexMax; i++)
{
CmdUI.m_nIndex = i;
CmdUI.m_nID = pPopupMenu->GetMenuItemID(i);
CmdUI.m_pMenu = pPopupMenu;
// There are two options:
// Option 1. All handlers are in dialog
CmdUI.DoUpdate(this, FALSE);
// Option 2. There are handlers in dialog and controls
/*
CmdUI.DoUpdate( this, FALSE );
// If dialog handler doesn't change state route update
// request to child controls. The last DoUpdate will
// disable menu item with no handler
if( FALSE == CmdUI.m_bEnableChanged )
CmdUI.DoUpdate( m_pControl_1, FALSE );
...
if( FALSE == CmdUI.m_bEnableChanged )
CmdUI.DoUpdate( m_pControl_Last, TRUE );
*/
}
}
}
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个