走出MFC子类化的迷宫子类化,SUBCLASSWINDOW ,MFC消息机制
MFC 子类化机制详解 MFC 子类化机制是 Windows 编程中的一种重要技术,允许开发者自定义控件的行为,以满足特定的需求。在这篇文章中,我们将深入探讨 MFC 子类化机制的原理和实现方式,并提供一个实际的示例来演示如何使用子类化机制来实现一个只能输入 A、B、C 的 EDIT 控件。 什么是 Windows 子类化? -------------------- 在 Windows 编程中,子类化是指将一个控件的行为修改为满足特定的需求。在实际开发中,我们可能需要对标准控件进行修改,以满足特定的需求。例如,在我们的应用中,我们可能需要一个 EDIT 控件只能输入 A、B、C,这时,我们可以使用子类化机制来实现这个需求。 Windows 子类化机制的原理 --------------------- 在 Windows 中,每个窗口都有一个窗口处理函数负责对消息处理。子类化的办法就是用我们自己的消息处理函数来替代窗口原有的、标准的处理函数。我们的窗口处理函数只是关心那些特定的消息,而其它消息,再发给原来的窗口函数处理。 MFC 中的子类化机制 ------------------ 在 MFC 中,子类化机制被包装起来了,原来的窗口类注册、窗口函数都不见了。为了使用子类化机制,我们需要派生一个自己的类,并在其中处理特定的消息。 示例:实现一个只能输入 A、B、C 的 EDIT 控件 --------------------------------------------- 在这个示例中,我们将实现一个只能输入 A、B、C 的 EDIT 控件。我们需要派生一个自己的类 CsuperEdit,然后在其中处理 WM_CHAR 消息。 实现代码: ```cpp void CSuperEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default TCHAR ch[20]; GetWindowText(ch,20); if (strlen(ch) == 1 && (nChar <= 'C' && nChar >= 'A')) return; if (nChar != 'A' && nChar != 'B' && nChar != 'C') return; CEdit::OnChar(nChar, nRepCnt, nFlags); } ``` 然后,我们需要在CProg1Dlg 类中加入一个数据成员 CsuperEdit m_edit,并在 OnInitDialog() 中加入: ```cpp m_edit.SubclassDlgItem(IDC_EDIT1,this); m_edit.SetWindowText("<请输入 A、B、C>"); ``` 并处理 EDIT 向 DIALOG 发送的通知消息:EN_SETFOCUS: ```cpp void CProg1Dlg::OnSetfocusEdit1() { // TODO: Add your control notification handler code here } ``` 通过这个示例,我们可以看到,使用 MFC 子类化机制可以轻松地实现一个只能输入 A、B、C 的 EDIT 控件。
- 粉丝: 1
- 资源: 9
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助