松鼠的博客

导航

浅谈MFC中超类化(也称子类化)技术的实现

一:超类化概述
在MFC中窗体实例对某个窗体句柄超类化后,系统提供了这样两种能力:
1.我们对该窗体实例调用成员函数将会直接改变相关窗体句柄对应的窗体
2.系统传给相关窗体句柄的消息会先经过该窗体实例的消息映射
我举一个例子来说明:
比如我自己写了一个类叫CSuperEdit(父类为CEdit),在该类中我声明了void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);并在消息循环里添加了ON_WM_CHAR 一行
现在我只要在对话框CProg1Dlg 中声明

CSuperEdit m_edit;

然后在CProg1Dlg::OnInitDialog中,添加以下代码,就完成了“超类化”:

HWND hWndControl = ::GetDlgItem(pParent->m_hWnd, IDC_EDIT1);
m_edit.SubclassWindow (hWndControl);


这样超类化处理以后:
当我们调用m_edit.SetWindowText("<请输入A、B、C>");,后IDC_EDIT1窗体上对应的文字就会改变为"<请输入A、B、C>"
当用户在IDC_EDIT1窗体中敲键盘时,系统会调用我自己写的CSuperEdit::OnChar函数(而不是原先的CEdit::OnChar)

用途:
(1)可以用来改变一些系统控件,例如 CListCtrl 控件的 CHeaderCtrl 控件

相关参考:
(1)http://amyz.itpub.net/post/34151/406292

posted on 2008-12-15 11:23  Xproer-松鼠  阅读(356)  评论(0)    收藏  举报