MFC(microsoft fundation classes)
概念
微软基础类库,提供了很多封装的类和一个应用程序框架,本质上是封装了win32的sdk
类继承层次
CObject // 动态类型识别和序列化
CCmdTarget // 消息循环和消息派发
CWnd // 窗口的封装
CDialog // 对话框
CDialogEx
CAboutDlg
CFrameWnd // 代表主窗口
CMainFrame
CView // 代表客户区
CSingleDocView
CWinThread // 代表线程
CWinApp // 代表程序本身
CWinAppEx
CSingleDocApp
CDocument // 保存数据
CSingleDocDoc
子类化的原理
劫持系统默认的窗口过程函数,对消息进行过滤处理。
MFC子类化
重设窗口过程函数API
SubClassWindow
:仅修改窗口实例属性SubClassDlgItem
:修改窗口类的属性,只影响以后创建的窗口,之前存在的窗口不受影响
实现方法
- 方法
- 创建MFC类自己的CMyEdit,继承自MFC的CEdit
- 调用成员函数SubClassWindow,或者SubclassDlgItem来实现子类化
// CMyEdit
class CMyEdit : public CEdit
{
DECLARE_DYNAMIC(CMyEdit)
public:
CMyEdit();
virtual ~CMyEdit();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
};
//实现自己的onchar过程函数
void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (('a' <= nChar && nChar <= 'z')
|| ('0' <= nChar && nChar <= '9'))
{
return CEdit::OnChar(nChar, nRepCnt, nFlags);
}
else
{
return ;
}
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
void CMFCSubClassDlg::OnBnClickedSubclass()
{
static CMyEdit edtSub;
HWND hEdit = GetDlgItem(EDT_SUBCLASS)->GetSafeHwnd();
edtSub.SubclassWindow(hEdit);
//edtSub.SubclassDlgItem()
}