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

是这样的,我写了一个绘图程序,为了让我在改变窗口大小时,窗口的图形仍能不变,我改写了OnDraw函数。然后是这样的,现在我想加上一个新建按钮,也就是说将整个客户区(视区窗... 是这样的,我写了一个绘图程序,为了让我在改变窗口大小时,窗口的图形仍能不变,我改写了OnDraw函数。然后是这样的,现在我想加上一个新建按钮,也就是说将整个客户区(视区窗口)刷白,然后重新绘图。
但是OnDraw函数已经被我改写了,也就是重定义了,于是我设置了一个bool类型的变量,用if语句控制我在OnDraw函数里面加的代码是否执行。当我点击新建按钮时,相应函数会调用OnDraw函数,但是由于那个bool变量控制,我加上的代码不会执行。所以OnDraw函数还是按照原来的方式执行,也就是重绘窗口。
这按道理来说应该没有问题,但是我的却怎么也不行,请大神看看,到底问题出在哪里了,如果想看源代码,我可以马上发过去。
展开
 我来答
loboho
2012-11-21 · TA获得超过506个赞
知道小有建树答主
回答量:441
采纳率:100%
帮助的人:409万
展开全部
楼主的意思不是太明白,我猜测是楼主误以为OnDraw是会不断被调用的吧,并且调OnDraw时背景都会先自动擦除的吧,事实并非如此。

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

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

所以,楼主要窗口刷白,必须先使窗口产生无效区域。调用Invalidate是最简洁方法。
zcy990718
2012-11-20 · TA获得超过1.2万个赞
知道大有可为答主
回答量:1.2万
采纳率:66%
帮助的人:1527万
展开全部
你可以通过BOOL形变量控制显示的方式,修改为BOOL变量后,调用Invalidate即可
追问
我还想问问的就是,我的程序明明显式调用了OnDraw函数,但是为什么没有起到重绘刷白的效果呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式