UPDATE_COMMAND_UI消息:用来维护菜单项的各项状态,包括激活、禁用、变灰、选中、未选中等。在下拉菜单每次打开的时候,所有菜单项的此消息都会被发送出去。如果所属类中为菜单项的该消息添加了处理函数,则执行相应函数更新菜单状态,如果菜单项没有此消息处理函数,也没有COMMAND消息的处理函数,那么它就会变灰。
但是查看msdn文档发现,这个消息还可以使用与一下控件。
比如在状态栏实现计时功能:
方法一(直接更新statusbarpane的文字):
void CMainFrame::OnTimer(UINT_PTR nIDEvent)
{
CString strTime;
CTime curTime = CTime::GetCurrentTime();
strTime = curTime.Format(_T("%H:%M:%S"));
m_wndStatusBar.SetPaneText(4, strTime);
CFrameWndEx::OnTimer(nIDEvent);
}
方法二(使用Update_Command_UI机制):
先声明消息映射
ON_UPDATE_COMMAND_UI(ID_INDICATOR_TIME, &CMainFrame::OnUpdateButtonsState)
接着申明和定义消息处理函数
afx_msg void OnUpdateButtonsState(CCmdUI* pCmdUI);
void CMainFrame::OnUpdateButtonsState(CCmdUI* pCmdUI)
{
CString strTime;
CTime curTime = CTime::GetCurrentTime();
strTime = curTime.Format(_T("%H:%M:%S"));
pCmdUI->SetText(strTime);
}
再者就是最关键的一步,需要在On_Time处理函数中触发消息:
void CMainFrame::OnTimer(UINT_PTR nIDEvent)
{
// 使用消息机制完成statusbar的更新
m_wndStatusBar.SendMessage(ID_INDICATOR_TIME);
CFrameWndEx::OnTimer(nIDEvent);
}
之后就可以看到我们的程序能正常运行,
在这边我的理解是mfc框架在我们点击菜单或者tool控件时,会帮我们向所有的支持的控件发送消息,以上第二种方式,就是我们自己接管了框架做的事情,自己主动发送消息。
接着验证在改变menu command触发时status bar里的控件会不会收到消息。
参考鸡啄米老师的教程创建菜单command和update_command_ui事件
之后将上面的上面的步骤执行完毕,并将定时事件取消掉,之后将OnUpdateButtonsState修改为:
void CMainFrame::OnUpdateButtonsState(CCmdUI* pCmdUI)
{
// 看看菜单栏的状态点击会不会修改相关的状态栏的状态
// 是可以修改的,所有的状态消息都会受到消息
pCmdUI->Enable(m_bDraw);
}
以上,
有不懂的可以联系我,我把我联系的代码给你,我邮箱:fazai134769@outlook.com