您的位置:首页 > 编程语言 > Delphi

【读书笔记】【Delphi高手突破】TCanvas

2015-01-06 14:48 381 查看
1,VCL将GDI的设备抽象成一个画布(Canvas)

TCanvas = class(TPersistent)

private
FHandle: HDC;

State: TCanvasState;
FFont: TFont;

FPen: TPen;

FBrush: TBrush;


FPenPos: TPoint;

FCopyMode: TCopyMode;

FOnChange: TNotifyEvent;

FOnChanging: TNotifyEvent;

FLock: TRTLCriticalSection;

FLockCount: Integer;

FTextFlags: Longint;

procedure CreateBrush;

procedure CreateFont;

procedure CreatePen;

procedure BrushChanged(ABrush: TObject);

procedure DeselectHandles;

function GetCanvasOrientation: TCanvasOrientation;

function GetClipRect: TRect;

function GetHandle: HDC;

function GetPenPos: TPoint;

function GetPixel(X, Y: Integer): TColor;

procedure FontChanged(AFont: TObject);

procedure PenChanged(APen: TObject);

procedure SetBrush(Value: TBrush);

procedure SetFont(Value: TFont);

procedure SetHandle(Value: HDC);

procedure SetPen(Value: TPen);

procedure SetPenPos(Value: TPoint);

procedure SetPixel(X, Y: Integer; Value: TColor);

protected

procedure Changed; virtual;

procedure Changing; virtual;

procedure CreateHandle; virtual;

procedure RequiredState(ReqState: TCanvasState);

public

constructor Create;

destructor Destroy; override;

procedure Arc(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);

procedure BrushCopy(const Dest: TRect; Bitmap: TBitmap;

const Source: TRect; Color: TColor);

procedure Chord(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);

procedure CopyRect(const Dest: TRect; Canvas: TCanvas;

const Source: TRect);

procedure Draw(X, Y: Integer; Graphic: TGraphic);

procedure DrawFocusRect(const Rect: TRect);

procedure Ellipse(X1, Y1, X2, Y2: Integer); overload;

procedure Ellipse(const Rect: TRect); overload;

procedure FillRect(const Rect: TRect);

procedure FloodFill(X, Y: Integer; Color: TColor;

FillStyle: TFillStyle);

procedure FrameRect(const Rect: TRect);

function HandleAllocated: Boolean;

procedure LineTo(X, Y: Integer);

procedure Lock;

procedure MoveTo(X, Y: Integer);

procedure Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);

procedure Polygon(const Points: array of TPoint);

procedure Polyline(const Points: array of TPoint);

procedure PolyBezier(const Points: array of TPoint);

procedure PolyBezierTo(const Points: array of TPoint);

procedure Rectangle(X1, Y1, X2, Y2: Integer); overload;

procedure Rectangle(const Rect: TRect); overload;

procedure Refresh;

procedure RoundRect(X1, Y1, X2, Y2, X3, Y3: Integer);

procedure StretchDraw(const Rect: TRect; Graphic: TGraphic);

function TextExtent(const Text: string): TSize;

function TextHeight(const Text: string): Integer;

procedure TextOut(X, Y: Integer; const Text: string);

procedure TextRect(Rect: TRect; X, Y: Integer; const Text: string);

function TextWidth(const Text: string): Integer;

function TryLock: Boolean;

procedure Unlock;

property ClipRect: TRect read GetClipRect;
property Handle: HDC read GetHandle write SetHandle;

property LockCount: Integer read FLockCount;

property CanvasOrientation: TCanvasOrientation read GetCanvasOrientation;

property PenPos: TPoint read GetPenPos write SetPenPos;

property Pixels[X, Y: Integer]: TColor read GetPixel write SetPixel;

property TextFlags: Longint read FTextFlags write FTextFlags;

property OnChange: TNotifyEvent read FOnChange write FOnChange;

property OnChanging: TNotifyEvent read FOnChanging write FOnChanging;

published

property Brush: TBrush read FBrush write SetBrush;

property CopyMode: TCopyMode read FCopyMode write FCopyMode

default cmSrcCopy;

property Font: TFont read FFont write SetFont;

property Pen: TPen read FPen write SetPen;

end;

TCanvas如何获取句柄?

答案:property Handle: HDC read GetHandle write SetHandle;

TCanvas的作用?

答案:

1,TCanvas内部还拥有各种GDI基础对象的抽象,如TPen、TBrush、TFont这样的子对象,并且在TCanvas的构造函数中便创建它们的实例

2,TCanvas提供了对应于GDI绘图API的各种方法,包括在“画布”上绘制各种形状的方法,如LineTo()(画直线)、Rectangle()(画矩形)、Ellipse()(画圆/椭圆)以及直接贴位图的Draw()等。

TCanvas调用API,执行画图的路线(画直线为例)?

答案:

1,FPen := TPen.Create;

2,获取句柄(组件来完成)。(在SetHandle()方法中,除了设置FHandle的值外,还会调用SetPenPos()方法设置“画笔”的起始坐标点。)

3,TCanvas的LineTo()方法来使用画笔进行画线(首先调用RequiredState()方法,在RequiredState()方法中,会再调用CreatePen()方法来选中当前的画笔对象【在CreatePen()方法中,执行了API函数SelectObject(),将Pen对象选为当前画笔对象】)

4,最后,LineTo()方法中调用API函数LineTo()来画出直线:

Windows.LineTo(FHandle, X, Y);




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  delphi