可以代替窗体Refresh方法的函数
2005-04-16 00:13
483 查看
VB中打开AutoRedraw可方便的建立双缓冲,利用API在后台绘图,最后一次性整体更新到前台,实现稳定无闪烁的动画效果,一般情况下,VB会自动进行后台到前台的刷新,这主要有两种情况:
1、收到WM_PAIT消息
2、代码调用Refresh方法
能让VB收到WM_PAIT消息的情况主要有
1、窗体被遮盖或隐藏后重现
2、调用任何VB内部的图形方法,包括PaintPicture、Print、Cls、Line、Circle、Pset
3、调用一些与图形方法有关的特殊方法,如:Point、TextWidth、TextHeight
可见让VB自动更新的机会是很多的,也许我们可以不必关心前台更新的问题,但有此类设计经验的朋友,一定注意到了:如果绘图中没有用到任何VB自己的图形方法,采用纯API绘图,或者做一个连续动画,又不便插入Doevents时,前台会得不到更新。这样我们绘了半天,却没看到内容。
Form及PictureBox都有Refresh方法就是为了解决这种情况而设计的,不过,Refresh方法有时会觉得比较浪费,例如,做一个物体移动动画时,只是不断绘制物体相关的一小块区域,可Refresh方法不管你在后台改写了多少内容,哪怕只是很小一块区域,它也是整个客户区的整体重绘,这种速度自然会慢下来。
下面这个函数就是为代替Refresh方法而写的,在全区刷新时,它比Refresh方法略快一点,但若用于局部刷新,它就会快很多很多了。
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Public Sub BoxRefresh(dhwd As Long, dHdc As Long, X As Long, y As Long, w As Long, h As Long)
Dim fdc As Long
fdc = GetDC(dhwd)
BitBlt fdc, X, y, w, h, dHdc, X, y, vbSrcCopy
ReleaseDC dhwd, fdc
End Sub
我的机器上1024*768*32时窗体最大化,用Refresh方法3000次,用时需8秒多,但若只更新100X100的区域,Refresh方法能做的还是全屏更新,用上面的BoxRefresh,只需78毫秒。
1、收到WM_PAIT消息
2、代码调用Refresh方法
能让VB收到WM_PAIT消息的情况主要有
1、窗体被遮盖或隐藏后重现
2、调用任何VB内部的图形方法,包括PaintPicture、Print、Cls、Line、Circle、Pset
3、调用一些与图形方法有关的特殊方法,如:Point、TextWidth、TextHeight
可见让VB自动更新的机会是很多的,也许我们可以不必关心前台更新的问题,但有此类设计经验的朋友,一定注意到了:如果绘图中没有用到任何VB自己的图形方法,采用纯API绘图,或者做一个连续动画,又不便插入Doevents时,前台会得不到更新。这样我们绘了半天,却没看到内容。
Form及PictureBox都有Refresh方法就是为了解决这种情况而设计的,不过,Refresh方法有时会觉得比较浪费,例如,做一个物体移动动画时,只是不断绘制物体相关的一小块区域,可Refresh方法不管你在后台改写了多少内容,哪怕只是很小一块区域,它也是整个客户区的整体重绘,这种速度自然会慢下来。
下面这个函数就是为代替Refresh方法而写的,在全区刷新时,它比Refresh方法略快一点,但若用于局部刷新,它就会快很多很多了。
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Public Sub BoxRefresh(dhwd As Long, dHdc As Long, X As Long, y As Long, w As Long, h As Long)
Dim fdc As Long
fdc = GetDC(dhwd)
BitBlt fdc, X, y, w, h, dHdc, X, y, vbSrcCopy
ReleaseDC dhwd, fdc
End Sub
我的机器上1024*768*32时窗体最大化,用Refresh方法3000次,用时需8秒多,但若只更新100X100的区域,Refresh方法能做的还是全屏更新,用上面的BoxRefresh,只需78毫秒。
相关文章推荐
- 一个pl/sql中可以代替游标的写法(用这种方法也可以实现象sql中top的效果)
- PDO 查询可以使用的函数方法和常规属性
- VC++ 获取窗体句柄,并发送键盘消息(这种方法也可以打开某些应用程序)
- 比较两个字符串的大小(两种方法,重点在介绍数组元素可以作为函数的实参)
- 父类的正常成员函数子类可以使用,并不是继承下来 的,子类是怎么调用父类的函数 : 可能是利用了一种叫函数名联编的方法.没有隐藏的情况下用函数名字来决定调用的函数.
- void prinT(Test *pT)//这个函数 这里为什么要用 我完全可以用t3.print()这样来调用类里面函数方法就可以,为何多此一举来这样一步???
- 实现一个函数,可以左旋字符串中的k个字符。(三种方法)
- 方法或函数也可以用泛型
- 有关指针函数不可以返回局部变量的地址的三种解决方法
- 笨方法学习Python 习题21 函数可以返回东西 ---学习记录
- 如何用最简单最快的方法判断一个BMP图片是否为黑白图片?我现在是全图片scanline 然后再加以分析,太慢了,有没有直接的函数可以做到呢?
- 笨方法学习Python-习题21: 函数可以返回东西
- 文档显示部件:用word查看方法在word中直接显示文档显示部件中的内容,并可以设置是否允许修改word内容。 True:不允许修改word内容;false:允许修改word内容。 实例应用:在窗体
- JavaScript中的常见函数字符串可以调用的方法(2)
- # include <errno.h >查看错误代码errno是调试程序的一个重要方法。当Linux C API函数发生异常时,一般会将errno变量赋值一个整数,不同的值表示不同的含义,可以通过查看
- 使用json来定义函数,在里面可以定义多个函数的实现方法
- 函数里写函数;函数是对象,也可以给他添加方法
- 使用SendMessage方法对窗体上的控件进行截图,该方法的思想就是把控件的句柄拿到,对控件发送WM_PAINT消息,并且把希望得到图形对象的句柄当作wParam参数传过去,这样就可以在图形对象得到想要得图形。
- sql语句中一种可以代替like查询语句的效率较高的查询关键字的方法
- jqGrid 加载完jqGrid之后可以执行函数的方法