有关MFC的窗口重绘函数OnDraw的问题,到现在都还没有搞明白,求高手帮忙啊!

是这样的,我写了一个绘图程序,为了让我在改变窗口大小时,窗口的图形仍能不变,我改写了OnDraw函数。然后是这样的,现在我想加上一个新建按钮,也就是说将整个客户区(视区窗口)刷白,然后重新绘图。
但是OnDraw函数已经被我改写了,也就是重定义了,于是我设置了一个bool类型的变量,用if语句控制我在OnDraw函数里面加的代码是否执行。当我点击新建按钮时,相应函数会调用OnDraw函数,但是由于那个bool变量控制,我加上的代码不会执行。所以OnDraw函数还是按照原来的方式执行,也就是重绘窗口。
这按道理来说应该没有问题,但是我的却怎么也不行,请大神看看,到底问题出在哪里了,如果想看源代码,我可以马上发过去。

楼主的意思不是太明白,我猜测是楼主误以为OnDraw是会不断被调用的吧,并且调OnDraw时背景都会先自动擦除的吧,事实并非如此。

OnDraw是窗口产生了重绘之后才会被调用 。重绘是窗口产生了无效区域之后触发,比如窗口被遮挡又解除时,windows自动触发无效区域(并带上擦除标记),然后发送WM_PAINT消息,MFC封装处理此消息并调用OnDraw虚函数。BeginPaint时若区域有擦除标记会触发WM_NCPAINT and WM_ERASEBKGND重绘无效区的窗口背景(在OnDraw调用之前)。

如要手动触发重绘,调用Invalidate可把整个窗口客户区设置为无效区域并触发WM_PAINT,若Invalidate参数为TRUE则会把无效区的擦除标志设置上(这样才会触发WM_ERASEBKGND)。

所以,楼主要窗口刷白,必须先使窗口产生无效区域。调用Invalidate是最简洁方法。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-11-20
你可以通过BOOL形变量控制显示的方式,修改为BOOL变量后,调用Invalidate即可追问

我还想问问的就是,我的程序明明显式调用了OnDraw函数,但是为什么没有起到重绘刷白的效果呢?

有关MFC的窗口重绘函数OnDraw的问题,到现在都还没有搞明白,求高手帮忙...
OnDraw是窗口产生了重绘之后才会被调用 。重绘是窗口产生了无效区域之后触发,比如窗口被遮挡又解除时,windows自动触发无效区域(并带上擦除标记),然后发送WM_PAINT消息,MFC封装处理此消息并调用OnDraw虚函数。BeginPaint时若区域有擦除标记会触发WM_NCPAINT and WM_ERASEBKGND重绘无效区的窗口背景(在On...

MFC中OnDraw和OnPaint的区别
(一) OnPaint 和 OnDraw(1)OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。(2)OnPaint()是CWnd的类成员,负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,没有响应消息的功能.(3)当视图变得无效时(包括大小的改变,移动,被...

MFC窗口重绘的频率
任何窗口程序的重绘(包括MFC程序),都是“需要”的时候重绘,不需要或者没有强制重绘命令的时候,是不会重绘的,因此没有“频率”的概念。MFC程序,文档视图结构的,视图类的OnDraw是“重绘消息响应函数”,说重绘的函数是不准确的。而对话框或者普通窗口程序,重绘响应函数为OnPaint(其实View视图也有这...

MFC中的Invalidate、OnDraw、OnPaint函数的作用、区别和联系?_百度...
UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用O...

关于MFC窗口重绘时图像消失的问题
问题出在OnLButtonUp()函数,分析如下:void CDrawView::OnLButtonUp(UINT nFlags, CPoint point){ CDrawDoc* pDoc = GetDocument();m_stroke.m_pointArray.Add(point);isDrawing=false;CStroke *pstroke=new CStroke; \/\/创建了一个新的Stroke,并把指针赋给pstroke pstroke=&m_stroke; \/\/但是...

MFC 单步每句代码的显示效果 ,发现是对话框显示不出来。有没有什么...
当你在OnDraw函数里设置了断点,程序执行到此处的时候会显示窗口,而窗口从无到有的过程就会执行导致窗口重绘,从而又去执行OnDraw,而OnDraw中设置了断点,所以,又切换到了编辑器界面,程序依旧在断点处挂起。从而看到窗口一闪而过。至于解决,我并没有好的办法,只能建议你把代码从OnDraw中移出。在...

MFC 中OnPaint()函数中的用法
OnPaint()在窗口进行重绘时会被调用,所以如果有些图或者控件是你动态生成的,而你又不希望在重绘时被擦除的话,你可以把绘图的过程写在OnPaint里。

关于invalidate窗口重绘的问题
Invalidate会调用SendMessage向窗口发送WM_PAINT消息。这个消息会调用OnPaint函数。如果在OnPaint里面没有后面的画图代码,那当然就只执行简单的窗口重绘功能了

MFC MDI框架,加载了CFromView视图,视图上有控件,但是一切换程序,CFromV...
切换窗口,改变窗口大小。会引起窗口重绘。在OnDraw函数做文章

关于MFC绘制正余弦曲线的问题?
利用消息机制:一:对话框 初始化为无模态对话框;在对话框控件值改变后,通知视图,数据改变;从无模态对话框读数据 视图重绘 二:对话框模态对话框,当在对话框控件值改变后, 在对话框类直接 修改 DOCUMENT,或VIEW的值;通知通知窗口重绘

相似回答