有关MFC的窗口重绘函数OnDraw的问题,到现在都还没有搞明白,求高手帮忙啊!
是这样的,我写了一个绘图程序,为了让我在改变窗口大小时,窗口的图形仍能不变,我改写了OnDraw函数。然后是这样的,现在我想加上一个新建按钮,也就是说将整个客户区(视区窗...
是这样的,我写了一个绘图程序,为了让我在改变窗口大小时,窗口的图形仍能不变,我改写了OnDraw函数。然后是这样的,现在我想加上一个新建按钮,也就是说将整个客户区(视区窗口)刷白,然后重新绘图。
但是OnDraw函数已经被我改写了,也就是重定义了,于是我设置了一个bool类型的变量,用if语句控制我在OnDraw函数里面加的代码是否执行。当我点击新建按钮时,相应函数会调用OnDraw函数,但是由于那个bool变量控制,我加上的代码不会执行。所以OnDraw函数还是按照原来的方式执行,也就是重绘窗口。
这按道理来说应该没有问题,但是我的却怎么也不行,请大神看看,到底问题出在哪里了,如果想看源代码,我可以马上发过去。 展开
但是OnDraw函数已经被我改写了,也就是重定义了,于是我设置了一个bool类型的变量,用if语句控制我在OnDraw函数里面加的代码是否执行。当我点击新建按钮时,相应函数会调用OnDraw函数,但是由于那个bool变量控制,我加上的代码不会执行。所以OnDraw函数还是按照原来的方式执行,也就是重绘窗口。
这按道理来说应该没有问题,但是我的却怎么也不行,请大神看看,到底问题出在哪里了,如果想看源代码,我可以马上发过去。 展开
2个回答
展开全部
楼主的意思不是太明白,我猜测是楼主误以为OnDraw是会不断被调用的吧,并且调OnDraw时背景都会先自动擦除的吧,事实并非如此。
OnDraw是窗口产生了重绘之后才会被调用 。重绘是窗口产生了无效区域之后触发,比如窗口被遮挡又解除时,windows自动触发无效区域(并带上擦除标记),然后发送WM_PAINT消息,MFC封装处理此消息并调用OnDraw虚函数。BeginPaint时若区域有擦除标记会触发WM_NCPAINT and WM_ERASEBKGND重绘无效区的窗口背景(在OnDraw调用之前)。
如要手动触发重绘,调用Invalidate可把整个窗口客户区设置为无效区域并触发WM_PAINT,若Invalidate参数为TRUE则会把无效区的擦除标志设置上(这样才会触发WM_ERASEBKGND)。
所以,楼主要窗口刷白,必须先使窗口产生无效区域。调用Invalidate是最简洁方法。
OnDraw是窗口产生了重绘之后才会被调用 。重绘是窗口产生了无效区域之后触发,比如窗口被遮挡又解除时,windows自动触发无效区域(并带上擦除标记),然后发送WM_PAINT消息,MFC封装处理此消息并调用OnDraw虚函数。BeginPaint时若区域有擦除标记会触发WM_NCPAINT and WM_ERASEBKGND重绘无效区的窗口背景(在OnDraw调用之前)。
如要手动触发重绘,调用Invalidate可把整个窗口客户区设置为无效区域并触发WM_PAINT,若Invalidate参数为TRUE则会把无效区的擦除标志设置上(这样才会触发WM_ERASEBKGND)。
所以,楼主要窗口刷白,必须先使窗口产生无效区域。调用Invalidate是最简洁方法。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询