Create创建控件成功后不显示。

glovel0425 2011-12-05 09:14:45
以下是我点击按钮创建控件的方法:

void CDlgContactOther::OnBnClickedBtnAddweb()
{
// TODO: 在此添加控件通知处理程序代码
m_nControlId++;
m_nControlCount++;
CRect rect;
int count = m_arrControls.GetSize();
if(m_nControlCount>5)
{
m_vsb_Info.ShowWindow(SW_SHOW);
m_vsb_Info.SetScrollRange(0,m_nControlCount-5);
m_vsb_Info.SetScrollPos(m_vsb_Info.GetScrollPos()+1);
for(int i=0;i<count;i++)
{
if(m_arrControls.ElementAt(i) == GetDlgItem(IDC_BTN_ADDWEB)||m_arrControls.ElementAt(i) == GetDlgItem(IDC_BTN_ADDADDR)||m_arrControls.ElementAt(i)==GetDlgItem(IDC_BTN_ADDTOOL))
continue;
m_arrControls.ElementAt(i)->GetWindowRect(&rect);
ScreenToClient(&rect);
m_arrControls.ElementAt(i)->SetWindowPos(NULL,rect.left,rect.top-32,rect.Width(),rect.Height(),SWP_NOZORDER|SWP_NOSIZE);
m_arrControls.ElementAt(i)->GetWindowRect(&rect);
ScreenToClient(&rect);
}
}
m_arrControls.ElementAt(count-1)->GetWindowRect(&rect);// 崩溃处
ScreenToClient(&rect);

CWDComboBox* cmb = new CWDComboBox();
cmb->Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,CRect(35,rect.top+32,35+99,rect.top+32+20),this,m_nControlId++);
cmb->SetBorderColor(RGB(200,255,255));
cmb->SetFont(&thePrefs.m_font1);
cmb->AddString("公司网站");
cmb->AddString("微博");
cmb->AddString("博客");
cmb->AddString("个人主页");
cmb->SetDroppedWidth(100);
cmb->MoveWindow(35,rect.top+32,99,rect.top+32);
cmb->SetCurSel(0);

CWDEdit* edt = new CWDEdit();
edt->Create(WS_CHILD|WS_VISIBLE|WS_TABSTOP,CRect(147,rect.top+32,147+277,rect.top+32+20),this,m_nControlId++);
edt-> ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_DRAWFRAME);
edt->SetBorderColor(RGB(200,255,255));
edt->SetFont(&thePrefs.m_font1);

m_arrControls.Add(cmb);
m_arrControls.Add(edt);

m_arrCmbWeb.Add(cmb);
m_arrEdtWeb.Add(edt);
Invalidate(false);
}


点击按钮后,这个方法可以实现创建并能够显示控件。但是手动调用这个方法的话就不行。调试的结果是create创建成功,但是界面不显示,当我再按这个按钮的时候程序走到//崩溃处 崩溃。

求解这个是什么原因?
...全文
426 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
glovel0425 2011-12-05
  • 打赏
  • 举报
回复
帮帮忙啊!!!
glovel0425 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 shen_wei 的回复:]

怎么可能??
方便时,发个demo吧。。这样方便看问题。。

383156647@qq.com
[/Quote] 先行谢谢你了,工程挺大,而且还有本地要配服务端,所以发了也没用,程序手动调用这个方法就是靠服务器返回的数据验证后才调的。 很奇怪的问题。
shen_wei 2011-12-05
  • 打赏
  • 举报
回复
怎么可能??
方便时,发个demo吧。。这样方便看问题。。

383156647@qq.com
glovel0425 2011-12-05
  • 打赏
  • 举报
回复
帮帮忙呀。
glovel0425 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 shen_wei 的回复:]

手动调用这个方法后创建成功,

那你一步一步的调试。看看创建成功时,崩溃的值!!!
[/Quote]成功时和崩溃时,控件的值都一样。。
shen_wei 2011-12-05
  • 打赏
  • 举报
回复
手动调用这个方法后创建成功,

那你一步一步的调试。看看创建成功时,崩溃的值!!!

glovel0425 2011-12-05
  • 打赏
  • 举报
回复
我把m_arrControls.ElementAt(0)->GetWindowRect(&amp;rect);拆开来调试,发现问题出在了GetWindowRect上,返回的CWnd的指针内容


- wnd 0x01b4db70 {CWDEdit hWnd=0x000a0ad0 {unused=??? }} CWnd *
+ [CWDEdit] {CWDEdit hWnd=0x000a0ad0 {unused=??? }} CWDEdit
+ CCmdTarget {CCmdTarget} CCmdTarget
+ classCWnd {"CWnd"} CRuntimeClass
+ m_hWnd 0x000a0ad0 {unused=??? } HWND__ *
+ wndTop {CWnd hWnd=0x00000000 {unused=??? }} CWnd
+ wndBottom {CWnd hWnd=0x00000001 {unused=??? }} CWnd
+ wndTopMost {CWnd hWnd=0xffffffff {unused=??? }} CWnd
+ wndNoTopMost {CWnd hWnd=0xfffffffe {unused=??? }} CWnd
m_bEnableActiveAccessibility false bool
+ m_pStdObject 0x00000000 IAccessible *
m_pfnNotifyWinEvent 0x77d299cb void (unsigned long, HWND__ *, long, long)*
+ m_pProxy 0x00000000 IAccessibleProxy *
+ _interfaceEntries 0x0094baf4 struct AFX_INTERFACEMAP_ENTRY const * const CWnd::_interfaceEntries const AFX_INTERFACEMAP_ENTRY [1]
+ interfaceMap {pBaseMap=0x0094c93c struct AFX_INTERFACEMAP const CCmdTarget::interfaceMap pEntry=0x0094baf4 struct AFX_INTERFACEMAP_ENTRY const * const CWnd::_interfaceEntries } AFX_INTERFACEMAP
+ m_xAccessible {...} CWnd::XAccessible
+ m_xAccessibleServer {...} CWnd::XAccessibleServer
+ m_hWndOwner 0x00000000 {unused=??? } HWND__ *
m_nFlags 0 unsigned int
m_pfnSuper 0x77d3b3ec long (HWND__ *, unsigned int, unsigned int, long)*
m_nMsgDragList 49294 const unsigned int
m_nModalResult 0 int
+ m_pDropTarget 0x00000000 {COleDropTarget} COleDropTarget *
+ m_pCtrlCont 0x00000000 {COleControlContainer} COleControlContainer *
+ m_pCtrlSite 0x00000000 {COleControlSite} COleControlSite *
+ _messageEntries 0x0094bb10 struct AFX_MSGMAP_ENTRY const * const CWnd::_messageEntries const AFX_MSGMAP_ENTRY [30]
+ messageMap {pBaseMap=0x0094c8c0 struct AFX_MSGMAP const CCmdTarget::messageMap lpEntries=0x0094bb10 struct AFX_MSGMAP_ENTRY const * const CWnd::_messageEntries } AFX_MSGMAP

glovel0425 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 shen_wei 的回复:]

那你获取的就是
m_arrControls.ElementAt(0)->GetWindowRect(&amp;rect);// 崩溃处

那你rect有值吗?
[/Quote] 没有 我细说一下吧,就是手动调用这个方法后创建成功。也没错,但是就是不显示。而且再次按这个按钮调用这个方法时走到崩溃处就崩了。。。。
shen_wei 2011-12-05
  • 打赏
  • 举报
回复
那你获取的就是
m_arrControls.ElementAt(0)->GetWindowRect(&rect);// 崩溃处

那你rect有值吗?
glovel0425 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shen_wei 的回复:]

m_arrControls.ElementAt(count-1)->GetWindowRect(&rect);// 崩溃处

运行到这里时,count的值是多少???
[/Quote] count 值是 初始值+1 控件创建成功,并加入到array中
glovel0425 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shen_wei 的回复:]

m_arrControls.ElementAt(count-1)->GetWindowRect(&rect);// 崩溃处

运行到这里时,count的值是多少???
[/Quote] 值是初始值+1 就是之前的控件创建成功,并加入到该array中了。
shen_wei 2011-12-05
  • 打赏
  • 举报
回复
m_arrControls.ElementAt(count-1)->GetWindowRect(&rect);// 崩溃处

运行到这里时,count的值是多少???
glovel0425 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 shen_wei 的回复:]

这样就难了。。看代码看不出来问题,关键是单步调试。。

单步调试了就能看出问题!!
[/Quote] 经过这么长时间调试测试,我发现手动调用和点击按钮调用此方法除了随机分配的地址句柄不同外没什么问题了啊。或者说 哪里有可能性呢?
shen_wei 2011-12-05
  • 打赏
  • 举报
回复
这样就难了。。看代码看不出来问题,关键是单步调试。。

单步调试了就能看出问题!!
glovel0425 2011-12-05
  • 打赏
  • 举报
回复
没人嘛?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧