哪位大侠能给提供一个DELPHI双缓冲绘图的例子 ( 积分: 200 )

  • 主题发起人 主题发起人 popoaleck
  • 开始时间 开始时间
P

popoaleck

Unregistered / Unconfirmed
GUEST, unregistred user!
原理我明白,现在就是想找个例子参考一下.另外是用控件做好还是用WINDOWS API做好?
 
都不好,自建一个canvas,画好再复制到窗口或控件的canvas是最好的办法,版本兼容性
最好,避免仅限于Win32的麻烦
 
bmpView:=TBitmap.Create;
bmpView.Canvas.Draw(...)
Form1.Canvas.Draw(bmpView...)
 
应该怎样建Canvas? 怎样将其复制到其它控件的Canvas中? 另外很多控件都有Canvas属性应该用哪个比较好?
 
wincontrol.DoubleBuffered := true;
使用image, image放在panel中,panel的doubleBuffered设置成true;
自己建立一个bitmap,宽度和高度与image一致,在bitmap的canvas画好图,然后向image上贴全图就可以了,不会有闪烁
 
不用找例子,TWinControl 源码中的 WMPaint 过程就是一个很好的例子。它用双缓冲的意义仅仅是响应 Paint 事件时不至于闪烁。你可以稍微修改一下,去掉无用的代码:
procedure TWinControl.WMPaint(var Message: TWMPaint);
var
DC, MemDC: HDC;
MemBitmap, OldBitmap: HBITMAP;
begin
if Assigned(Parent) and Parent.DoubleBuffered then
begin
inherited;
exit;
end;
DC := GetDC(0);
MemBitmap := CreateCompatibleBitmap(DC, Width, Height);
ReleaseDC(0, DC);
MemDC := CreateCompatibleDC(0);
OldBitmap := SelectObject(MemDC, MemBitmap);
try
DC := Message.DC;
在这里向 MemDC 上画图...
BitBlt(DC, 0, 0, Width, Height, MemDC, 0, 0, SRCCOPY);
finally
SelectObject(MemDC, OldBitmap);
DeleteDC(MemDC);
DeleteObject(MemBitmap);
end;
end;
如果你写的是一个画图的控件,那么你可以用一个预先定义好的 Bitmap 替换上面动态生成的 Bitmap,因为即时生成和销毁 Bitmap 要耗费很多系统资源,闪到是不闪了,拖动时会产生延迟...
 
myBITMAP:=TBITMAP.Create; //这里myBITMAP最好是全局变量共享,提高速度
myBITMAP.Width:= //宽度
myBITMAP.Height:= //高度
myBITMAP.PixelFormat := //颜色深度
myBITMAP.canvas.lock; //全局应用就要暂时锁定它为私用
//这里开画,总之canvas有什么功能,能用的都用就是了
formcanvas.copyrect(formrect,myBITMAP,myrect); //复制到控件或者窗体
myBITMAP.canvas.unlock; //解锁
 
收藏~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
明白了,前些天在网上看到一篇文章说Image控件本身就使用的是双缓冲作图.我自己试的结果是如果将transparent属性设为true再画图就会闪得很厉害.
 
多人接受答案了。
 
后退
顶部