`
sogotobj
  • 浏览: 651658 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

GDI+ for VCL基础 -- GDI+ 与 VCL

阅读更多

陆续写了十几篇关于《GDI+Delphi程序的应用》的文章后,应几个小友来信要求,将我所使用的GDI+for VCL,包括DelphiC++Builder版发布在了csdn的资源下载区。

GDI+ C语言版本同时GDI+ for VCL版本2010.7.10修改版下载地址:http://download.csdn.net/source/2737743

其中的Delphi版与目前网上流通的版本不完全兼容;而C++Builder本来自带有C++版的Gdiplus,但由于与VCL有些冲突,使用起来较麻烦,所以本人参照Delphi版完全重新写了一个供C++Builder使用的VCL版(开源的),本BLOG中的有关GDI+的Delphi例子很容易就移植到C++Builder。

下面就GDI+ for VCL的一些特点作简单介绍:

GDI+是伴随Windows XP系统出现的增强性图形设备接口子系统,除了一整套API外,还提供了几十个C++类和大量的数据类型,同传统的Win32 GDI相比,GDI+不仅优化和扩展了GDI,而且使得使用C/C++开发Windows程序图形界面更容易操作。但是,对于Delphi和C++Builder所共用的VCL来说,由于VCL通过TCanvas、TBitmap和TImage等及其相关的类,把传统的GDI封装的几乎无可挑剔,类似C++的GDI+类,在易操作上就没什么优势可言了。但是,要想把GDI+封装成完全的VCL风格也存在几个问题:
1、正是由于VCL对GDI良好的封装,VCL所有与界面和图形有关的类对GDI存在严重的依赖性,即使GDI+封装成完全的VCL风格,也无法“插足”已有的界面和图形类,充其量只能起到“敲敲边鼓”的辅助作用,所以把GDI+封装成完全的VCL风格意义不大,除非GDI+为主,完全重构原有的界面和图形类;
2、现有大量的C++、.NET有关GDI+的代码移植到Delphi(C++Builser)时,结构修改量太大,而且对于已经熟悉C++或者.NET GDI+的人来说,重新掌握新的VCL风格无疑是痛苦的;
3、GDI+的坐标计量类型有整数和实数2套,如果按VCL风格写,势必要舍弃一套,保留整数型当然是最好的,但这2套类型又都不那么完整,整数型更是个半吊子系统。
鉴于以上原因,无论是目前网上流通的GDI+ for Delphi版本,还是本人改写的GDI+ for VCL,都基本采用了原C++类风格,甚至于.net的GDI+版本也与.net其它类风格不一样,更多的保留了原C++风格(就我个人的看法,不知什么原因,GDI+ for C++版本无论是架构设计,还是代码水平,其实都很差,同C++的STL没法比)。
当然,同网上流通的GDI+ for Delphi版本比,我改写的GDI+ for VCL版本并没有完全照搬原C++代码,兼顾了部分VCL和.NET风格,比如加入了VCL异常、布尔类型和绝大部分枚举和集合类型都采用了VCL风格、增加了.NET风格的Pens和Brushs等全局变量(C++Builder)或者全局函数(Delphi)。
GDI+ for VCL的所有类(不包括TPens和TBrushs)都派生于TGdiplusBase:
TCloneAPI=function(Native:GpNative;varclone:GpNative):TStatus;stdcall;

TGdiplusBase
=class(TObject)
private
FNative:GpNative;
protected
constructorCreateClone(SrcNative:GpNative;clonefunc:TCloneAPI
=nil);
propertyNative:GpNativereadFNativewriteFNative;
public
constructorCreate;
classfunctionNewInstance:TObject;override;
procedureFreeInstance;
override;
end;

原C++的GdiplusBase只是重载了new和delete操作符,分别以GDI+的GdipAlloc和GdipFree替换了原系统默认的内存分配和释放方法,而TGdiplusBase也相应的重载了TObject的NewInstance方法和FreeInstance方法(其实在不重载也能正常运行);

在TGdiplusBase中有个保护的GpNative(指针)类型的成员Native(Delphi中说明为属性,C++builder直接说明为数据成员),供所用派生类使用(原C++类将这个成员分散说明在各个类中),这个数据成员就是Gdiplus.dll内部使用的类指针,GDI+类都是通过对应的内部类指针对Dll Exports函数的调用实现的(假如你讨厌GDI+的类,你完全可以抛开它们而直接使用指针操作原始的Dll Exports函数);

至于TGdiplusBase构造方法CreateClone则是我为了简化派生类的Clone方法所提供的基类保护方法。

GDI+ for VCL定义了一个异常类EGdiplusException:

EGdiplusException=class(Exception)
private
FGdipError:TStatus;
functionGetGdipErrorString:
string;
public
constructorCreateStatus(Status:TStatus);
propertyGdipError:TStatusreadFGdipError;
propertyGdipErrorString:
stringreadGetGdipErrorString;
end;

除各类的析构方法外,其它类方法都使用了异常检查,这使得GDI+ for VCL代码同原C++代码和目前流通的GDI+ for Delphi比,更加方便和健壮,通过使用EGdiplusException.GdipError或者EGdiplusException.GdipErrorString,可以得到GDI+最后一次异常代码或信息。

GDI+ for VCL重新定义了绝大多数数据类型,如将C++风格的常量和枚举类型改为了VCL风格的枚举和集合类型,重构某些数据结构,以提供对VCL数据类型的支持或转换。以Color类为例,改写后的TGpColor:

// Known Color

#defineKnownColorCount141
static const ARGB kcAliceBlue = 0xfff0f8ff;
static const ARGB kcAntiqueWhite = 0xfffaebd7;
(略)

classColor
{
private:

union
{
ARGBFARGB;
struct
{
BYTEFBlue;
BYTEFGreen;
BYTEFRed;
BYTEFAlpha;
};
};
staticTIdentMapEntryKnownColors[];

voidMakeARGB(BYTEa,BYTEr,BYTEg,BYTEb);
voidMakeARGB(BYTEa,Graphics::TColorcolor);
COLORREFGetCOLORREF();
AnsiStringGetKnownName(
void);

public:

Color();
Color(Color
&color);
Color(ARGBargb);
Color(BYTEalpha,ARGBargb);
Color(BYTEr,BYTEg,BYTEb);
Color(BYTEa,BYTEr,BYTEg,BYTEb);
Color(BYTEalpha,Graphics::TColorcolor);
Color(Graphics::TColorcolor);
Color(AnsiStringName,BYTEAlpha
=255);

staticColorFromTColor(BYTEalpha,Graphics::TColorcolor);
staticColorFromTColor(Graphics::TColorcolor);
staticColorFromArgb(ARGBargb);
staticColorFromArgb(BYTEalpha,ARGBargb);
staticColorFromArgb(BYTEr,BYTEg,BYTEb);
staticColorFromArgb(BYTEa,BYTEr,BYTEg,BYTEb);
staticColorFromName(AnsiStringName,BYTEAlpha=255);
staticColorFromCOLORREF(BYTEalpha,COLORREFrgb);
staticColorFromCOLORREF(COLORREFrgb);

boolIsEmpty();
Color
&operator=(Colorc);
Color
&operator=(ARGBc);
booloperator==(Color&c);
booloperator!=(Color&c);

staticARGBStringToARGB(AnsiStringName,BYTEAlpha=255);
staticAnsiStringARGBToString(ARGBargb);

__propertyARGBArgb
={read=FARGB};
__propertyBYTEAlpha
={read=FAlpha};
__propertyBYTEA
={read=FAlpha};
__propertyBYTERed
={read=FRed};
__propertyBYTER
={read=FRed};
__propertyBYTEGreen
={read=FGreen};
__propertyBYTEG
={read=FGreen};
__propertyBYTEBlue
={read=FBlue};
__propertyBYTEB
={read=FBlue};
__propertyCOLORREFRgb
={read=GetCOLORREF};
__propertyAnsiStringName
={read=GetKnownName};

};

typedefColorTGpColor,
*PGpColor;
typedefARGBTARGB,
*PARGB;

不仅提供了对VCL的TColor类型的支持(定义为TGpColor类型的参数可直接传递TColor类型),也提供了对GDI+标准颜色的支持与转换(按标准颜色名称得到标准颜色或者按标准颜色取得名称)。在Delphi中,对应TGpColor的地方一律采用TARGB类型,同时提供了与TGpColor函数成员类似的转换方法:

functionARGBToString(Argb:TARGB):string;
functionStringToARGB(
constS:string;Alpha:BYTE=255):TARGB;
procedureGetARGBValues(Proc:TGetStrProc);
functionARGBToIdent(Argb:Longint;varIdent:
string):Boolean;
functionIdentToARGB(
constIdent:string;varArgb:Longint):Boolean;

functionARGB(r,g,b:BYTE):TARGB;overload;
functionARGB(a,r,g,b:BYTE):TARGB;overload;
functionARGB(a:Byte;Argb:TARGB):TARGB;overload;

functionARGBToCOLORREF(Argb:TARGB):Longint;
functionARGBToColor(Argb:TARGB):Graphics.TColor;
functionARGBFromCOLORREF(Rgb:Longint):TARGB;overload;
functionARGBFromCOLORREF(Alpha:Byte;Rgb:Longint):TARGB;overload;
functionARGBFromTColor(Color:Graphics.TColor):TARGB;overload;
functionARGBFromTColor(Alpha:Byte;Color:Graphics.TColor):TARGB;overload;

GDI+ for VCL还增加了.NET风格的Pens和Brushs等全局变量(C++Builder)或者全局函数(Delphi),不仅提供了141种标准颜色的画笔和画刷,也可使用自定义颜色调用Pens和Brushs的缺省数组(Delphi)或者重载的操作符(C++Builder)形成新的画笔和画刷,大大简化了一般的GDI+编程代码,C++Builder的定义为:

static TGpPens Pens;
static TGpBrushs Brushs;

而Delphi则定义为:

function Pens: TPens;
function Brushs: TBrushs;

你可能注意到上面的类型说明中Delphi和C++Builder类的名称不一样,前者为TGpPens和TGpBrushs,而后者直接写为TPens和TBrushs,这是本人写代码时的一点疏忽,不过对写代码没任何影响。

有关GDI+与VCL的话题就说到这里,下面用Delphi和C++Builder以一个简单相同的例子程序作为本文的结尾。

Delphi代码:

unitmain;

interface

uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls,Buttons,ExtCtrls;

type
TMainForm
=class(TForm)
BitBtn1:TBitBtn;
CbColor:TComboBox;
procedureFormPaint(Sender:TObject);
procedureCbColorDrawItem(Control:TWinControl;Index:Integer;
Rect:TRect;State:TOwnerDrawState);
procedureFormCreate(Sender:TObject);
procedureCbColorChange(Sender:TObject);
private
{Privatedeclarations}
procedureGetKnownColorStr(
consts:string);
public
{Publicdeclarations}
end;

var
MainForm:TMainForm;

implementation

usesGdiplus;

{$R
*.dfm}

procedureTMainForm.CbColorChange(Sender:TObject);
begin
Invalidate;
end;

procedureTMainForm.CbColorDrawItem(Control:TWinControl;Index:Integer;
Rect:TRect;State:TOwnerDrawState);
var
g:TGpGraphics;
r:TGpRect;
begin
g:
=TGpGraphics.Create(CbColor.Canvas.Handle);
try
CbColor.Canvas.FillRect(Windows.TRect(Rect));
r:
=GpRect(Rect.Left,Rect.Top,CbColor.ItemHeight,CbColor.ItemHeight-4);
OffSet(r,
2,2);
g.FillRectangle(Brushs[StringToARGB(CbColor.Items[Index])],r);
g.DrawRectangle(Pens.Black,r);
CbColor.Canvas.TextOut(r.X
+r.Width+5,r.Y,CbColor.Items[Index]);
finally
g.Free;
end;
end;

procedureTMainForm.FormCreate(Sender:TObject);
begin
GetARGBValues(GetKnownColorStr);
CbColor.ItemIndex:
=0;
end;

procedureTMainForm.FormPaint(Sender:TObject);
const
QualityStr:array[
0..4]ofstring=
(
'Default','HighSpeed','HighQuality','GammaCorrected','AssumeLinear');
Alphas:array[
0..3]ofByte=(255,128,64,32);
var
g:TGpGraphics;
font:TGpFont;
kc,bc:TARGB;
i,j:Integer;
begin
//建立与窗口关联的Graphics对象,使用Handle建立在D7中效果很好,可2007不停闪烁
//g:=TGpGraphics.Create(Handle,False);
g:=TGpGraphics.Create(Canvas.Handle);
//建立与本窗口字体关联的Gdiplus字体对象,以下3句都可建立,
//但是第三句显示有点不一样,可能没包括字符集的信息
font:=TGpFont.Create(Canvas.Handle);
//font:=TGpFont.Create(Canvas.Handle,Self.Font.Handle);
//font:=TGpFont.Create(Self.Font.Name,Self.Font.Size,Self.Font.Style);
kc:=StringToARGB(CbColor.Items[CbColor.ItemIndex]);
if(kcand$808080)=$808080thenbc:=kcBlack
elsebc:=kcAliceBlue;
//以下使用内建的Pens和Brushs作图,也可分别使用TGpPen和TGpBrush建立
g.DrawLine(Pens.Brown,120,30,659,30);
g.FillRectangle(Brushs[bc],
120,38,540,200);
//显示纵标题
fori:=0to4do
g.DrawString(QualityStr[i],font,Brushs.Black,
4.0,i*40+48);
//显示横标题
fori:=0to3do
g.DrawString(
'Alpha:'+IntToStr(Alphas[i]),font,Brushs.Black,130.0+i*140,8);
g.DrawString(
'选择显示颜色',font,Brushs.Black,4.0,260.0);
//根据所选颜色和Alpha,用不同的合成品质画色块
fori:=0to3do
begin
forj:=Integer(Low(TCompositingQuality))toInteger(High(TCompositingQuality))do
begin
g.CompositingQuality:
=TCompositingQuality(j);
g.DrawLine(Pens[ARGB(Alphas[i],kc),
20],
130+i*140,j*40+58,230+i*140,j*40+58);
end;
end;
font.Free;
g.Free;
end;

procedureTMainForm.GetKnownColorStr(
consts:string);
begin
CbColor.Items.Add(s);
end;

end.

C++ Builder代码:

//---------------------------------------------------------------------------

#ifndefmainH
#definemainH
//---------------------------------------------------------------------------
#include<Classes.hpp>
#include
<Controls.hpp>
#include
<StdCtrls.hpp>
#include
<Forms.hpp>
#include
<Buttons.hpp>
//---------------------------------------------------------------------------
classTMainForm:publicTForm
{
__published:
//IDE-managedComponents
TBitBtn*BitBtn1;
TComboBox
*CbColor;
void__fastcallCbColorDrawItem(TWinControl*Control,intIndex,TRect&Rect,
TOwnerDrawStateState);
void__fastcallCbColorChange(TObject*Sender);
void__fastcallFormPaint(TObject*Sender);
private://Userdeclarations
void__fastcallGetKnownColorStr(constStrings);
public://Userdeclarations
__fastcallTMainForm(TComponent*Owner);
};
//---------------------------------------------------------------------------
externPACKAGETMainForm*MainForm;
//---------------------------------------------------------------------------
#endif


//---------------------------------------------------------------------------

#include
<vcl.h>
#pragmahdrstop

#include
"main.h"
#include
"Gdiplus.hpp"
//---------------------------------------------------------------------------
#pragmapackage(smart_init)
#pragmaresource"*.dfm"
TMainForm
*MainForm;
//---------------------------------------------------------------------------
__fastcallTMainForm::TMainForm(TComponent*Owner)
:TForm(Owner)
{
GetARGBValues(GetKnownColorStr);
CbColor
->ItemIndex=0;
}
//---------------------------------------------------------------------------
void__fastcallTMainForm::GetKnownColorStr(constStrings)
{
CbColor
->Items->Add(s);
}
//---------------------------------------------------------------------------
void__fastcallTMainForm::CbColorDrawItem(TWinControl*Control,intIndex,
TRect
&Rect,TOwnerDrawStateState)
{
TGpGraphics
*g=newTGpGraphics(CbColor->Canvas->Handle);
try
{
CbColor
->Canvas->FillRect(Rect);
TGpRectr(Rect.Left,Rect.Top,CbColor
->ItemHeight,CbColor->ItemHeight-4);
r.Offset(
2,2);
TGpColorc
=TGpColor::StringToARGB(CbColor->Items->Strings[Index]);
TGpBrush
*b=Brushs[c];
g
->FillRectangle(b,r);
g
->DrawRectangle(Pens.Black,r);
CbColor
->Canvas->TextOutA(r.X+r.Width+5,r.Y,CbColor->Items->Strings[Index]);
}
__finally
{
deleteg;
}
}
//---------------------------------------------------------------------------
void__fastcallTMainForm::CbColorChange(TObject*Sender)
{
Invalidate();
}
//---------------------------------------------------------------------------
void__fastcallTMainForm::FormPaint(TObject*Sender)
{
conststaticStringQualityStr[5]=
{
"Default","HighSpeed","HighQuality","GammaCorrected","AssumeLinear"};
conststaticByteAlphas[4]={255,128,64,32};

//TGpGraphics*g=newTGpGraphics(Handle,false);
TGpGraphics*g=newTGpGraphics(Canvas->Handle);
//建立与本窗口字体关联的Gdiplus字体对象,以下3句都可建立,
//但是第三句显示有点不一样,可能没包括字符集的信息
TGpFont*font=newTGpFont(Canvas->Handle);
//TGpFont*font=newTGpFont(Canvas->Handle,Font->Handle);
//TGpFont*font=newTGpFont(Font->Name,Font->Size,Font->Style);
try
{
TARGBkc
=TGpColor::StringToARGB(CbColor->Items->Strings[CbColor->ItemIndex]);
TARGBbc
=(kc&0x808080)==0x808080?kcBlack:kcAliceBlue;
g
->DrawLine(Pens.Brown,120,30,659,30);
g
->FillRectangle(Brushs[bc],120,38,540,200);
for(inti=0;i<5;i++)
g
->DrawString(QualityStr[i],font,Brushs.Black,4.0,i*40+48);
for(inti=0;i<4;i++)
g
->DrawString("Alpha:"+IntToStr(Alphas[i]),
font,Brushs.Black,
130.0+i*140,8.0);
g
->DrawString("选择显示颜色",font,Brushs.Black,4.0,260.0);
for(inti=0;i<4;i++)
{
for(intj=0;j<5;j++)
{
g
->CompositingQuality=(TCompositingQuality)j;

g
->DrawLine(Pens(TGpColor(Alphas[i],kc),20),
130+i*140,j*40+58,230+i*140,j*40+58);
}
}
}
__finally
{
deletefont;
deleteg;
}
}
//---------------------------------------------------------------------------

运行结果:

通过这个例子,可以进一步了解前面介绍的颜色转换函数的应用、Pens和Brushs的应用;同时也增加对GDI+颜色类型TARGB不同于TColor的感性认识,即对Alpha的了解以及不同的Alphi值在不同的合成品质下的差异;还可掌握TCanvas与GDI+混合使用自绘TComboBox选项的技巧。

分享到:
评论

相关推荐

    GDI+_for_VCL基础

    GDI+ for VCL基础是关于在Delphi和C++Builder中使用GDI+图形库进行图形绘制和图像处理的专题。GDI+是微软在Windows XP系统中引入的一个增强图形设备接口,它扩展了传统的GDI(Graphics Device Interface),提供了更...

    GDI+ for VCL

    GDI+ for VCL 是一个专门为 Delphi 和 C++Builder 开发者设计的库,它允许程序员利用 GDI+(图形设备接口加)的功能在这些编程环境中创建丰富的图形和图像处理应用。GDI+ 是微软提供的一种图形绘制技术,比传统的 ...

    GDI+ for VCL and GDI+ for C (2010.10.7)

    标签中的"C/C++"表明这是针对C++程序员的资源,"GDI+"意味着它是关于GDI+编程的,"Gdiplus"是GDI+的库名,"VCL"指的是与Delphi和C++Builder中的组件库相关的部分,"BCB"(Borland C++ Builder)表示该资源也适用于...

    c++ GDI,C++Builder GDI,GDI,Png,Png to Image,支持多种图片格式,能够在多种图片间进行转换(bmp,jpg,wmf,emf,png,gif)

    GDI+ for VCL 基础 -- GDI+ 与 VCL GDI+ for VCL 版本与 Delphi 版本不同,GDI+ for VCL 版本考虑了 VCL 异常、布尔类型和枚举类型等方面,增加了.NET 风格的 Pens 和 Brushs 等全局变量。GDI+ for VCL 版本可以与 ...

    Delphi使用GDI+制作任意图片形状窗口

    为了实现上述功能,我们需要在Delphi中创建一个新的VCL Forms应用程序,然后导入GDI+的相关单元。在窗体的`OnCreate`事件中初始化GDI+,在`OnPaint`事件中绘制图片和处理透明度,在`OnNCCalcSize`事件中计算并设置...

    BCB6版GDI+桌面歌词

    在本例中,开发人员可能使用了VCL组件与GDI+库相结合,通过自定义控件或者窗体来绘制歌词,并且可能实现了动态跟随歌曲播放进度的效果。 描述中提到“目标代码和DELPHI版基本一致的,属于直接移植”,这意味着这个...

    delphi GDI+ 缩略图查看

    此外,他们可能还利用了 Delphi 的VCL(Visual Component Library)框架中的TImage控件来在界面上显示这些缩略图。 为了优化性能,开发者可能还考虑了缓存机制,预先生成并存储图片的缩略图,避免每次需要时都实时...

    GDI+用PNG图片做半透明异型窗口 Delphi

    Delphi通常使用VCL(Visual Component Library)进行UI构建,而GDI+则提供了一种在Delphi程序中实现更复杂图形操作的方法。要使用GDI+,你需要包含`gdiplus.pas`单元,这个单元为Delphi程序员提供了GDI+的接口。 ...

    gdi+绘制jpeg、png

    首先,GDI+相比Delphi自带的VCL组件,提供了更多的图像处理功能,如抗锯齿、透明度调整、图像旋转、缩放等。GDI+的接口设计更加面向对象,使得代码更易于理解和维护。 在`TestSynGdiPlusMain.dfm`文件中,可以看到...

    CMP_Button_GDI+Button_

    描述 "GDI+ Button for usage in Delphis forms" 明确了这款组件是专门用于Delphi的表单设计。Delphi是一种流行的面向对象的 Pascal 编程语言,它的集成开发环境(IDE)以其强大的VCL(Visual Component Library)...

    gdi+Clock

    在本文中,我们将深入探讨如何在C++ Builder 6中使用GDI+技术来创建一个时钟应用程序。GDI+是Microsoft提供的一种图形设备接口,它扩展了传统的GDI(图形设备接口)功能,提供了更丰富的绘图能力,包括矢量图形、抗...

    BCB2009版 GDI+桌面歌词

    然而,VCL主要基于GDI,而GDI+在某些方面提供了更好的性能和更现代的图形功能。因此,通过maozefa的GDI+库,开发者可以在BCB2009中利用GDI+的优势,比如更精确的文本渲染和图像处理,为桌面歌词应用带来更高质量的...

    ----Delphi编程宝典+编程手册----

    1. **基础语法**:介绍Delphi语言的基本语法结构,如变量声明、常量定义、运算符、流程控制语句(如if、for、while)、函数和过程等。 2. **面向对象编程**:讲解类、对象、继承、多态、封装等核心概念,以及如何在...

    Delphi7 及Delphi2010下用GDI+实现颜色渐变

    在Delphi 2010中,由于引入了VCL Forms的增强,与GDI+的交互变得更加简单。例如,你可以直接使用TGraphicControl的Canvas属性,而无需显式创建TGraphics对象。同时,GDI+的接口也进行了封装,使得操作更加直观。 在...

    Almdev StyleControls 4.51_Full Source.rar_StyleControls_VCL Styl

    StyleControls is a stable, powerful package (more than 100 components), which uses Classic drawing, system Themes, GDI+ and VCL Styles. This package contains the unique solutions to extend standard ...

    Delphi使用GDI实现图像镜像翻转

    Delphi作为流行的Windows应用程序开发工具,其VCL库与GDI接口紧密结合,使得开发者能够方便地利用GDI的功能。 首先,我们要理解图像翻转的原理。图像的镜像翻转主要有两种类型:水平翻转(也称为左右翻转)和垂直...

    SVGIconImageList:渲染SVG的三个引擎(GDI +,Direct2D或Cairo)和四个组件来简化SVG图像的使用(调整大小,固定颜色,灰度...)

    渲染SVG的三个引擎(GDI +,Direct2D或Cairo)和四个组件来简化SVG图像的使用(调整大小,固定颜色,灰度...) 实际正式版2.2.5(VCL + FMX) 成分 描述 TSVGIconImageCollection是Delphi的SVG图像的集合,以提供...

    Almediadev StyleControls VCL 5.50 SOURCE

    StyleControls 是一个稳定、强大的包(超过 100 个组件),它使用经典绘图、系统主题、GDI+ 和 VCL 样式。该软件包包含扩展标准 VCL 控件的独特解决方案,还包含许多独特的高级控件,可用于创建具有 Fluent UI Blur ...

    gdiplus for delphi 2009

    《GDI+在Delphi 2009中的应用与实现》 GDI+(Graphics Device Interface Plus)是微软推出的一个图形处理库,它在Windows操作系统中提供了丰富的绘图功能,包括矢量图形、位图操作、颜色管理等。本文将深入探讨如何...

    Delphi GDI+实现半透明异型窗口(使用PNG图片)

    我觉得这个窗体的样子很不错,窗体支持右键菜单,还可以设置窗口置顶和更换PNG图片,原来使用GDI+技术,用PNG就能实现这么漂亮、个性的半透明窗体,也让我对Delphi产生了信心,作者和时间:2008 赵述杰。 运行环境...

Global site tag (gtag.js) - Google Analytics