mdotK
2015-05-14 12:29
采纳率: 50%
浏览 5.0k
已采纳

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

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • deg936 2015-05-14 13:10
    已采纳

    如果你是想在视图上绘制,是不必新加一个CNew窗口的,可以直接在 CHomeWorkView::OnDraw()中进行绘制。
    如果你一定要增加一个CNew窗口,那么只是在CHomeWork中定义new变量是不行的,new对应的窗口并没有创建出来,
    还要在CHomeWork::OnCreate中调用new.Create来创建出窗口。

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • threenewbee 2015-05-14 14:28

    new是否是一个有效的窗口?是不是已经关闭或者释放了。

    评论
    解决 无用
    打赏 举报
  • Eleven 2015-05-14 16:15

    先判断new的窗口句柄是否为NULL,为NULL就调用Create创建先

    评论
    解决 无用
    打赏 举报
  • mdotK 2015-05-15 05:51

    我是想在新类中用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++深入详解 ^_^ ,不胜感激!

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题