大家帮忙看看这段代码!!!(50分)

  • 主题发起人 主题发起人 frankxu
  • 开始时间 开始时间
F

frankxu

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟最近研究怎样编写图形控件过程中对下面这段代码不是很明白,大家帮忙分析一下!

procedure TParView.DrawFast;
var
destdc, memdc: HDC; bm, sbm: HBITMAP;
begin
destdc := Canvas.Handle;
memdc := CreateCompatibleDC(destdc);
bm := CreateCompatibleBitmap(destdc, Width, Height);
sbm := SelectObject(memdc, bm);
Canvas.Handle := memdc;
Draw;//画图形的函数
BitBlt(destdc,0,0, Width,Height, memdc,0,0, SRCCOPY);
SelectObject(memdc, sbm);
DeleteObject(bm);
Canvas.Handle := destdc;
DeleteDC(memdc);
end;

这个函数作用好象是能够快速重画canvas上的图形(图形在不断变化)!
因为没有什么注解说明,小弟不是很明白这段代码的具体作用是什么,它又是如何实现的,还请高人多多指点!
 
csdn不行
这里应该可以吧
帮你up:)
 
就是先在内存中画,然后复制到画布上
 
//快速绘制交换两张图片的过程;不知道我注释的对不对,请高手指点
procedure TParView.DrawFast;
var
destdc, memdc: HDC; bm, sbm: HBITMAP;
begin
destdc := Canvas.Handle;//设备描述表
memdc := CreateCompatibleDC(destdc);//内存描述表
bm := CreateCompatibleBitmap(destdc, Width, Height);内存位图
sbm := SelectObject(memdc, bm);//把第一张位图选入内存
Canvas.Handle := memdc;//赋给窗体设备
Draw;//画图形的函数
BitBlt(destdc,0,0, Width,Height, memdc,0,0, SRCCOPY);//将内存设备环境中的位图拷贝到设备环境
SelectObject(memdc, sbm);//把第二张位图选入内存
DeleteObject(bm);//释放第一张位图
Canvas.Handle := destdc;//给窗体设备
DeleteDC(memdc);//释放内存设备
end;
 
这里都直接使用了WINAPI,你可以看看WINAPI的帮助
 
我的理解:这段程序是先在内存位图中将图形画好,然后快速输出到窗口DC中显示。
这样做的好处是:窗口重画刷新很快(但在内存位图中准备的还是要时间),基本上没有闪烁。
procedure TParView.DrawFast;
var
destdc, memdc: HDC; bm, sbm: HBITMAP;
begin
destdc := Canvas.Handle;//保存窗口DC
memdc := CreateCompatibleDC(destdc);
bm := CreateCompatibleBitmap(destdc, Width, Height);
sbm := SelectObject(memdc, bm);
Canvas.Handle := memdc;//这里改了窗口DC,也就是说,原来是直接在屏幕上画,现在是往内存位图里画
Draw;//画图形的函数
BitBlt(destdc,0,0, Width,Height, memdc,0,0, SRCCOPY);//将内存设备环境中的位图快速拷贝到屏幕上
SelectObject(memdc, sbm);
DeleteObject(bm);
Canvas.Handle := destdc;//恢复原来的窗口DC
DeleteDC(memdc);//释放
end;
DELPHI的窗体的DoubleBuffer就是这样做的。
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
595
import
I
I
回复
0
查看
612
import
I
I
回复
0
查看
614
import
I
I
回复
0
查看
771
import
I
后退
顶部