MFCOnPaint被不断调用的问题

本人最近在开发一个绘图程序,需用到OnPaint。虽说MFC也用了比较久了,但对OnPaint还是理解不深。在OnPaint中我把 CPaintDC dc(this); 注释掉了。然后自己手动获取 CDC 进行操作。导致OnPaint被不断的调用。导致这个问题的原因就是不应该把 CPaintDC dc(this); 注释掉。要使用它。

创新互联"三网合一"的企业建站思路。企业可建设拥有电脑版、微信版、手机版的企业网站。实现跨屏营销,产品发布一步更新,电脑网络+移动网络一网打尽,满足企业的营销需求!创新互联具备承接各种类型的做网站、网站建设项目的能力。经过10年的努力的开拓,为不同行业的企事业单位提供了优质的服务,并获得了客户的一致好评。

因为CPaintDC dc(this); 的构造,析构里调用了CWnd::BeginPaint、CWnd::EndPaint 。具体如下:

CPaintDC的独到之处就在于,它在构造函数中调用了 CWnd::BeginPaint在析构时调用了CWnd::EndPaint,而且它只能响应WM_ONPAINT消息。而这个BeginPaint会 发送WM_ONERASEBKGND消息,因此,它只擦除指定的背景并重画,不影响对话框内的其他控件。值得注意的是,在这操作之后不要再调用 CDialog::Onpaint函数。

而之前的方法之所以不成功是因为:

BeginPaint() 和EndPaint() 可以删除消息队列中的WM_PAINT消息,并使无效区域有效。
GetDC()和ReleaseDC()并不删除也不能使无效区域有效,因此当程序跳出 WM_PAINT 时 ,无效区域仍然存在。系统就回不断发送WM_PAINT消息,于是程序不断处理WM_PAINT消息。其中无效区域是指需要重画的区域,无效的意思是:当前内容是旧的,过时的。

只 有当一个窗口消息空闲时,系统才会抽空检查一下这个窗口的无效区域是否为非空(WM_PAINT的优先级是最低的。这也就是为什么系统很忙时窗口和桌面往 往会出现变白、刷新不了、留拖拽痕迹等现象的原因),如果非空,系统就发送WM_PAINT。所以一定要用BeginPaint、EndPaint把无效 区域设为空,否则WM_PAINT将一直被发送。

新闻名称:MFCOnPaint被不断调用的问题
文章起源:https://www.cdcxhl.com/article44/ijdihe.html

成都网站建设公司_创新互联,为您提供定制开发虚拟主机软件开发网页设计公司ChatGPT网站内链

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

微信小程序开发