mfc-MFC断言ASSERT(::IsWindow(m_hWnd))

问题描述

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++深入详解 ^_^ ,不胜感激!

时间: 2024-10-22 07:23:07

mfc-MFC断言ASSERT(::IsWindow(m_hWnd))的相关文章

MFC教程(12)-- 对话框和对话框类CDialog(2)

RunModalLoop是一个实现自己的消息循环的示例,消息循环的条件是模式化状态没有结束.实现线程自己的消息循环见8.5.6节.当用户按下按钮"取消"."确定"时,将导致RunModalLoop退出消息循环,结束对话框模式状态,并调用::EndDialog关闭窗口.有关关闭对话框的处理如下:void CDialog::EndDialog(int nResult) { ASSERT(::IsWindow(m_hWnd)); if (m_nFlags & (W

深入探讨MFC消息循环和消息泵

首先,应该清楚MFC的消息循环(::GetMessage,::PeekMessage),消息泵(CWinThread::PumpMessage)和MFC的消息在窗口之间的路由是两件不同的事情.在MFC的应用程序中(应用程序类基于CWinThread继承),必须要有一个消息循环,他的作用是从应用程序的消息队列中读取消息,并把它派送出去(::DispatchMessage).而消息路由是指消息派送出去之后,系统(USER32.DLL)把消息投递到哪个窗口,以及以后消息在窗口之间的传递是怎样的.  消

MFC子窗口和父窗口(SetParent,SetOwner)

一.概念和区别 在windows系统中,每个窗口对象都对应有一个数据结构,形成一个list链表.系统的窗口管理器通过这个list来获取窗口信息和管理每个窗口.这个数据结构中有四个数据用来构建list,即child.sibling.parent.owner四个域.所以我们可以看到,窗口之间的关系有两种:owner-owned 关系和 parent-child关系.前者称之为拥有/被拥有关系,后者称之为父/子关系.在这篇文字中,我把owner窗口称之所有者窗口.换句话说,一个窗口在有一个父窗口(pa

走出MFC子类化的迷宫

走出MFC子类化的迷宫 KEY WORDS:子类化 SUBCLASSWINDOW  MFC消息机制   许多Windows程序员都是跳过SDK直接进行RAD开发工具[或VC,我想VC应不属于RAD]的学习,有些人可能对子类化机制比较陌生. 我们先看看什么是Windows的子类化.Windows给我们或是说给它自己定义了许多丰富的通用控件,如:Edit.ComboBox .ListBox--等,这些控件功能丰富,能为我们开发工作带来极大方面,试想:我们单单是自己实现一个EDIT控件是多么的艰难!但

MFC教程(13)-MFC工具条和状态栏(2)

消息WM_POPMESSAGESTRING用来重新设置状态栏. 这两个消息对应的消息处理函数分别是OnSetMessageString和OnPopMessageString,OnSetMessageString和OnPopMessageString分别实现如下: OnSetMessageString LRESULT CFrameWnd::OnSetMessageString(WPARAM wParam, LPARAM lParam) { //最近一次被显示的消息字符串IDS(一个消息对应的字符串

MFC中CWnd类及其派生类对话框、消息处理、窗口操作

http://hi.baidu.com/xiaorida21/blog/item/8d8eb77a22eedee52e73b39e.html CWnd类 我们在屏幕上看到的所有对象都和窗口有关,它们或者派生于CWnd,属继承关系,如对话框.工具栏.状态栏.子控件:或者被CWnd合成,属服务员与服务对象关系,如图标.菜单.显示设备. CWnd类封装的窗口操作主要包含窗口的创建和销毁.操作窗口风格.操作窗口状态.窗口子类化.获取指定窗口等. 当然,CWnd还实现了其他功能: 1.绘制窗口 GetDC

2010-10-19 10:48 Activex调试以及m_hWnd为空 解决办法

1. 点击[开始]->[运行] 命令:regedit.2. 定位到HKEY_LOCALMACHINE -> SOFTWARE -> Microsoft -> Internet Explorer -> Main3. 在[右边区域][右键]新建一个名称为TabProcGrowth的DWORD值, 数值数据设置为0. VS不用重启,直接可以按F5进行调试ActiveX了! 参看: http://social.microsoft.com/Forums/en-US/vsdebug/th

c++-添加了SetMenu(NULL)这句后,被assert

问题描述 添加了SetMenu(NULL)这句后,被assert 添加了SetMenu(NULL)这句后,在这句函数内部被ASSERT(::IsWindow(m_hWnd));然后就崩溃了. 求大神帮帮忙,到底咋回事...如题 BOOL CFrameWnd::SetMenu(CMenu* pMenu) { ASSERT(::IsWindow(m_hWnd)); if (m_dwMenuBarState == AFX_MBS_VISIBLE) { return ::SetMenu(m_hWnd,

mfc-MFC,DoModal时候出现的情况

问题描述 MFC,DoModal时候出现的情况 DoModal时报错,提示窗口句柄为空~,求助. BOOL CWnd::ShowWindow(int nCmdShow) { ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL)); if (m_pCtrlSite == NULL) return ::ShowWindow(m_hWnd, nCmdShow); else return m_pCtrlSite->ShowWindow(nCmdShow);