UPDATE_COMMAND_UI机制对于动态的把 通过检查 或通过激活或失效 菜单命令和工具栏按钮 而发生变化的应用程序的状态 反馈给用户是非常重要的。不幸的是,ClassWizard并不支持直接为对话框加入UPDATE_COMMAND_UI句柄,然而通过努力还是能够利用UPDATE_COMMAND_UI机制来动态的更新对话框的。
第一步:手工为对话框类增加一个WM_KICKIDLE私有的MFC消息句柄,实现这些,遵循以下步骤:
1a、包含#include <afxpriv.h> ,该头文件里定义了这个消息
1b、在对话框类头文件里加入OnKickIdle()函数原型。
afx_msg void OnKickIdle();
1c、增加该消息的消息映射宏
ON_MESSAGE_VOID(WM_KICKIDLE , OnKickIdle)
1d、实现该函数
void CDemoDlg::OnKickIdle()
{
UpdateDialogControls(this,false);
}
第二步:为每一个需要检查的控件加入UPDATE_COMMAND_UI消息句柄,通过pCmdUI来完成其工作。
2a、在对话框类头文件里加入OnUpdateEmpty()函数原型。
afx_msg void OnUpdateEmpty(CCmdUI* pCmdUI);
2b、增加该消息的消息映射宏
ON_UPDATE_COMMAND_UI(IDC_EMPTY , OnUpdateEmpty)
2c、实现该函数
void CDemoDlg::OnUpdateEmpty(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_edtEdit.GetWindowTextLength()>0);
}
编码结束......
解释:
在空闲处理过程中,MFC把WM_IDLEUPDATECMDUI消息发送给主框架窗口和其直接子窗口----工具栏、状态栏、其视图----随后它们依次用CN_UPDATE_COMMAND_UI消息更新自身。然而,因为对话框不是主框架窗口的子窗口,所以对话框开始收不到WM_IDLEUPDATECMDUI消息。
为了给对话框一个实现它自己的空闲进程的机会,MFC定义了私有的WM_KICKIDLE消息,当对话框处于空闲进程时,这个消息自动发送给对话框-----只要队列中没有其它的消息在等待。
可以利用WM_KICKIDLE消息来调用UpdateDialogControls(),这个函数依次对 对话框上的控件发CN_UPDATE_COMMAND_UI消息。UpdateDialogControls()的函数原型:
void CWnd::UpdateDialogControls(CCmdTarget* pTarget , BOOL bDisableIfNoHandler );
pTarget 标示处理CN_UPDATE_COMMAND_UI消息的窗口,因为这些更新句柄经常是在与对话框自身相关联的C++类中实现的,因此,通常把this赋给该参数。
源文件地址: