16,472
社区成员
发帖
与我相关
我的任务
分享
CString szCaption(_T("Button"));
CRect rct;
m_btnOK.GetWindowRect(&rct);//用OK按钮的Rect测试
DWORD dwStyle = m_btnOK.GetStyle();
CXButton btn;//CXButton是自定义按钮类
btn.Create((LPCTSTR)szCaption,dwStyle,rct,this,10001);
btn.ShowWindow(SW_SHOW);
void CXButton::PreSubclassWindow()
{
CRect rct;
this->GetWindowRect(rct);//区域是空的
CString szCaption;
this->GetWindowText(szCaption);//空字串
DWORD dwStyle = this->GetStyle();//可以正确获得
CString szTemp;
szTemp.Format(_T("Caption:%s\tRect:top=%dleft=%dbottom=%dright=%d\tStyle:%d"),szCaption,rct.top,rct.left,rct.bottom,rct.right,dwStyle);
::MessageBox(NULL,szTemp,_T("E"),MB_OK);//这里有个断言通不过 AfxMessageBox也一样
}
void CXButton::PreSubclassWindow()
{
CButton::PreSubclassWindow();
CRect rct;
this->GetWindowRect(rct);//空
CString szCaption;
this->GetWindowText(szCaption);//空
DWORD dwStyle = this->GetStyle();//传入的dwStyle
CString szTemp;
szTemp.Format(_T("Caption:%s\tRect:top=%dleft=%dbottom=%dright=%d\tStyle:%d"),szCaption,rct.top,rct.left,rct.bottom,rct.right,dwStyle);
::MessageBox(NULL,szTemp,_T("E"),MB_OK);//应用程序异常,调试会发现是一个断言,AfxMessageBox一样
}
//TDlg.h
class CTDlg : public CDialog
{
//...
CButton m_Btn1;//DDX绑定,正常
CXButton m_Btn2;//DDX绑定,CXButton成员函数中可正常获得rect和WindowText
CButton *m_pBtn3;//动态生成,正常
CXButton *m_pBtn4;//动态生成,异常
BOOL bIsCreated;//构造函数中被初始化为FALSE
//...
}
//TDlg.cpp
void CTDlg::OnBnClickedOk()
{
if (bIsCreated == FALSE)
{
CString szCaption(_T("Button"));
CRect rct(0,0,60,60);
DWORD dwStyle = m_btnOK.GetStyle();
m_pBtn3 = new CButton;
m_pBtn3->Create((LPCTSTR)szCaption,dwStyle,rct,this,100001);
//m_pBtn3的动态创建,正常,换成m_pBtn4,在CXButton的成员函数中无法获得rect和WindowText
m_pBtn3->ShowWindow(SW_SHOW);
bIsCreated = TRUE;
return;
}
m_pBtn3->MoveWindow(0,0,100,100);//正常,pBtn3所指对象没被销毁
return;
}
if (bIsCreated == FALSE)
{
CString szCaption(_T("Button"));
CRect rct;
m_btnOK.GetWindowRect(&rct);
DWORD dwStyle = m_btnOK.GetStyle();
m_pNewBtn = new CButton;//CButton没问题,CXButton在PreSubclassWindow中不能获得rect,也无法自绘
m_pNewBtn->Create((LPCTSTR)szCaption,dwStyle,rct,this,100001);//复制OK按钮的属性
m_pNewBtn->ShowWindow(SW_SHOW);
bIsCreated = TRUE;
return;
}
m_pNewBtn->MoveWindow(0,0,100,100);//无问题