OnEraseBkGnd()

news/2024/7/7 15:56:07 标签: dialog, function, mfc, 图形

在OnEraseBkGnd中,如果你不调用原来缺省
的OnEraseBkGnd只是重画背景则不会有闪烁.而在OnPaint里面,
由于它隐含的调用了OnEraseBkGnd,而你又没有处理OnEraseBkGnd
函数,这时就和窗口缺省的背景刷相关了.缺省的
OnEraseBkGnd操作使用窗口的缺省背景刷刷新背景(一般情况
下是白刷),而随后你又自己重画背景造成屏幕闪动.
另外一个问题是OnEraseBkGnd不是每次都会被调用的.如果你
调用Invalidate的时候参数为TRUE,那么在OnPaint里面隐含
调用BeginPaint的时候就产生WM_ERASEBKGND消息,如果参数
是FALSE,则不会重刷背景.

所以解决方法有三个半:
1.用OnEraseBkGnd实现,不要调用原来的OnEraseBkGnd函数.
2.用OnPaint实现,同时重载OnEraseBkGnd,其中直接返回.
3.用OnPaint实现,创建窗口时设置背景刷为空
4.用OnPaint实现,但是要求刷新时用Invalidate(FALSE)这样
的函数.(不过这种情况下,窗口覆盖等造成的刷新还是要闪一
下,所以不是彻底的解决方法)
都挺简单的.
------------------------------------------------------
在MFC中 任何一个window组件的绘图 都是放在这两个member function
在设定上 OnEraseBkgnd()是用来画底图的 而OnPaint()是用来画主要对象的
举例说明 一个按钮是灰色的 上面还有文字
则OnEraseBkgnd()所做的事就是把按钮画成灰色
而OnPaint()所做的事 就是画上文字

既然这两个member function都是用来画出组件的
那为何还要分OnPaint() 与 OnEraseBkgnd() 呢
其实OnPaint() 与 OnEraseBkgnd() 特性是有差的
1. OnEraseBkgnd()的要求是快速 在里面的绘图程序最好是不要太耗时间
因为 每当window组件有任何小变动 都会马上呼叫OnEraseBkgnd()
2. OnPaint() 是只有在程序有空闲的时候才会被呼叫
3. OnEraseBkgnd() 是在 OnPaint() 之前呼叫的
所以 OnPaint()被呼叫一次之前 可能会呼叫OnEraseBkgnd()好几次


如果我们是一个在做图形化使用者接口的人
常会需要把一张美美的图片设为我们dialog的底图
把绘图的程序代码放在OnPaint() 之中 可能会常碰到一些问题
比方说拖曳一个窗口在我们做的dialog上面一直移动
dialog会变成灰色 直到动作停止才恢复
这是因为每次需要重绘的时候 程序都会马上呼叫OnEraseBkgnd()
OnEraseBkgnd()就把dialog画成灰色
而只有动作停止之后 程序才会呼叫OnPaint() 这时才会把我们要画的底图贴上去


这个问题的解法 比较差点的方法是把OnEraseBkgnd() 改写成不做事的function
如下所示
BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
以上本来是会呼叫CDialog::OnEraseBkgnd() 但是如果我们不呼叫的话
程序便不会画上灰色的底色了


比较好的做法是直接将绘图的程序从OnPaint()移到OnEraseBkgnd()来做
如下所示

// m_bmpBKGND 为一CBitmap对象 且事先早已加载我们的底图
// 底图的大小与我们的窗口client大小一致


 

特别要注意的是 取得重画大小是使用GetUpdateRect() 而不是GetClientRect()
如果使用GetClientRect() 会把不该重画的地方重画


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/newusb/archive/2009/11/18/4830054.aspx


http://www.niftyadmin.cn/n/1310434.html

相关文章

C51中的INTRINS.H:内部函数

C51中的INTRINS.H:内部函数 2007年05月14日 星期一 17:02INTRINS.H:内部函数 函数名: _crol_,_irol_,_lrol_ 原 型: unsigned char _crol_(unsigned char val,unsigned char n); unsigned int _irol_(unsig…

python学习手册笔记——38.装饰器

00.装饰是未函数和类指定管理代码的一种方式。装饰器本身的形式是处理其他的可调用对象的可调用的对象。*函数装饰器在函数定义的时候进行名称重绑定,提供一个逻辑层来管理函数和方法或随后对它们的调用。*类装饰器在类定义的时候进行名称重绑定,提供一个…

PCA-SIFT GLOH

SIFT 后来有两种扩展,都用到PCA的概念。1 PCA-SIFT PCA-SIFT与标准SIFT有相同的亚像素位置(sub-pixel ),尺度(scale)和主方向(dominant orientations),但在第4步计算描…

art-template 模版引擎

模版引擎是第三方模块 可以让开发着以更友好的方式拼接字符串,使项目代码更加清晰,更加易于维护。 art-template 模版引擎 使用命令行工具 输入 npm i art-template 进行安装使用const template require(art-template) 引入模版引擎 告诉模版引擎要拼接…

房贷计算器——新增选择还款方式

房贷计算器——新增选择还款方式 #!/usr/bin/env python # coding: utf-8# In[4]: 文字‘房贷计算器’ 文字‘贷款总金额’:输入框 文字‘贷款期限’:输入框 文字‘年利率’:输入框 按钮‘开始计算’ 返回: 月供 总利息 from tki…

去除jquery.min.map 404错误信息

调试中出现了 jquery.min.map 404 (Not Found) 的js错误信息; 那么jquery.min.map到底是个什么呢? JQuery 官方解释 从 jQuery 1.9.0 版本后在原始代码里会有 sourceMappingURLjquery.min.map 什么是Source map 简单说,Source map就是一个信息…

【解题报告】饭卡(dp)

解题报告——饭卡 问题描述   Time Limit: 1000msMemory Limit: 32768KB64-bit integer IO format: %I64d Java class name: Main电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等…

从哈佛管理世界中看到这样一篇小文

一:沉稳 (1)不要随便显露你的情绪。 (2)不要逢人就诉说你的困难和遭遇。 (3)在征询别人的意见之前,自己先思考,但不要先讲。 (4&#xf…