Debug Assertion Failed提示,获取不到m_hWnd

言無 2012-06-15 10:28:02
创建了一个基于对话框的界面,上面放了一些简单控件,想让其分栏显示在主窗口上。程序在Release下可以正常运行,debug下就要崩溃,获取不到对话框和控件的m_hWnd,请教高手这是怎么回事,怎样解决?
...全文
352 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
言無 2012-06-16
  • 打赏
  • 举报
回复
谢谢各位,我把mapTreeCtrl.MoveWindow(&rcTree,TRUE)改为:

if (mapTreeCtrl.GetSafeHwnd())
mapTreeCtrl.MoveWindow(&rcTree,TRUE);
else
MessageBox(_T("无法获得地图树控件句柄!"));
第一次运行时会提示无法获得句柄,但是之后就没问题了,可以获得句柄了。 具体原因未知...
Binzo 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
程序在Release下可以正常运行,debug下就要崩溃
[/Quote]
程序有问题,能在Release下可以正常运行只是运气好。
m_hWnd没有得到应该的句柄(可能是NULL),没赋值对。
赵4老师 2012-06-15
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
csucdl 2012-06-15
  • 打赏
  • 举报
回复
提供具体点的信息。出错地方的代码能贴出来吗, 有没有调试?
ouyh12345 2012-06-15
  • 打赏
  • 举报
回复
言無 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));
第一个是说窗口还没创建好
如果控件已经创建好,那看看m_pCtrlSite意味着什么
[/Quote]
应该是出在IsWindow(m_hWnd) 因为通过调用堆栈可以找到m_hWnd unused=??? 有红的感叹号标志
不知道什么原因
言無 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

没添加控件变量???
[/Quote]

空间变量肯定是添加了的
言無 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

不知道原因请沿CallStack继续往下找。
找不到的话,还可以在m_hWnd上设置变量值改变断点。参考下面:
To set a breakpoint when a variable changes value

From the Edit menu, click Breakpoints.
Click the Data tab of the Breakpoints dialog bo……
[/Quote]

其他地方都没什么问题,就是在MoveWindow函数中,提示有问题,出在 m_hWnd 上...
东莞某某某 2012-06-15
  • 打赏
  • 举报
回复
没添加控件变量???
ouyh12345 2012-06-15
  • 打赏
  • 举报
回复
ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));
第一个是说窗口还没创建好
如果控件已经创建好,那看看m_pCtrlSite意味着什么
言無 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

mapTreeCtrl还没有创建好?
确保在显示界面前,把控件创建好
[/Quote]

是的 空间肯定是已经创建好的
ouyh12345 2012-06-15
  • 打赏
  • 举报
回复
mapTreeCtrl还没有创建好?
确保在显示界面前,把控件创建好
赵4老师 2012-06-15
  • 打赏
  • 举报
回复
不知道原因请沿CallStack继续往下找。
找不到的话,还可以在m_hWnd上设置变量值改变断点。参考下面:
To set a breakpoint when a variable changes value

From the Edit menu, click Breakpoints.
Click the Data tab of the Breakpoints dialog box.
In the Expression text box, type the name of the variable.
Click OK to set the breakpoint.
言無 2012-06-15
  • 打赏
  • 举报
回复
谢谢各位的帮助,问题是这样的,我新建一个对话框,在上面添加了一个Tree Control,然后以该对话框新建了一个类CLayersCtrlView,在该类中有个void CLayersCtrlView::OnDraw(CDC* pDC):
void CLayersCtrlView::OnDraw(CDC* pDC)
{
CRect rect,rcTree;
GetClientRect(&rect);

//改变控件大小
rcTree.left = rect.left + 3;
rcTree.right = rect.right - 6;
rcTree.top = rect.top + 20;
rcTree.bottom = rect.bottom - 40;

mapTreeCtrl.MoveWindow(&rcTree,TRUE);
...
}

在mapTreeCtrl.MoveWindow(&rcTree,TRUE)会出错,通过调用堆栈可以找到 mapTreeCtrl下CTreeCtrl(自己建的一个继承于CTreeCtrl的类)中的CWnd下m_hWnd unused=??? ,最终停止在
void CWnd::MoveWindow(int x, int y, int nWidth, int nHeight, BOOL bRepaint)
{
ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));
...

请问世什么原因?

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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