WINCE下窗口界面闪烁的问题
来源:互联网 发布:qb下载软件 编辑:程序博客网 时间:2024/05/21 09:03
WINCE下窗口界面闪烁的问题
http://blog.csdn.net/lanyzh0909/archive/2010/09/29/5913836.aspx
在做界面开发时,相信大家都遇到过界面闪烁问题。一般有一下几种情况:
1、 移动窗口
2、 在窗口上绘制大量的图片
3、 在绘制子窗口
以上3种情况是窗口出现闪烁概率比较高(不是说一定会出现,主要看CPU的处理速度)。
第一种情况,在移动窗口时系统会先给窗口发送一个WM_ERASEBKGND之后才是WM_PAINT 消息。我们只要在处理WM_ERASEBKGND消息直接返回就可以了。
LRESULT WndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
switch(wMsg)
{
……………………………
case WM_ERASEBKGND:
return 0;
…………………………….
}
return DefWindowProc(hWnd,wMsg,wParam,lParam);
}
第二种情况,在绘制大量图片时如果CPU处理速度不够的话就会出现窗口闪烁。这种情况,我们可以采用双缓存机制。首先,我们可以在内存DC然后把图片先绘制到内存DC上最后将内存DC复制到窗口DC上。
//Create a DC that matches the device
m_hdcMem = CreateCompatibleDC(hdc);
if(m_hdcMem == NULL)
{
return;
}
m_hBitmap = CreateCompatibleBitmap(hdc,m_Size.cx,m_Size.cy);
if(m_hBitmap == NULL)
{
return;
}
//Select the bitmap into to the compatible device context
m_hOldSel = SelectObject(m_hdcMem,m_hBitmap);
……………
//将图片绘制到m_hdcMem上
……………
//将m_hdcMem复制到hdc上
BitBlt(hdc,0,0,size.cx,size.cy,m_hdcMem,0,0,SRCCOPY);
SelectObject(m_hdcMem,m_hOldSel);
DeleteObject(m_hBitmap);
DeleteDC(m_hdcMem);
第三种情况,当窗口拥有子窗口时系统先将WM_PAINT 发送到父窗口消息队列中,父窗口处理完WM_PAINT后系统才发送到子窗口消息队列中。如果CPU的处理速度不够的话就必将出现窗口闪烁。这情况,我们必须在绘制父窗口时将子窗口中的内容绘制到父窗口上。
//Create a DC that matches the device
m_hdcMem = CreateCompatibleDC(hdc);
if(m_hdcMem == NULL)
{
return;
}
m_hBitmap = CreateCompatibleBitmap(hdc,m_Size.cx,m_Size.cy);
if(m_hBitmap == NULL)
{
return;
}
//Select the bitmap into to the compatible device context
m_hOldSel = SelectObject(m_hdcMem,m_hBitmap);
………………
//绘制子窗口到m_hdcMem
……………
//将m_hdcMem复制到hdc上
BitBlt(hdc,0,0,size.cx,size.cy,m_hdcMem,0,0,SRCCOPY);
SelectObject(m_hdcMem,m_hOldSel);
DeleteObject(m_hBitmap);
DeleteDC(m_hdcMem);
编译运行后发现还是有闪烁的情况,怎么回事?仔细查看开发文档,发现有这么一句话:
All windows implicitly have the WS_CLIPSIBLINGS and WS_CLIPCHILDREN styles。
意思说,在WINCE 下所有的窗口都WS_CLIPSIBLINGS 和WS_CLIPHILDREN属性。所以在绘制父窗口时,先将子窗口隐藏,绘制完后再显示子窗口。
备注:
WS_CLIPCHILDREN:当在父窗口内绘图时,排除子窗口区域。在创建父窗口时使用这个风格。
WS_CLlPBLINGS:排除子窗口之间的相对区域,也就是,当一个特定的窗口接收到WM_PAINT消息时,WS_CLIPSIBLINGS 风格将所有层叠窗口排除在绘图之外,只重绘指定的子窗口。如果未指定WS_CLIPSIBLINGS风格,并且子窗口是层叠的,则在重绘子窗口的客户区时,就会重绘邻近的子窗口。
- WINCE下窗口界面闪烁的问题
- WINCE下窗口界面闪烁的问题
- Wince .net ListView控件 闪烁的问题
- WinCE下透明Label闪烁的问题及解决方案(vb.net)
- WINCE下窗口的创建
- WINCE下窗口的创建
- 解决游戏界面闪烁的问题
- 对话框子窗口闪烁的问题
- 解决窗口闪烁问题
- 窗口刷新闪烁问题
- 在WinCE下绘制半透的效果要注意的问题+WINCE 下创建动态显示图片窗口
- 有关wince下校准界面的修改
- 最小化的窗口闪烁
- 解决vc界面闪烁问题
- MFC界面避免闪烁问题
- 解决WinForm界面闪烁问题
- ShowWindow(SW_HIDE)窗口闪烁问题
- 解决Windows 程序界面闪烁问题的一些经验
- 使用QEMU仿真ARM Linux系统
- GB50052-2009供配电系统设计规范1
- Widgets for GWT platform
- 实验室电击
- C预处理器中 ##(两个井号)和#(一个井号)都是什么意思
- WINCE下窗口界面闪烁的问题
- GridView、Repeater等数据控件列数字、货币和日期的显示格式
- linux里命令pkg-config工具的使用
- boost库关于信号量的描述
- 键盘自动弹出解决
- ORACLE 监听动态注册与静态注册
- Sencha的MVC模式实践
- SD卡,文件操作,记录日志
- SDK-RMIOS 1.1--1.6