闲谈Graphics单元

Delphi GDI+ 实现简单画图 测试一下源码unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 阅读详情

本文中如果有错误的地方,您可以通过ttch007@sina.com联系笔者, 同时希望能与大家共同讨论

 

   VCL中的图象显示核心单元Graphics,其中主要把图象对象分为2大类TGriphics

TGriphicsObject,两者从字面意义讲一个是图象体,一个是图象工具。打个比喻一个是

绘图体,一个是绘图工具体。接下来我们具体了解以下这个单元是怎么封装的这个单元。

 

TFont,TPen,TBrush3个对象组成了TCanvas

你可以看到图1TFont,TPen,TBrush 3个类都来之TGriphicsObject,TGriphicsObject

是个有存储能力的持久类。了解TCanvas的基础是了解这3个对象,他们提供了TCanvas基本的功能和数据,TCanvas是靠这3个对象的数据开始运做的。在TFont,TPen,TBrush都做了什么来提供给TCanvas的数据的?

 

带这个疑问我们看看TFont,TBrush,TPen

我们首先看看TGraphicsObject提供了给这3个类

  TGraphicsObject = class(TPersistent)

  private

    FOnChange: TNotifyEvent;

    FResource: PResource;

    FOwnerLock: PRTLCriticalSection;

  protected

    procedure Changed; dynamic;

    procedure Lock;

    procedure Unlock;

  public

    function HandleAllocated: Boolean;

    property OnChange: TNotifyEvent read FOnChange write FOnChange;

    property OwnerCriticalSection: PRTLCriticalSection read FOwnerLock write FOwnerLock;

  end;

从上面我们可以看到  TGraphics提供了标准的改变事件函数指针,Resource指针,临界区锁定功能,那么Resource指针指向的结构都有什么?

PResource = ^TResource;

  TResource = record

    Next: PResource;

    RefCount: Integer;

    Handle: THandle;

    HashCode: Word;

    case Integer of

      0: (Data: TResData);

      1: (Font: TFontData);

      2: (Pen: TPenData);

      3: (Brush: TBrushData);

  end;

上面就是他的结构体

他是一个HASH表,数据结构的东西就不讲,我们跳过,你可以看到其中还有4个结构体,那里就有我们这个单元要谈的3个类的属性存储结构,按号入位,大家都找到了吧。

我们跳过3个结构体,直接讲解下面的机制。

我们知道了TGraphics提供了给这3个类最基本的功能,那么我们接下来要知道这3个类是如何被建立和设定属性的方式。

TResourceManager是一个建立实际数据空间的类,他主要为这3个类提供真正的数据空间。(他和WINDOWS没有关系)这样讲也许有人不会他理解,我画了一个图,大家可以在压缩包中找到相应的图片(ThreeClass.png)里面有详细的介绍.

 

先到这  先是简单的介绍一下机制,以后再谈其中的具体操作细节

Delphi XE GDI+编程 1、准备工作 GDI+(Graphics Device Interface Plus 图形设备接口加)是 Windows XP 和 Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负责在屏幕和打印机上绘制图形图像和显示信息。 顾名思义,GDI+是 Windows早期版本所提供的图形设备接口 GDI的后续版本。GDI+是一种应用程序编程接口(API),通过一套部署为托管代码的类来展现。这套类被称为 GDI+的“托管类接口”。 GDI+最早是于 2001年随 Win 阅读详情

相关推荐

Delphi图像旋转控件开发与实战

Delphi是一款经典的快速应用开发(RAD)工具,广泛应用于Windows平台的桌面程序开发。其集成开发环境(IDE)界面清晰、操作直观,集成了代码编辑器、窗体设计器、调试器等核心组件,极大地提升了开发效率。VCL框架是Delphi开发的核心支撑,具有以下显著特性:组件化设计:所有UI元素都是组件,可复用、可继承、可扩展。事件驱动机制:支持事件绑定,如点击、拖拽、键盘输入等。高封装性:隐藏底层复杂逻辑,简化开发流程。良好的性能表现。

weixin_42311427的博客 842

Graphics32 for Delphi绘图,支持多个Delphi版本

支持Delphi多个版本的Graphics32绘图技术,经本人亲自测试,效果不错,已更新到XE10,跟踪源码学习实现技术

Delphi/C++ Builder中实现TListView缩略图查看方式

GDI+(Graphics Device Interface Plus)是Windows平台提供的图形绘制接口,具备图像处理、高质量缩放、抗锯齿等功能。Delphi中可以通过调用Windows API来使用GDI+。首先需要初始化GDI+环境:usesvarbegintry// 图像处理逻辑finallyend;end;本章详细讲解了Delphi中图像资源的加载与处理流程,包括:使用TMemoryStream从文件或资源中高效加载图像;

weixin_35189483的博客 852

Delphi图像处理 -- 图像显示

阅读提示:    《Delphi图像处理》系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM。    《C++图像处理》系列以代码清晰,可读性为主,全部使用C++代码。    尽可能保持二者内容一致,可相互对照。    本文代码必须包括文章《Delphi图像处理 -- 数据类型及公用过程》中的ImageData.pas单元和《Delphi图像处理 -- 图像合成》中除例子外的全部代码

闲人阿发伯的业余编程心得 1万+

Delphi简单的图像编程

简单的图像编程(Graphics the Easy Way) 图像编程并不一定很难。有时要做的只是在窗体上显示一幅图画或一个简单的图形,VCL已经提供了现成的组件供使用。在真正进入图像编程之前先浏览一下这些组件。 Shape组件(在面板的Additional标签上)可用来将一些简单图形添加到窗体中。 使用Shape组件很容易,只需要在窗体上放置一个Shape组件再根据需要改变Brush、Pen和Shape属性,可以绘制出圆、椭圆、正方形、矩形和圆角矩形,改变Brush属性可以修改图形的背景色;

fangyuan621的专栏 785

技术文章系列整理(持续更新)

本博客有很多关于性能及测试开发的文章。我试着对你可能感兴趣的一些重要文章进行分类。 性能基础系列: 性能基础之浅谈常见接口性能压测 性能闲谈系列: 浅谈window桌面GUI技术及图像渲染性能测试实践 JMeter系列: Jmeter接口测试demo 性能工具之Jmeter扩展函数及压测ActiveMQ实践 性能工具之Jmeter压测Hprose RPC服务 性能工具之Jmeter压测Thrift...

7DGroup,让技术更有价值! 1万+

Delphi10 安装Graphics32

Delphi10 安装Graphics32

u011970286的专栏 736

GDI+ 在Delphi程序的应用 -- 图像的透明显示技巧

GDI+ 在Delphi程序的应用 -- 图像的透明显示技巧    在Delphi中,通过设置TBitmap的Transparent、TransparentColor和TransparentMode属性,可以很方便的实现图像中某种颜色的透明显示;也可以采用某种算法对图像像素逐点计算,实现图像各种形式的透明显示。    使用GDI+,可以比常规方式更方便、快捷的实现图像各种形式的透明

闲人阿发伯的业余编程心得 1万+

GDI+ 学习记录(3) 虚线画笔 - Dash

//虚线样式 var g:TGPGraphics; p:TGPPen; begin g:=TGPGraphics.Create(Canvas.Handle); g.Clear(aclWhite); p:=TGPPen.Create(aclRed,5); g.DrawLine(p,30,50,200,50);{实线} p.SetDashSt...

weixin_30663471的博客 240

Delphi图像处理 -- 设置阈值

阅读提示:    《Delphi图像处理》系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM。    《C++图像处理》系列以代码清晰,可读性为主,全部使用C++代码。    尽可能保持二者内容一致,可相互对照。   本文代码必须包括文章《Delphi图像处理 -- 数据类型及公用过程》中的ImageData.pas单元。      GDI+的TGpImageAttributes类

闲人阿发伯的业余编程心得 5612

Delphi图像处理 -- 图像黑白调整

阅读提示:    《C++图像处理》系列以代码清晰,可读性为主,全部使用C++代码。    《Delphi图像处理》系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM。    尽可能保持二者内容一致,可相互对照。    本文代码必须包括《C++图像处理 -- 数据类型及公用函数》文章中的BmpData.h头文件。     Photoshop CS的图像黑白调整功能,是通过对红、黄、绿

闲人阿发伯的业余编程心得 7897

Delphi下的GDI+编程[10] 绘制饼形-DrawPie

本例效果图: DrawPie:绘制一个扇形,该形状由一个坐标对、宽度、高度以及从起始角度到旋转角度的两条射线所连接的椭圆定义。 procedure TForm1.FormPaint(Sender: TObject);//编程form1的onPaint事件代码如下 var g:TGPGraphics; //定义绘图表面类变量 p:TGPPen; //定义画笔类变量 beg...

weixin_30467087的博客 335

PNG缩放

下面是自己用delphi7写的一个控件 最近手头一个程序中需要用到PNG格式的图片 但是崩溃的是delphi中没有实现对png图片的缩放好在网上有用GDI+实现的方法  主要方法都是从万一大神的博客上直接copy的   为了方便使用做成了控件unit GDIpanel;interfaceuses  SysUtils, Classes, Controls, ExtCtrls,GDIPOBJ,GDIPUTIL,GDIPAPI,Messages,Graphics;type  tGDIpanel = class(T

后之后觉的专栏 3167

Delphi下的GDI+编程[2] DrawLine - 绘制直线

例一效果图: 在GDI+中,绘制直线是通过TGPGraphics类的DrawLine方法实现的,此类的一些方法如下: DrawLine(线条) DrawRectangle(矩形) DrawEllipse(椭圆) DrawPolygon(多边形) DrawArc(弧形) DrawCurve(基数样条) DrawBezier(贝塞尔样条) 当然,要想在程序上画出来我们还需要一个...

weixin_30340819的博客 495

Delphi 的绘图功能[14] - 图像类

Delphi 的 Graphic 单元有五个重要的图像类: TGraphic、TBitmap、TMetafile、TIcon、TPicture. TBitmap 用来操作位图; TMetafile 用来操作图元文件; TIcon 用来操作图标(包括鼠标指针)文件; TBitmap、TMetafile、TIcon 都是 TGraphic 的子类, 由于 TCanvas.Dra...

weixin_33747129的博客 164

Delphi下的GDI+编程[4] 绘制直线-虚线样式

本例效果图: //虚线样式 var g: TGPGraphics; p: TGPPen; begin g := TGPGraphics.Create(Canvas.Handle); g.Clear(aclWhite); p := TGPPen.Create(MakeColor(255,255,0,0),3); g.DrawLine(p, 11,...

weixin_30402343的博客 297

Delphi绘图功能[1] —— 入门(绘制直线和矩形)

使用圆角矩形绘制一个圆角矩形使用钢笔和填充它与画笔。矩形的边缘由点(X1,Y1) ,(X2,Y1) ,(X2,Y2) ,(X1,Y2)定义,但是角落将被修剪以创建一个圆形的外观。此函数绘制的矩形无法滚动。要滚动包含 DrawFocusRect 绘制的矩形的区域,请调用 DrawFocusRect 从屏幕上移除该矩形,滚动该区域,然后调用 DrawFocusRect 在新位置绘制该矩形。因为 DrawFocusRect 使用了一个 XOR 函数,所以在指定相同的矩形时第二次调用它会从屏幕中移除该矩形。

兴趣使然的编程菜鸟 4205
上一篇: 工程又恢复过来了 接着开发网站
下一篇: 今天长了有生以来第一根白头发
ttch
博客等级 码龄25年 1粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值