解决方案 »
- 高手进,c++怎样获取webbrowser内,当前鼠标点击元素的html代码
- 内核对象和WaitForMultipleObjects
- 讨论一下win32子系统
- combobox输入中文显示乱码问题
- 求逆时针方向生成第一个8分圆的中点算法
- xp下没有VC运行库吗?
- 帮帮忙!!我装了visual assist以后,我的工程就打不开了,为什么?
- 请问:在win32 application 做的程序中怎样显示对话框? (要能利用资源编辑器最好)
- 请各位高手推荐几款VC可以使用的、比较好的数据库表格和报表控件!
- DLL中创建窗口,实现窗口消息处理
- 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 勉强也达到了效果 不过这个问题到底是没解决啊