如何在对话框中使用UPDATE_COMMAND_UI机制?

来源:互联网 发布:zbrush 4r8 for mac 编辑:程序博客网 时间:2024/05/29 06:58

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赋给该参数。

 

源文件地址:

http://blog.csdn.net/yjkwf/archive/2010/03/05/5349574.aspx

原创粉丝点击