MFC子类化一个窗口需要做什么工作

来源:百度知道 编辑:UC知道 时间:2024/07/07 00:43:08
我在一个MFC示例中看到用户自定义的按钮的外观,用到了CXPButton::PreSubclassWindow函数,CXPButton是派生自CButton的类,这应该是子类化吧。
我不理解的是子类化是通过调用SubclassWindow实现的,我只重载PreSubclassWindow函数怎么能够实现呢?
而且子类化窗口要新的窗口进程的地址?(MFC是从哪获得的这个窗口进程的地址?因为我并没有创建新的窗口进程)
所以,我想请教一下大家,在MFC中子类化一个窗口应该做哪些工作?MFC本身又是怎么知道用户要子类化一个窗口的?
谢谢大家了!
对daoxiangcun回答的想法:
1、你在CMyButton中重载了WndProc,在WndProc中截获消息并处理,可不可以不重载这个函数,直接在CMyButton类中用ClassWizard添加消息句柄;
2、能不能不用SubclassDlgItem,在对话框中动态创建CMyButton类的控件,然后用1种说的方法,在CMyButton类中用ClassWizard添加消息句柄。

子类化一个窗口,要用到CWND的SubclassDlgItem方法
BOOL SubclassDlgItem(
UINT nID,
CWnd* pParent
);
使用的方法:
在父窗口中(假设为对话框IDD_DIALOG1)中定义一个变量:
private CMyButton m_myButton; //m_myButton为自定义的按钮的类型
然后用这个变量去子类化IDD_DIALOG1中的一个按钮,假设其ID为IDC_BUTTON1:
m_myButton.SubclassDlgItem(IDC_BUTTON1, this);
之后该按钮的消息函数就由CMyButton所替代,重载CMyButton的WndProc函数即可以处理。

MSDN上的一个例子:
class CMyButton : public CButton {...};
// m_myButton is a CMyButton object member of CAboutDlg

BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// IDC_BUTTON1 is the ID for a button on the
// dialog template used for CAboutDlg.
m_myButton.SubclassDlgItem(IDC_BUTTON1, this);

return TRUE; // Return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}