双缓冲绘图技术
更新时间:2023-11-05 10:57:01 阅读量: 综合文库 文档下载
双缓冲绘图技术.txt7温暖是飘飘洒洒的春雨;温暖是写在脸上的笑影;温暖是义无反顾的响应;温暖是一丝不苟的配合。8尊重是一缕春风,一泓清泉,一颗给人温暖的舒心丸,一剂催人奋进的强心剂由双缓冲绘图技术谈起到Delphi源码实现
摘要:双缓冲绘图技术在Delphi中的实现
关键字:Delphi,双缓冲,Canvas
作者:上海翰博数码科技实业有限公司 沈小云
说明:假设读者熟悉VCL
双缓冲绘图也不是什么新技术,简单的说:在绘图实现时不直接绘在窗口上,而是先绘在内存里,再一起“拷贝”至窗口。实现起来也不复杂,创建一兼容HDC,在此兼容HDC上绘图,最后拷贝到窗口HDC就行了。本人前段时间把一C++实现该技术的代码改成了Delphi代码,都是用Win32API写的。今改成了使用Delphi自带的类,试了一下(窗口类Canvas与TImage的Canvas)。实现方式大同小异,但不得不提的是在窗口中直接使用Canvas绘图与TImage.Canvas却不相同。使用TImage.Canvas绘图时,自动使用了双缓冲技术,而窗口的Canvas对像却未实现。怎么回事呢?看一下代码吧,“源码面前没有秘密”!
一.TImage类的Canvas
TImage = class(TGraphicControl) ...
property Canvas: TCanvas read GetCanvas; ...
function TImage.GetCanvas: TCanvas; var
Bitmap: TBitmap;
begin
if Picture.Graphic = nil then
begin
Bitmap := TBitmap.Create;
try
Bitmap.Width := Width;
Bitmap.Height := Height;
Picture.Graphic := Bitmap;
finally
Bitmap.Free;
end;
end;
if Picture.Graphic is TBitmap then
Result := TBitmap(Picture.Graphic).Canvas
else
raise EInvalidOperation.Create(SImageCanvasNeedsBitmap); end;
可知TImage.Canvas来自Bitmap.Canvas,好,那来看看TBitmap.Canvas
function TBitmap.GetCanvas: TCanvas;
begin
if FCanvas = nil then
begin
HandleNeeded;
if FCanvas = nil then // possible recursion
begin
FCanvas := TBitmapCanvas.Create(Self);
FCanvas.OnChange := Changed;
FCanvas.OnChanging := Changing;
end;
end;
Result := FCanvas; end;
显而易见TBitmap.Canvas = TBitmapCanvas.Create;也就是说TImage.Canvas=TBitmapCanvas.Create.即使用TImage.Canvas绘图时,实际是在TBitmapCanvas上绘图的。让我们再来看看TBitmapCanvas类:
TBitmapCanvas = class(TCanvas)
private
FBitmap: TBitmap;
FOldBitmap: HBITMAP;
FOldPalette: HPALETTE;
procedure FreeContext;
protected
procedure CreateHandle; override;
public
constructor Create(ABitmap: TBitmap);
destructor Destroy; override;
end;
关注一下CreateHandle函数:
procedure TBitmapCanvas.CreateHandle; var
H: HBITMAP;
begin
if FBitmap <> nil then
begin
Lock;
try
FBitmap.HandleNeeded;
DeselectBitmap(FBitmap.FImage.FHandle);
//!! DeselectBitmap(FBitmap.FImage.FMaskHandle);
FBitmap.PaletteNeeded;
H := CreateCompatibleDC(0);
if FBitmap.FImage.FHandle <> 0 then
FOldBitmap := SelectObject(H, FBitmap.FImage.FHandle) else
FOldBitmap := 0;
if FBitmap.FImage.FPalette <> 0 then
begin
FOldPalette := SelectPalette(H, FBitmap.FImage.FPalette, True);
RealizePalette(H);
end
else
FOldPalette := 0;
Handle := H;
BitmapCanvasList.Add(Self);
finally
Unlock;
end;
end; end;
读起来也不困难,FBitmap是Create构造函数传进来的。而我们应该关注的代码位于斜体部份,也很好理解:创建兼容DC,并选进设备。要的就是这个效果,现在知道为什么使用TImage.Canvas来绘图是使用的双缓冲技术的了吧?那么这个兼容DC是如何从内存“拷贝”到窗口的呢?
我们使用上面的分析方法,当TImage基类TGraphicControl收到WM_PAINT消息时,将执行下面的代码:
procedure TGraphicControl.WMPaint(var Message: TWMPaint);
begin
正在阅读:
双缓冲绘图技术11-05
2022年河北工业大学化工学院750物理化学(Ⅰ)考研核心题库04-20
C语言课程设计报告__个人消费管理系统06-02
《传播学教程》笔记-40P03-10
深圳市初中生物地理会考 - 生物双选题训练(有答案)10-15
时光穿梭机作文600字07-15
2012年国家公务员考试行测真题及解析(完整版) - 图文03-25
探析办公自动化系统中的安全性03-01
市委组织部部长在市直机关党组织书记2021年抓党建述职评议会议上的讲话08-22
3章 中小企业行政管理制度与表格06-15
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 缓冲
- 绘图
- 技术
- 饶毅 施一公
- 计算机电路基础:随堂练习答案
- 金融企业会计习题4
- 建筑施工碗扣式钢管脚手架安全技术规范的试题
- 采煤概论复习重点
- 平狄克《微观经济学》(第7版)习题详解(第7章 生成成本)
- 项目二 使用和维护Windows XP系统 - 图文
- 总监理工程师对施工准备情况提出的意见和要求
- 通防专业考试题库
- 妊娠禁忌穴 - 图文
- 教育学,单项选择题
- 重庆市·夕阳红养老地产项目营销推广策划方案
- 最终毕业设计 基于RFID技术的物联网交通 - 图文
- BP神经网络解决三个变量的异或问题
- 大气压强和流体压强
- 我县农村环境卫生整治存在的问题及对策
- 延迟交货道歉信英文(共11篇)
- 米什金《货币金融学》第十一版 名词解释
- 公务员经典面试试题及答题思路分析(集合了当前流行的主要面试试题和答题思路,并全面排版整理)
- 韩国个别旅游所需资料NEW7.4