WinCE下透明Label闪烁的问题及解决方案(vb.net)
2010-08-14 18:37
337 查看
之前写了一篇WINCE背景图上透明Label显示的解决方法,实际上就是在背景图片上将字体“画”上去,去除掉了标准控件不透明的丑恶面容。
随着项目的进一步开发,发现当背景图片上很多的情况下,改变某一个Label的内容时,其它的Lable跟着闪一下。在尝试各种方法后依然不能解决。在网上查下来的资料大都采用双缓冲的方法,即先在内存画板上将Label画好,然后dump到屏幕上。
具体的方法是在picturebox的Paint事件中:
1,取得picturebox的graphic句柄;
2,准备好新的bitmap,先画背景再一个一个地把Label画上去,
3,利用picturebox的graphic句柄,将第二步的bitmap画到picturebox中
具体代码如下:
我承认: 这样做的好处是效率高,显示速度快。
但是我的项目这样做之后,屏幕闪烁的问题还是没有解决呀
!!
仔细分析下来,终有成果。闪烁的根源在哪呢? 原来当需要改变某一个Label时,WINCE是这样做的:
1,稳定显示各LABEL
2,有需求改变某一LABEL内容时,调用picturebox的refresh函数,这时picturebox是先绘背景
3,当执行到paint事件时,背景已经准备好,然后执行paint事件里用户的画图命令
。
这样问题就来了,Label在改变时,中间插了一帧干净的背景,如果背景颜色和其它LABEL颜色差别很大的话,闪烁更厉害。
所以解决的思路就是避免插入干净的背景,而是直接将带有Label内容的背景画出来,这样才是解决闪烁问题的关键!
具体的做法是在执行picturebox refresh()之前,创建
带有Label
字的bitmap背景,然后将picturebox的image属性换成这个bitmap背景。
具体做法如下(在上一篇blog<wince下透明Label的实现>基础上):
1,去掉picturebox paint事件,orimap是纯背景
2,增加新函数UpdateShow(),取代PictureBox1.refresh()
OK,这样每次画的背景都带有Label内容,如果Label内容不变,屏幕就不会闪啦。
下面的图是做的小实验,两个图标,一个图标内容不变,另一个图标是数字,每过1mm内容加一。
如果将双缓冲做在paint事件里,那两个图标都闪得不行
。如果将双缓冲做在paint事件之外,废掉paint事件画图
(即上面的做法),这样内容不变的Label一点都不会闪的。
随着项目的进一步开发,发现当背景图片上很多的情况下,改变某一个Label的内容时,其它的Lable跟着闪一下。在尝试各种方法后依然不能解决。在网上查下来的资料大都采用双缓冲的方法,即先在内存画板上将Label画好,然后dump到屏幕上。
具体的方法是在picturebox的Paint事件中:
1,取得picturebox的graphic句柄;
2,准备好新的bitmap,先画背景再一个一个地把Label画上去,
3,利用picturebox的graphic句柄,将第二步的bitmap画到picturebox中
具体代码如下:
Private Sub pictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Dim picboxGraphics As Graphics = e.Graphics Dim map As Bitmap = New Bitmap("/1.bmp") 'get memery graphics Dim bitmapGraphics As Graphics = Graphics.FromImage(map) 'draw to memery DrawLabel(Label1, Me, bitmapGraphics) DrawLabel(Label2, Me, bitmapGraphics) 'draw to picturebox picboxGraphics.DrawImage(map, 0, 0) 'release resource bitmapGraphics.Dispose() map.Dispose() picboxGraphics.Dispose() End Sub
我承认: 这样做的好处是效率高,显示速度快。
但是我的项目这样做之后,屏幕闪烁的问题还是没有解决呀
!!
仔细分析下来,终有成果。闪烁的根源在哪呢? 原来当需要改变某一个Label时,WINCE是这样做的:
1,稳定显示各LABEL
2,有需求改变某一LABEL内容时,调用picturebox的refresh函数,这时picturebox是先绘背景
3,当执行到paint事件时,背景已经准备好,然后执行paint事件里用户的画图命令
。
这样问题就来了,Label在改变时,中间插了一帧干净的背景,如果背景颜色和其它LABEL颜色差别很大的话,闪烁更厉害。
所以解决的思路就是避免插入干净的背景,而是直接将带有Label内容的背景画出来,这样才是解决闪烁问题的关键!
具体的做法是在执行picturebox refresh()之前,创建
带有Label
字的bitmap背景,然后将picturebox的image属性换成这个bitmap背景。
具体做法如下(在上一篇blog<wince下透明Label的实现>基础上):
1,去掉picturebox paint事件,orimap是纯背景
2,增加新函数UpdateShow(),取代PictureBox1.refresh()
Private Sub UpdateShow() Try Dim map As Bitmap = orimap.Clone 'get memery graphics Dim bitmapGraphics As Graphics = Graphics.FromImage(map) 'draw to memery DrawLabel(Label1, Me, bitmapGraphics) DrawLabel(Label2, Me, bitmapGraphics) 'load new image PictureBox1.Image = map PictureBox1.Refresh() 'release resource bitmapGraphics.Dispose() map.Dispose() Catch ex As Exception End Try End Sub
OK,这样每次画的背景都带有Label内容,如果Label内容不变,屏幕就不会闪啦。
下面的图是做的小实验,两个图标,一个图标内容不变,另一个图标是数字,每过1mm内容加一。
如果将双缓冲做在paint事件里,那两个图标都闪得不行
。如果将双缓冲做在paint事件之外,废掉paint事件画图
(即上面的做法),这样内容不变的Label一点都不会闪的。
相关文章推荐
- vb.net中利用双缓冲绘图技术解决listview加载数据闪烁的问题
- [VB.NET]切换窗口时屏幕闪烁的问题
- 使用VB.NET遇到的若干问题及解决方案
- iis配置asp.net常见问题解决方案
- vb.net中使用GetPrivateProfileString访问INI文件,解决中文路径问题
- SurfaceView绘制触摸轨迹闪烁问题的最终解决方案
- asp.net ajax updatepanel中textbox 乱码问题 解决方案
- VB.NET中时间转换问题
- 关于 VB.NET 中 Obsolete 特性的问题
- Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案
- [转]VC 界面闪烁问题 几种解决方案
- vb.net 通过app.config来改变编译路径的问题
- 解决跨域读写Cookies的问题,(ASP、PHP、ASP.NET、JSP)解决方案
- ASP.NET Session丢失问题原因及解决方案
- Vb.net窗口调用问题
- IIS服务器下,用asp.net访问Access数据库遇到的路径问题解决方案
- asp.net(VB)传递参数时出现中文乱码的问题
- [VB.NET].net 2003 Framework 1.1 文件上传问题(webServer和fileServer的用户名、密码不同)
- [VB.NET]datagridview 问题
- [VB.NET]简单的DATAGREIDVIEW问题