欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MFC介绍及子类化

程序员文章站 2022-05-24 18:23:10
...

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:修改窗口类的属性,只影响以后创建的窗口,之前存在的窗口不受影响

实现方法

  • 方法
    1. 创建MFC类自己的CMyEdit,继承自MFC的CEdit
    2. 调用成员函数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()
}