Delphi GDI(一)

Delphi 7下IGDIPlus库的使用

 IGDI+是一个免费开源封装微软GDI+功能的Delphi库,该库使得可以用Delphi语言代码快速简短的实现复杂GDI+应用程序。
官方网站:http://www.mitov.com/html/igdi_.html
SourceForge:https://sourceforge.net/projects/igdiplus/

安装方法:
1.首先下载目前最新版的IGDI+,解压到任意目录下,这里我解压到D盘;
2.打开Delphi 7→Tools→Environment Options→Library→Library path,然后点击右边的“...”,添加IGDI+的目录路径,确定完成,如下图所示:

如要在程序中使用IGDI+的话
1.首先在单元头uses内包含IGDIPlus,如:uses IGDIPlus;
2.在窗体的OnPaint事件中,添加如下测试代码:
procedure TForm1.FormPaint(Sender: TObject);
var
  AGraphics: IGPGraphics;
  APen: IGPPen;
  AFont: IGPFont;
  ABrush: IGPSolidBrush;
  rc: TPoint;
begin
  AGraphics := TGPGraphics.Create(Canvas);
  AGraphics.SmoothingMode := SmoothingModeAntiAlias;//指定平滑(抗锯齿)
  AGraphics.TextRenderingHint := TextRenderingHintAntiAlias;//指定使用过程中呈现的文本采用反走样
  APen := TGPPen.Create($FF000000,3);
  AGraphics.DrawLine(APen,5,5,100,100); 

  APen.Color := $FF0000FF;
  APen.Width := 2;
  AGraphics.DrawEllipse(APen,120,5,100,100); 

  Canvas.Font.Name := ‘微软雅黑‘;
  Canvas.Font.Size := 13;
  AFont := TGPFont.Create(Canvas.Handle);
  ABrush := TGPSolidBrush.Create($FFFF0000);
  rc.X := 10;
  rc.Y := 150;
  AGraphics.DrawString(‘无幻博客‘+#13#10+‘http://blog.csdn.net/akof1314‘,AFont,rc,ABrush);
end; 

3.运行结果如下图所示:

IGDI+库下载:
地址一:http://www.mitov.com/IGDIPlus.zip
地址二:http://download.csdn.net/source/3039922

Delphi GDI+ 绘图

绘图需要有纸、画笔、画刷; Delphi 有 Canvas、Pen、Brush.
Canvas  :就是画布, 譬如窗体的 Canvas 属性, 就是窗体的画布;
Pen :是画笔, 可以设置笔色、笔宽等等;
Brush: 是画刷, 可以设置填充颜色等等.
--------------------------------------------------------------------------------
//举例:
{绘制直线}
procedure TForm1.Button1Click(Sender: TObject);
begin
  Canvas.Pen.Color := clRed; {设置画笔颜色}
  Canvas.Pen.Width := 2;     {设置画笔宽度}
  Canvas.MoveTo(10,10);      {直线起点}
  Canvas.LineTo(100,100);    {直线终点}
{这里的 Canvas 是简写, 也可以写做: Self.Canvas 或 Form1.Canvas }
end;
{矩形填充}
procedure TForm1.Button2Click(Sender: TObject);
begin
  Canvas.Brush.Color := clYellow; {设置画刷颜色, 也就是填充色}
  Canvas.FillRect(ClientRect);    {填充窗体客户区}
end;
最好用 TPaintBox 并在其 OnPaint 事件中绘图。而不是在Image控件中Image1.Canvas.Rectangle(0,0,Image1.Width,Image1.Height);

--------------------------------------------------------------------------------
TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的关系与区别
TGraphic 是 TBitmap 的父类, 很多绘图函数的参数是 TGraphic, 但我们经常给函数的是 TBitmap;
TBitmap 的很多功能都是继承自 TGraphic, 譬如:
Width、Height、LoadFromFile、SaveToFile、LoadFromStream、SaveToStream;
还有 Palette(调色板)、Transparent(是否透明) 等等.
TGraphic 实用举例:

--------------------------------------------------------------------------------
var
  g: TGraphic;
begin
  g := TBitmap.Create;
  g.LoadFromFile(‘c:\temp\test.bmp‘);
  Self.Canvas.StretchDraw(ClientRect, g);
  g.Free;
end;
--------------------------------------------------------------------------------

TCanvas 是一个绘图表面, 像画圆、画方、画笔、画刷等等都是它的功能;
控件的 Canvas 属性就是一个 TCanvas, 譬如:

--------------------------------------------------------------------------------
var
  cvs: TCanvas;
begin
  cvs := Self.Canvas;
  cvs.Brush.Color := clYellow;
  cvs.Font.Color := clRed;
  cvs.Font.Name := ‘宋体‘;
  cvs.Font.Style := [fsBold];
  cvs.Font.Size := 24;
  cvs.TextOut(10, 10, ‘万一的 Delphi 博客‘);
end;
--------------------------------------------------------------------------------

有些控件没有直接给 Canvas 属性, 我们也可以通过 TCanvas 获取它的绘图表面;
一切看得见的控件都应该有绘图表面, 不然系统是怎么画的?
譬如 TPanel 和 TButton 就没有 Canvas 属性, 没有是因为不常用, 如果需要可以这样:

--------------------------------------------------------------------------------
var
  cvs: TCanvas;
begin
  cvs := TCanvas.Create;
  cvs.Handle := GetDC(Panel1.Handle);
  cvs.Pen.Width := 2;
  cvs.Pen.Color := clRed;
  cvs.Brush.Color := clYellow;
  cvs.Rectangle(5, 5, 50, 30);
  cvs.Free;
end;
--------------------------------------------------------------------------------

再说 TBitmap, 它从 TGraphic 继承, 同时又把 TCanvas 纳为自己的属性;
所以它有了处理图片和绘图的双重功能!
给 TBitmap 也举个例子吧:

--------------------------------------------------------------------------------
var
  bit: TBitmap;
begin
  bit := TBitmap.Create;
  bit.LoadFromFile(‘c:\temp\test.bmp‘);
  bit.Canvas.Brush.Style := bsClear;
  bit.Canvas.Pen.Color := clRed;
  bit.Canvas.Pen.Width := 2;
  bit.Canvas.Ellipse(2, 2, 88, 66);
  Self.Canvas.Draw(0, 0, bit);
  bit.Free;
end;
--------------------------------------------------------------------------------

TPicture 是为了处理更多种格式的图片(譬如: ico、wmf 等)而存在的;
但它把 TGraphic、TCanvas、TBitmap 的功能通通借用过来, 所以功能更强大.
TPicture 和 TGraphic 重复的功能(譬如: LoadFromFile)都是内部调用的 TGraphic;
但如果要给它绘图, 需要调用: TPicture.Bitmap.Canvas.
下面的例子是用 TPicture 画了个十字图标(显示并保存起来):

--------------------------------------------------------------------------------
var
  pic: TPicture;
begin
  pic := TPicture.Create;
  pic.Bitmap.SetSize(32, 32);
  pic.Bitmap.Canvas.Pen.Color := clRed;
  pic.Bitmap.Canvas.Pen.Width := 8;
  pic.Bitmap.Canvas.MoveTo(0, 16);
  pic.Bitmap.Canvas.LineTo(32, 16);
  pic.Bitmap.Canvas.MoveTo(16, 0);
  pic.Bitmap.Canvas.LineTo(16, 32);
  Self.Canvas.Draw(4, 4, pic.Graphic);
  pic.SaveToFile(‘c:\temp\test.ico‘);
  pic.Free;
end;
--------------------------------------------------------------------------------

TImage 则主要是为了显示图片, 它主要包含的是 TPicture, 有了 TPicture 就有了上面的一切;
但因它是从 TControl -> TGraphicControl 继承下来的, 所以它具备了控件的基本能力(事件、消息等等).
TPaintBox 主要用于绘图, 没有处理图片的能力, 所以只包含了 TCanvas;
它也是从 TControl -> TGraphicControl 继承, 是能够交互的控件了.
很显然, TImage 比 TPaintBox 的能力强大; 但仅就绘图来讲, 还是 TPaintBox 轻便些.

Delphi GDI+ 文本输出

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, CheckLst;
type
TForm1 = class(TForm)
CheckListBox1: TCheckListBox;
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure CheckListBox1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses GDIPOBJ, GDIPAPI;
var fs: Integer;
procedure TForm1.CheckListBox1Click(Sender: TObject);
const
fsArr: array[0..5] of Integer = (FontStyleRegular,
FontStyleBold,
FontStyleItalic,
FontStyleBoldItalic,
FontStyleUnderline,
FontStyleStrikeout);
var
i: Integer;
begin
fs := 0;
for i := 0to CheckListBox1.Items.Count - 1do
if CheckListBox1.Checked[i] then
fs := fs or fsArr[i];
Repaint;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CheckListBox1.Align := alLeft;
CheckListBox1.Items.CommaText := ‘FontStyleRegular,‘ +
‘FontStyleBold,‘ +
‘FontStyleItalic,‘ +
‘FontStyleBoldItalic,‘ +
‘FontStyleUnderline,‘ +
‘FontStyleStrikeout‘;
CheckListBox1.Checked[0] := True;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
g: TGPGraphics;
sb: TGPSolidBrush;
font: TGPFont;
begin
g := TGPGraphics.Create(Canvas.Handle);
sb := TGPSolidBrush.Create(aclRed);
font := TGPFont.Create(‘微软雅黑‘, 50, fs);
g.DrawString(‘Delphi‘, -1, font, MakePoint(CheckListBox1.Width + 0.0, 0), sb);
font.Free;
sb.Free;
g.Free;
end;
end.
FontStyle = Integer;
const
FontStyleRegular = Integer(0); {普通文本}
FontStyleBold = Integer(1); {加粗文本}
FontStyleItalic = Integer(2); {倾斜文本}
FontStyleBoldItalic = Integer(3); {加粗并倾斜文本}
FontStyleUnderline = Integer(4); {带下划线的文本}
FontStyleStrikeout = Integer(8); {中间有直线通过的文本}
Type
TFontStyle = FontStyle;
文本样式类型表:
Delphi 微软 说明
FontStyleBold Bold 加粗文本。
FontStyleItalic Italic 倾斜文本。
FontStyleRegular Regular 普通文本。
FontStyleStrikeout Strikeout 中间有直线通过的文本。
FontStyleUnderline Underline 带下划线的文本。
坐标单位类型表:
Delphi 微软 说明
UnitDisplay Display 指定显示设备的度量单位。通常,视频显示使用的单位是像素;打印机使用的单位是 1/100 英寸。
UnitDocument Document 将文档单位(1/300 英寸)指定为度量单位。
UnitInch Inch 将英寸指定为度量单位。
UnitMillimeter Millimeter 将毫米指定为度量单位。
UnitPixel Pixel 将设备像素指定为度量单位。
UnitPoint Point 将打印机点(1/72 英寸)指定为度量单位。
UnitWorld World 将世界坐标系单位指定为度量单位。
文本呈现质量模式:
Delphi 微软 说明
TextRenderingHintAntiAlias AntiAlias 在无提示的情况下使用每个字符的消除锯齿效果标志符号位图来绘制字符。由于采用了 AntiAlias,质量会得到改善。由于关闭了提示,主干宽度差可能会比较明显。
TextRenderingHintAntiAliasGridFit AntiAliasGridFit 在有提示的情况下使用每个字符的消除锯齿效果标志符号位图来绘制字符。由于采用了 AntiAlias,质量会得到大大改善,但同时会增加性能成本。
TextRenderingHintClearTypeGridFit ClearTypeGridFit 在有提示的情况下使用每个字符的标志符号 ClearType 位图来绘制字符。这是质量最高的设置。用于利用 ClearType 字体功能。
TextRenderingHintSingleBitPerPixel SingleBitPerPixel 使用每个字符的标志符号位图来绘制字符。不使用提示。
TextRenderingHintSingleBitPerPixelGridFit SingleBitPerPixelGridFit 使用每个字符的标志符号位图来绘制字符。提示用于改善字符在主干和弯曲部分的外观。
TextRenderingHintSystemDefault SystemDefault 在有系统默认呈现提示的情况下使用每个字符的标志符号位图来绘制字符。将采用用户为系统选择的任何字体修匀设置来绘制文本。
//颜色透明度var  g: TGPGraphics;  sb: TGPSolidBrush;begin  g := TGPGraphics.Create(Canvas.Handle);  sb := TGPSolidBrush.Create(MakeColor(128,255,0,0)); {128表示半透明}  g.FillRectangle(sb,10,10,100,100);  sb.Free;  g.Free;end;
--------------------------------------------------------------------------------
//使用 GDI+ 的颜色类型var  g: TGPGraphics;  sb: TGPSolidBrush;  color: TGPColor; {其实颜色是 DWORD 类型的}begin  g := TGPGraphics.Create(Canvas.Handle);  color := aclRed;  sb := TGPSolidBrush.Create(color);  g.FillRectangle(sb,10,10,100,100);  sb.Free;  g.Free;end;

原文地址:https://www.cnblogs.com/blogpro/p/11345913.html

时间: 2024-11-09 02:17:33

Delphi GDI(一)的相关文章

Delphi GDI+ Library

GDI+ LibraryThis library enables GDI+ functionality for Delphi 2009 and later. It differs from other Delphi GDI+ libraries in the following ways: It is modeled more after the .NET System.Drawing namespace instead of the C++ GDI+ classes. As a result,

Delphi GDI+基本用法总结

GDI+以前只是听说过,还没怎么用过,这段时间用了用,觉得挺好用的.在这里总结一下.留个备忘. GDI+(Graphics Device Interface plus)是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C++类实现的应用程序编程接口.由于它是图形绘制相关的接口,那先了解一下常用的几种图片格式. 常见的图片格式 常见的图片格式有JPEG, BMP, PNG. - JPEG:它用有损压缩方式去除冗余的图像或彩色数据, 获取得极高的压缩率的同

Delphi GDI对象之绘制位图

http://www.cnblogs.com/pchmonster/archive/2012/07/06/2579334.html 绘制位图(Drawing Bitmaps) 绘制位图听起来似乎很难,然而如几次所见到的那样,绘制位图非常容易.TCanvas类具有几种方法绘制位图,最常用的方法是Draw方法,这种方法只是在画布上指定位置绘制位图.用户已经见过几个这样的例子.下面是简短的例子. 1 2 3 4 5 6 7 8 9 procedure TForm1.btn1Click(Sender:

Delphi+GDI

源:Delphi 初试GDI+学习笔记 Delphi 深入GDI+学习笔记

Delphi GDI对象之剪切区域

原文链接: http://www.cnblogs.com/pchmonster/archive/2012/07/05/2577627.html 剪切区域(Clipping Regions) Regions是屏幕的一部分,它可用于控制绘图的那部分画布.TCanvas类具有ClipRect属性,但这个属性只是只读的,要改变裁减区,必须使用Windows API,仍以前面的例子为例,并加以修改来说明裁剪区是如何工作的,下面是代码: 1 2 3 4 5 6 7 8 9 10 11 12 var   Bi

delphi GDI 图片压缩代码 据说是位图缩放保持原图视觉效果最好的算法

delphi 图片压缩代码 据说是位图缩放保持原图视觉效果最好的算法 若有更好的,请大神留言我也学习下,感谢! uses WinAPI.GDIPAPI, WinAPI.GDIPOBJ; var  Bitmap1: TGPBitmap;  Bitmap2: TBitmap;  Graphic: TGPGraphics;begin  Bitmap1 := TGPBitmap.Create('test.bmp');  // bmp, gif, jpeg, png...  Bitmap2 := TBit

Delphi GDI对象之脱屏位图(Offscreen Bitmaps),也叫内存位图

http://www.cnblogs.com/pchmonster/archive/2012/07/09/2583613.html 脱屏位图(Offscreen Bitmaps) 脱屏位图,也叫内存位图,普遍用于Windows程序设计中.它在内存中制作图像,然后利用Draw方法在屏幕上显示出来.当用户想更快的在屏幕上绘制图像时,脱屏位图有助于避免闪烁.脱屏位图也适合于复杂制图程序.用户可以将图像预存起来,需要时显示出来.脱屏位图用于动画,最流行的动画制作方法是Microsoft的DirectX

Delphi GDI 图形设备接口Graphics Device Interface

GDI (图形设备接口(Graphics Device Interface))GDI是图形设备接口的英文缩写,主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形和图像输出.GDI的出现使程序员无需要关心硬件设备及设备正常驱动,就可以将应用程序的输出转化为硬件设备上的输出和构成,实现了程序开发者与硬件设备的隔离,大大方便了开发工作. 在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就可以方便的在屏幕.打印机及其它输出

C/C++技术常用网站

软件下载网站[visual studio 2005编译器] http://www.xdowns.com/ debug调试大牛 http://blogs.msdn.com/oldnewthing/ http://blogs.msdn.com/lixiong/ 绝版图书淘宝站: http://shop59563940.taobao.com/ www.vckbase.com www.codeproject.com http://www.acejoy.com --- ace 网站 http://www.