65.9K
CodeProject 正在变化。 阅读更多。
Home

将 UI 更新通知接口应用于用户定义控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (10投票s)

2000年7月31日

3分钟阅读

viewsIcon

133591

downloadIcon

2500

一个 C++/MFC 示例,展示如何为用户自定义控件实现 UI 通知

Sample Image

引言

我经常遇到这样的情况:我想将 UI 更新通知应用于用户自定义控件,就像 MFC 为菜单项、工具栏按钮和状态栏控件提供的那样。在这种情况下,使用自定义的消息处理程序来正确响应 UPDATE_COMMAND_UI 通知。不幸的是,默认情况下,MFC 不支持用户自定义控件(例如,按钮)的这种机制。但是,仍然有办法来管理它。请按照下面的分步过程来了解该怎么做。您可能需要研究示例的源代码中的完整上下文。

请注意:您需要以两种方式准备源代码,才能正确地将更新 UI 通知应用于用户自定义控件。这取决于控件所在的窗口类的类型;一种是派生自 CDialog 的对话框类,另一种是派生自 CFormView 的视图。示例代码通过使用对话框窗口来演示它。但是,这两种方式之间没有太大区别。准备 CFormView 实例的描述 在此。但首先,让我们看看实现细节。

使用 CDialog 实例执行的实现细节

  1. 在对话框类实现的源文件 (.cpp) 中,包含声明私有 Windows 消息和宏的 MFC 头文件。

    #include <afxpriv.h>
  2. 在定义对话框窗口类的相应头文件中,声明 WM_KICKIDLE 消息处理程序和更新 UI 处理程序的原型。如果您的对话框实例空闲,系统始终会发送 WM_KICKIDLE 消息。这是执行一些框架工作的好时机。

    //{{AFX_MSG(CCmdUIDemoDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    [...]
    //}}AFX_MSG
    afx_msg void OnKickIdle();
    afx_msg void OnUpdateUserButton(CCmdUI* pCmdUI);
    DECLARE_MESSAGE_MAP()
  3. 更新 .cpp 文件中的消息映射,以映射 WM_KICKIDLE 消息和所需资源(在本例中为按钮)的更新通知消息。

    BEGIN_MESSAGE_MAP(CCmdUIDemoDlg, CDialog)
    	//{{AFX_MSG_MAP(CCmdUIDemoDlg)
    	ON_WM_PAINT()
    	[...]
    	//}}AFX_MSG_MAP
    	ON_MESSAGE_VOID(WM_KICKIDLE, OnKickIdle)
    	ON_UPDATE_COMMAND_UI(IDC_BUTTON1, OnUpdateUserButton)
    END_MESSAGE_MAP()
  4. 最后,实现两个消息处理程序的主体

    void CCmdUIDemoDlg::OnKickIdle()
    {
    	UpdateDialogControls(this, FALSE);
    }
    
    void CCmdUIDemoDlg::OnUpdateUserButton(CCmdUI *pCmdUI)
    {
    	pCmdUI->Enable(m_bToggle);
    }
  5. 完成!通过 pCmdUI 指针,您现在可以访问与对象关联的 CCmdUI 实例的方法,例如,Enable() 方法的参数 (BOOL) 的值决定控件是启用还是禁用,这与菜单项或工具栏按钮一样。

使用 CFormView 实例执行的实现细节(不属于演示代码)

要为 CFormView 实例(而不是 CDialog 实例)使用更新通知机制,请类比执行以下步骤

  1. 在对话框类实现的源文件 (.cpp) 中,包含声明私有 Windows 消息和宏的 MFC 头文件。

    #include <afxpriv.h>
  2. 在定义视图类的相应头文件中,声明 WM_IDLEUPDATECMDUI 消息处理程序和更新 UI 处理程序的原型。如果您的视图实例空闲,系统始终会发送 WM_IDLEUPDATECMDUI 消息。

    //{{AFX_MSG(CMyFormView)
    [...]
    //}}AFX_MSG
    afx_msg void OnIdleUpdateCmdUI();
    afx_msg void OnUpdateUserControl(CCmdUI* pCmdUI);
    DECLARE_MESSAGE_MAP()
  3. 更新 .cpp 文件中的消息映射,以映射 WM_IDLEUPDATECMDUI 消息和所需资源的更新通知消息。

    BEGIN_MESSAGE_MAP(CMyFormView, CFormView)
    	//{{AFX_MSG_MAP(CMyFormView)
    	[...]
    	//}}AFX_MSG_MAP
    	ON_MESSAGE_VOID(WM_IDLEUPDATECMDUI, OnIdleUpdateCmdUI)
    	ON_UPDATE_COMMAND_UI(IDC_MY_CONTROL, OnUpdateUserControl)
    END_MESSAGE_MAP()
  4. 最后,实现两个消息处理程序的主体

    void CMyFormView::OnIdleUpdateCmdUI()
    {
    	UpdateDialogControls(this, FALSE);
    }
    
    void CMyFormView::OnUpdateUserControl(CCmdUI *pCmdUI)
    {
    	pCmdUI->Enable(...);
    }
  5. 完成!

历史

  • 2000 年 7 月 31 日:初始版本

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.