其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

delphi 缓沖画图(内存画图)解决画图闪烁问题[1]


发布日期:2023年07月27日
 
delphi 缓沖画图(内存画图)解决画图闪烁问题[1]

很多朋友在做绘图程序的时候往往出现屏幕不停刷新产生闪烁的问题这里就告诉大家一个解决办法缓沖绘图如果有人是用取反画图解决这个问题那么在画直线的时候容易出现斑点效果不是很好如果是图片很大那么缓沖画图是解决的好办法

在网上搜索一下内存绘图或者缓沖绘图会有很多技术文章不过都是以vc或者java为主很少有pascal的代码例子不过原理都是一样的大家可以参考他们的文章我会在最后放上转载的vc缓沖画图的文章)感谢原作者

Delphi中函数调用比较方便

OldBmp BufBmp是TbitMap

//画图方法

procedure TChartDraw(aCanvas: TCanvas);

begin

{把要画的操作放在这里}

end;

在你要画的地方用如下代码把内存中画好的内容放到你要显示的组件的canvas上这里就是canvas

Draw (BufBmpCanvas);//Draw方法就是上面那段代码

bitblt(selfCanvasHandle ClientWidth ClientHeight

selfBufBmpCanvasHandle SRCCOPY);//拷贝函数

如果要用多个缓沖用BufBmpAssign(OldBmp);做内存中图片内容复制然后在bufbmp中做进一步操作再贴到显示区简单吧

怎样在内存缓沖中画图

介绍

用双缓沖进行绘图可解决在VC中绘图时的闪烁现象

正文

用vc做程序如何画图是一个大家都很关心但是却感到很难以理解的问题因为在mfc的封装之下没有现成的画图函数供你直接调用像vb等等里面直接来个point之类的常常让人感到无从下手这两天帮人解决了一个用内存缓沖画图的问题顺便也就谈谈这些东西也算是总结

我先来解释一下在mfc里面很关键的设备环境描述符也就是所谓的DC(device context)

还是从历史来看吧dos时代我们如果要绘图必须通过一系列系统函数来启动图形环境(用过turbo pascal或者turbo c的人该还有印象吧)这之间对各种硬件的初始化参数都不相同非常的烦人常常还要查阅硬件手册那时的程序智能针对最流行的硬件来编写对不流行的就没有办法了windows操作系统为了屏蔽不同的硬件环境让编程时候不考虑具体的硬件差别采取了一系列办法设备环境描述符就是这样产生的简单的说设备描述符抽象了不同的硬件环境为标准环境用户编写时使用的是这个虚拟的标准环境而不是真实的硬件与真实硬件打交道的工作一般交给了系统和驱动程序完成(这同样解释了为什么我们需要经常更新驱动程序的问题)使用在windows图形系统(gdi而不包括direct x)上面就体现在一系列的图形DC上面我们如果要在gdi上面绘图就必须先得到图形DC的句柄(handle)然后指定句柄的基础上进行图形操作

再来回忆一下我们怎么在sdk的环境下面绘图呢我想这个大家都不太清楚吧但是确实很基础在windows的sdk环境下面我们用传统的c编写程序在需要的绘图地方(比如响应WM_PAINT消息的分支)这样做

hdc = GetDC( hwnd );

oldGdiObject = SelectObject( hdcnewGdiObject );

绘图操作

SelectObject( hdcoldGdiObject );

DeleteObject( newGdiObject );

ReleaseDC( hdc);

或者是这样

BeginPaint( hwnd&ps );//PAINTSTRUCT ps ps is a paint struct

绘图操作

EndPaint( hwnd )

这就是大概的过程我们看到了hdc(图形DC句柄)的应用在绘图的部分每一个绘图函数基本上也要用到这个句柄最后我们还必须释放它否则将严重影响性能每次我们都必须调用GetDC这个api函数得到(不能用全局变量保存结果重复使用我在后面解释)这些是最最基本的windows图形操作的方式相比dos时代简单了些但是有些概念也难理解了些vb里面的简单的point函数其实最后也是被转化为这样的方式来执行系统帮助做了很多事情

[] []

               

上一篇:delphi 缓沖画图(内存画图)解决画图闪烁问题[2]

下一篇:Delphi开发WEB应用程序打印组件[3]