首先明确声明,单文档CTestView继承CRichEditView,在此基础上研究分析所遇到的问题。
1、关于OnDraw函数:
2、关于Serialize函数:
1、关于OnDraw:不知道有没有以及过,其实是在OnPaint中调用的OnDraw,也就是消息WM_PAINT,即WM_PAINT->OnPaint->OnDraw;在OnDraw中进行绘制,显示数据。
此处有两个函数:UpdateAllViews() 与 Invalidate()--------UpdateAllViews()通知所有视图做出相应改变,Invalidate()使窗口无效,这里个人理解一般,参考链接:UpdateAllViews() 与 Invalidate() 也就是下图:(此外,这里额外给一个链接,写的不错:令人生疑的Windows窗口消息WM_PAINT详解 )
回到CRichEditView中来,继承它的类是CTestView,可以发现,在CTestView中初始是不带OnDraw的,这个需要主动去类向导中添加虚函数OnDraw,观察OnDraw函数还是会发现这和继承CView得到的OnDraw不一样,其函数内不会自带任何东西
在此处用一些语句测试一下:pDC->TextOut(200, 200, _T("输出试一下")); // 绘制一行文本
发现并没有出现这行文本,问题何在?可以发现,程序运行过程中根本不会来到这里,也就是完全不会调用函数OnDraw,可以尝试改变窗口大小,发现仍然不会输出文本,不禁思考,此处应该是连OnPaint都不会调用,难道是屏蔽了WM_PAINT消息?尝试添加OnPaint函数,并在其中加上一个消息框提示,用以表明调用这个函数;见下面结果,发现WM_PAINT消息还是正常被处理,那为什么这里在没有主动添加OnPaint函数时没有响应?追溯到源头,CWnd中有函数OnPaint,按照继承这一套CTestView应该是可以调用OnPaint处理的,但却没有任何反应(暂时没能解决这个问题,也不知道怎么查找资料),无奈,只能先这样处理。
通过上面一番处理,是不是发现现在可以在OnDraw中绘制了,但是,这恰恰违背了CRichEditView的使用方式,你可以尝试输入,发现现在根本无法正常输入了(如下图),完全打乱了CRichEditView的使用。(这能不能解释为什么在CTestView中是无法直接使用OnPaint和OnDraw这两个函数的呢?可能就是为了屏蔽WM_PAINT,以至于CTestView不写函数OnPaint,就无法响应WM_PAINT。(当然我不知道怎么证实我的想法,但是猜测得到的结果,估计八九不离十)
此外补充一点,我之前也是想在OnDraw中使用SetWindowText的(虽然没成功,导致我从不在OnDraw里使用),不过找到了这其中的问题,(在OnDraw()函数中,利用for循环更新SetWindowText,为什么CEdit不能实时显示-CSDN社区 )(mfc中SetWindowText()导致程序卡死)(还好不是我问的问题,不然我也被骂,哈哈哈哈)提示一下,SetWindowText会引发消息WM_SETTEXT,下图就是问题答案了,(大致可以理解为,发了一个WM_PAINT消息,然后在OnDraw中又发了一个WM_SETTEXT消息,导致又需要发送一个WM_PAINT消息,然后就一直然后了)(我要是理解错了,。。。。。记得骂我,)
问题解决,搞明白了,记得删掉OnDraw、OnPaint函数,还原到原来的程序,毕竟人家本来就不想你用。
2、关于Serialize函数:周末再写,马上该滚蛋了
标签:MFC,函数,PAINT,WM,OnDraw,OnNewDocument,OnPaint,CRichEditView From: https://www.cnblogs.com/2015-16/p/16601875.html