问题描述
- MFC断言ASSERT(::IsWindow(m_hWnd))
-
一个HomeWork的单文档MFC工作空间,新建了一个继承CWnd的CNew类,
在CNew中
重写void CNew::OnPaint()
{CPaintDC dc(this);
dc.MoveTo(0,0);
dc.LineTo(300,300);}
定义 void CNew::Clear()
{ InvalidateRect(NULL,TRUE); }
然后新增一个菜单项Clear,添加菜单命令相应函数
void CHomeWorkView::OnCLear()
{
new.Clear();//new 已经定义成CHomeWork的成员变量
}
出现这种错误:
_AFXWIN_INLINE void CWnd::InvalidateRect(LPCRECT lpRect, BOOL bErase)
{ ASSERT(::IsWindow(m_hWnd)); ::InvalidateRect(m_hWnd, lpRect, bErase); }
求大神帮帮忙,我在百度上搜了很久了,没找到解决方案,有一个方案是这样的---------------->>>我遇到的情况是,A类的Clear函数中调用了this->Invalidate();,而B类调用了A类的Clear函数,此时A类还未实例化,所以A类句柄为空,m_hWnd = NULL。我的解决方法是将A类的实例化放在B类前,问题解决。,<<<--------------
没办法,还是没解决掉,故而来求大神解决了,我才刚刚学MFC
解决方案
如果你是想在视图上绘制,是不必新加一个CNew窗口的,可以直接在 CHomeWorkView::OnDraw()中进行绘制。
如果你一定要增加一个CNew窗口,那么只是在CHomeWork中定义new变量是不行的,new对应的窗口并没有创建出来,
还要在CHomeWork::OnCreate中调用new.Create来创建出窗口。
解决方案二:
new是否是一个有效的窗口?是不是已经关闭或者释放了。
解决方案三:
先判断new的窗口句柄是否为NULL,为NULL就调用Create创建先
解决方案四:
我是想在新类中用InvalidateRect来刷新CHomeWorkView(基于单文档的)的窗口,不知道这样行不行。
我是跟着视频做贪吃蛇里面碰到断言错误的,然后我自己又新建了一个工程CHomeWork来测试,也会出现这种错误
你这么一说我去InitDialog(贪吃蛇是基于对话框的)里面看到了这么一句,
m_snake.CreateEx( WS_EX_CLIENTEDGE, _T("SNAKEMAP"), NULL, WS_VISIBLE | WS_BORDER | WS_CHILD,
CRect( 0, 0, 325, 425 ), this, SNAKEMAP );
GetDlgItem( SNAKEMAP )->SetFocus();
我之前没加上,视频也没讲,我看的是王浩写的Visual C++游戏开发案例实战
谢谢你啦,因为现在还很菜,这个new.Create我都不会用额!
另外想请教你,我这种零基础的该看些什么书比较好呢 ,能给我推荐下吗?
现在只看了一遍孙鑫的VC++深入详解 ^_^ ,不胜感激!