mfc中的ON_UPDATE_COMMAND_UI机制

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值