WINCE MFC 自绘控件的WM_PAINT与WM_ERASEBKGND、WM_TIMER 问题总结
来源:互联网 发布:百度知道关注软件 编辑:程序博客网 时间:2024/06/05 23:44
MFC的控件简直丑陋无比,因此往往会使用贴图的方式进行。于是自己也尝试开发一套UI控件。那么在把控件运用到APP的时候发现有刷新的问题。
一.WM_PAINT消息问题
一般情况我是认为通过重载PreTranslateMessage可以截获所有的WM_XX消息,但是我错。
通过调试我发现,
1.在 xxxx::OnInitDialog() 调用之后,会先触发xxxxx::OnEraseBkgnd(CDC* pDC)函数 再触发 xxxx::OnPaint() 函数,并且在PreTranslateMessage里面是无法截取到WM_PAINT消息的;
2.当有其他窗口覆盖后,就能够在PreTranslateMessage中截获到WM_PAINT消息;
二、WM_ERASEBKGND消息问题
正如我所说,以为PreTranslateMessage可以截获到所有消息,其实不然WM_ERASEBKGND消息无法在PreTranslateMessage获取到,只能通过添加函数消息绑定的方式,来得要刷新背景的请求,即添加了XXXX:OnEraseBkgnd(CDC* pDC)函数。
为什么要处理这个刷新背景呢,主要是通过在XXXX:OnEraseBkgnd(CDC* pDC) 函数,中直接返回TRUE值,让系统不刷新背景,从而保证使用自己的绘制背景,另一方面也增加刷新速度。试想一下,假设在很短的时间内进行全屏刷新,那得多慢呀!!!
三、WM_TIMER问题
由于自己使用的GetDC的方式进行,所以接收到在PreTranslateMessage中收到WM_PAINT消息的,没有调用
CPaintDC dc(this);
或者
PAINTSTRUCT ps;
BeginPaint(m_hMainWnd,&ps);
EndPaint(m_hMainWnd,&ps);
从而促使系统认为一直处于窗口无效需要刷新,导致系统一直在狂发送WM_PAINT消息给窗口,进而导致WM_TIMER,无法触发。(WM_PAINT与WM_TIMER在系统中都属于低优先级的消息)。所以,很容易误认为在PreTranslateMessage函数中也是无法获取到WM_TIMER消息的。
来自:http://blog.csdn.net/lan120576664
- WINCE MFC 自绘控件的WM_PAINT与WM_ERASEBKGND、WM_TIMER 问题总结
- WM_PAINT与WM_ERASEBKGND
- WM_PAINT与WM_ERASEBKGND补充
- WM_PAINT与WM_ERASEBKGND
- WM_PAINT与WM_ERASEBKGND
- WM_PAINT与WM_ERASEBKGND
- WM_PAINT 与 WM_ERASEBKGND
- WM_PAINT与WM_ERASEBKGND
- WM_PAINT与WM_ERASEBKGND补充
- 关于WM_PAINT(OnPaint)及WM_TIMER的小问题
- WM_PAINT, WM_NCPAINT, WM_ERASEBKGND的关系
- WM_PAINT WM_ERASEBKGND
- MFC与SDK中的重画问题 。。WM_PAINT消息的处理
- WM_PAINT、WM_ERASEBKGND、InvalidateRect、Invalidate之间的关系
- WM_PAINT 和 WM_ERASEBKGND 消息的区别
- 关于WM_ERASEBKGND和WM_PAINT的深刻理解
- 关于WM_ERASEBKGND和WM_PAINT的深刻理解
- WM_PAINT 和 WM_ERASEBKGND 消息的区别 .
- 关于C语言中的文件操作
- 把光标放在EditText中文本最后
- 找实习之前看了些东西,觉得有必要了解的。
- chrome 浏览器安装 adblock(屏蔽广告的插件)
- 【Leetcode】Two sum(easy)
- WINCE MFC 自绘控件的WM_PAINT与WM_ERASEBKGND、WM_TIMER 问题总结
- 网页端播放音频
- JavaSE入门学习42:文件传输基础之I/O流(一)
- 【程序人生】:对于大学教育的一点看法
- 后缀平衡树 bzoj3682 Phorni
- java中static
- android 代码控制隐藏
- 旋转数组的最小数字(非递减数组)
- 数据库的范式和安全保护