MFC介绍及子类化

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()
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值