解决方案 »
- 请教Picasa 启动界面的实现
- 如何给程序换皮肤
- 一个简单而变态的问题
- 如何向指定虚拟地址空间写入数值?(在线等)
- 关于CStringArray里保存unicode字串出错的问题?
- 我想请教一下:CDC类中的Arc和AngleArc函数如何使用?
- 请教:关于在VC下怎样获得字体的高度、宽度?
- 进度条(Progress Control)简单问题
- 奇怪的问题???设置窗口的最小宽度,怎么自动又变大了? 请高的指教!!!
- 关于COleVariant和CString之间的一个怪问题,谨以此贴献给曾经奇怪,正在奇怪,和将来不想奇怪的各位兄弟!!!
- MFC中的map二叉树的一点问题
- 关于VC++7.0输出语句的疑问
CXButton btn;//CXButton是自定义按钮类
btn.Create((LPCTSTR)szCaption,dwStyle,rct,this,10001);
btn.ShowWindow(SW_SHOW);btn是个局部变量,函数结束后就不存在了,也不显示了,当然问题一大堆
m_ptrBtn.Create(...)也是不行的如果new的是CButton程序可以正常运行
-执行到PreSubclassWindow时Create还没返回-只要是手动用Create创建的就不行 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);//无问题
因为定义为成员时,初始化(Create)已由windows完成。
有没有从CButton 直接继承一个 类试试 ?
估计同样不行。
CXButton是从CButton继承来的啊
//TDlg.hclass 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;
}
再补充一下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一样
}
void CXButton::OnSize(UINT nType, int cx, int cy)
这只是测试 我是在自绘时发现的 在DrawItem里无法获得正确的rect和caption,后来发现在presubclasswindow里也不行
是没有还是不正确?
没办法了 求代码吧…… 只要动态创建出来的按钮能在presubclasswindow和drawitem中获得正确的信息就好
void CXPButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rect = lpDrawItemStruct->rcItem;
UINT state = lpDrawItemStruct->itemState;
CPoint pt;
CString strText;
CString &m_title = strText;
GetWindowText(strText);
-----------------------------------------------
CRgn r;
r.CreateRectRgn(/*355*/30,30,1000,1000);//(屏幕坐标)对话框左103,按钮左222,再偏移30 是355
SetWindowRgn(r, TRUE);我用这三行代码测试,动态创建的按钮CreateRectRgn坐标是屏幕坐标,静态按钮用的是按钮的窗口坐标似乎跟映射模式之类的有关系……? 我实在有些搞不懂了现在我先判断按钮是动态创建的还是静态创建的,如果动态的就从Create中获得Rect 勉强也达到了效果 不过这个问题到底是没解决啊