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






4.50/5 (10投票s)
2000年7月31日
3分钟阅读

133591

2500
一个 C++/MFC 示例,展示如何为用户自定义控件实现 UI 通知
引言
我经常遇到这样的情况:我想将 UI 更新通知应用于用户自定义控件,就像 MFC 为菜单项、工具栏按钮和状态栏控件提供的那样。在这种情况下,使用自定义的消息处理程序来正确响应 UPDATE_COMMAND_UI
通知。不幸的是,默认情况下,MFC 不支持用户自定义控件(例如,按钮)的这种机制。但是,仍然有办法来管理它。请按照下面的分步过程来了解该怎么做。您可能需要研究示例的源代码中的完整上下文。
请注意:您需要以两种方式准备源代码,才能正确地将更新 UI 通知应用于用户自定义控件。这取决于控件所在的窗口类的类型;一种是派生自 CDialog
的对话框类,另一种是派生自 CFormView
的视图。示例代码通过使用对话框窗口来演示它。但是,这两种方式之间没有太大区别。准备 CFormView
实例的描述 在此。但首先,让我们看看实现细节。
使用 CDialog 实例执行的实现细节
-
在对话框类实现的源文件 (.cpp) 中,包含声明私有 Windows 消息和宏的 MFC 头文件。
#include <afxpriv.h>
-
在定义对话框窗口类的相应头文件中,声明
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()
-
更新 .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()
-
最后,实现两个消息处理程序的主体
void CCmdUIDemoDlg::OnKickIdle() { UpdateDialogControls(this, FALSE); } void CCmdUIDemoDlg::OnUpdateUserButton(CCmdUI *pCmdUI) { pCmdUI->Enable(m_bToggle); }
- 完成!通过
pCmdUI
指针,您现在可以访问与对象关联的CCmdUI
实例的方法,例如,Enable()
方法的参数 (BOOL) 的值决定控件是启用还是禁用,这与菜单项或工具栏按钮一样。
使用 CFormView 实例执行的实现细节(不属于演示代码)
要为 CFormView
实例(而不是 CDialog
实例)使用更新通知机制,请类比执行以下步骤
-
在对话框类实现的源文件 (.cpp) 中,包含声明私有 Windows 消息和宏的 MFC 头文件。
#include <afxpriv.h>
-
在定义视图类的相应头文件中,声明
WM_IDLEUPDATECMDUI
消息处理程序和更新 UI 处理程序的原型。如果您的视图实例空闲,系统始终会发送WM_IDLEUPDATECMDUI
消息。//{{AFX_MSG(CMyFormView) [...] //}}AFX_MSG afx_msg void OnIdleUpdateCmdUI(); afx_msg void OnUpdateUserControl(CCmdUI* pCmdUI); DECLARE_MESSAGE_MAP()
-
更新 .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()
-
最后,实现两个消息处理程序的主体
void CMyFormView::OnIdleUpdateCmdUI() { UpdateDialogControls(this, FALSE); } void CMyFormView::OnUpdateUserControl(CCmdUI *pCmdUI) { pCmdUI->Enable(...); }
- 完成!
历史
- 2000 年 7 月 31 日:初始版本
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。