Delphi XE2 之 FireMonkey 入门(6) - TLine、TEllipse、TCircle、TPie、TArc、TRectangle、TRoundRect、TCalloutRectangle
它们都是继承自 TShape 类, 共同拥有如下属性:
--------------------------------------------------------------------------------
Fill : TBrush; //填充
Stroke : TBrush; //边线(画笔)
StrokeThickness : Single; //厚度(边线宽度)
StrokeCap : TStrokeCap; //线帽样式, TStrokeCap (枚举)类型
StrokeDash : TStrokeDash; //虚线样式, TStrokeDash(枚举)类型
StrokeJoin : TStrokeJoin; //拐点结合样式, TStrokeJoin(枚举)类型
ShapeRect : TRectF; //可填充范围的矩形(相对于当前图形)
--------------------------------------------------------------------------------
TLine 用不着 Fill, 但增加了 LineType 属性(TLineType 枚举类型);
--------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
Line1.LineType := TLineType.ltDiagonal; //斜线
Line2.LineType := TLineType.ltTop; //横线
Line3.LineType := TLineType.ltLeft; //竖线
end;
--------------------------------------------------------------------------------
TElipse 和 TCircle 没有新属性, 应该也用不着 StrokeCap、StrokeJoin.
--------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
Ellipse1.StrokeDash := TStrokeDash.sdDot; //虚线样式
Circle1.Fill.Kind := TBrushKind.bkNone; //取消填充
end;
--------------------------------------------------------------------------------
TArc 和 TPie 增加了 StartAngle、EndAngle 属性.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
TRectangle 增加了控制圆角的 XRadius、YRadius 属性、控制边线的 Sides 属性、控制四个角的 Corners、CornerType 属性;
TRoundRect 只加了 Corners 属性; 看来要做更随意的圆角矩形得用 TRectangle 而不是 TRoundRect.
--------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
Rectangle1.Position.X := 50;
Rectangle1.Position.Y := 10;
Rectangle1.Width := 100;
Rectangle1.Height := 120;
Rectangle1.StrokeThickness := 16;
Rectangle1.Fill.Color := $80FF0000;
Rectangle1.Stroke.Color := $800000FF;
Rectangle1.XRadius := 8;
Rectangle1.YRadius := 8;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Rectangle2.Position.X := 350;
Rectangle2.Position.Y := 10;
Rectangle2.Width := 100;
Rectangle2.Height := 120;
Rectangle2.StrokeThickness := 4;
Rectangle2.Fill.Color := claRed;
Rectangle2.Stroke.Color := claBlack;
Rectangle2.CornerType := TCornerType.ctBevel;
Rectangle2.Corners := [TCorner.crBottomLeft, TCorner.crBottomRight];
Rectangle2.Sides := [TSide.sdBottom, TSide.sdRight];
//关于 Corners 和 Sides 还有两个非常方便的常量: AllCorners、AllSides
end;
--------------------------------------------------------------------------------
TCalloutRectangle 很有意思, 矩形外带一个三角, 应该是用于图形化的注释.
给它增加的 CalloutWidth、CalloutLength、CalloutPosition、CalloutOffset 四个属性都是用于控制三角的.
--------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
CalloutRectangle1.Width := 200;
CalloutRectangle1.Height := 150;
CalloutRectangle1.CalloutPosition := TCalloutPosition.cpBottom;
CalloutRectangle1.CalloutWidth := CalloutRectangle1.Width / 4;
CalloutRectangle1.CalloutLength := CalloutRectangle1.Height / 2;
CalloutRectangle1.CalloutOffset := -CalloutRectangle1.Width / 2;
end;
--------------------------------------------------------------------------------
这其中需要进一步学习的是 Fill、Stroke 属性, 它们都是 TBrush 类型, 会涉及到 TBitmap、TBitmapObject、TCanvas 等等.
$show_page$
Delphi XE2 之 FireMonkey 入门(7) - TText 与 TFont
TText 也是从 TShape(TControl -> TShape)继承;
而与之类似的 TLabel 的继承序列是 TControl -> TStyledControl -> TTextControl -> TLabel.
--------------------------------------------------------------------------------
TText 的主要成员:
--------------------------------------------------------------------------------
{ 属性 }
Text : string; //文本内容
Font : TFont; //字体
Fill : TBrush; //文本画刷
HorzTextAlign : TTextAlign; //横向对齐
VertTextAlign : TTextAlign; //纵向对齐
AutoSize : Boolean; //改变控件大小以适合文本
Stretch : Boolean; //拉伸文本以适合控件
WordWrap : Boolean; //是否换行
{ 方法 }
Realign; //重新对齐
--------------------------------------------------------------------------------
TFont(来自 FMX.Types) 的主要成员:
--------------------------------------------------------------------------------
{ 属性 }
Family : TFontName; //名称
Size : Single; //大小
Style : TFontStyles; //样式
--------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
Text1.Align := TAlignLayout.alClient;
Text1.Text := ' Delphi XE2 ';
Text1.Font.Family := '微软雅黑';
Text1.Font.Size := 32;
Text1.Font.Style := [TFontStyle.fsBold, TFontStyle.fsUnderline];
Text1.Fill.Color := claRed;
Text1.Stretch := True;
end;
$show_page$
Delphi XE2 之 FireMonkey 入门(8) - TImage
TImage 主要成员:
--------------------------------------------------------------------------------
{ 属性 }
Bitmap : TBitmap; //图像
BitmapMargins : TBounds; //边缘空白
WrapMode : TImageWrapMode; //枚举; iwOriginal、iwFit、iwStretch、iwTile(原始、适合、拉伸、平铺)
DisableInterpolation : Boolean; //是否使用(像素)插入算法
--------------------------------------------------------------------------------
另有 TImageViewer、TImageControl 和 TImage 类似.
TImageViewer 继承自 TScrollBox, 可自动加滚动条;
TImageControl 继承自 TStyledControl, 可设置样式、且可在选择时呈现焦点.
--------------------------------------------------------------------------------
添加 TImage、TImageViewer、TImageControl、TOpenDialog 和若干 TButton 后测试:
--------------------------------------------------------------------------------
//Bitmap 属性测试
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Image1.Bitmap.LoadFromFile(OpenDialog1.FileName);
ImageControl1.Bitmap.LoadFromFile(OpenDialog1.FileName);
ImageViewer1.Bitmap.LoadFromFile(OpenDialog1.FileName);
end;
end;
//WrapMode 属性测试
procedure TForm1.Button2Click(Sender: TObject);
begin
Image1.WrapMode := TImageWrapMode(Tag); //iwOriginal, iwFit, iwStretch, iwTile
Tag := Tag + 1;
if Tag = 4 then Tag := 0;
end;
//BitmapMargins 属性测试
procedure TForm1.Button3Click(Sender: TObject);
begin
with Image1.BitmapMargins do
begin
Left := Left + 10;
end;
Image1.Bitmap.BitmapChanged; //刷新
end;
//DisableInterpolation 属性测试
procedure TForm1.Button4Click(Sender: TObject);
begin
Image1.DisableInterpolation := not Image1.DisableInterpolation;
Image1.Bitmap.BitmapChanged;
end;
$show_page$
Delphi XE2 之 FireMonkey 入门(9) - TBitmap
TBitmap 主要成员:
--------------------------------------------------------------------------------
{ 方法 }
SetSize(); //设置大小
Clear(); //取消, 就是用指定颜色覆盖
ClearRect(); //覆盖指定矩形范围, 默认覆盖为透明色
BitmapChanged(); //刷新改变
IsEmpty(); //是否为空
UpdateHandles(); //将 Handles 数组中的对象标记为需要更新
AddFreeNotify(); //将指定对象添加到可以释放的列表; 这一般是针对添加到 Handles 中的对象
RemoveFreeNotify(); //释放指定对象; 这一般是针对添加到 Handles 中的对象
Rotate(); //旋转角度
FlipHorizontal(); //水平翻转
FlipVertical(); //垂直翻转
InvertAlpha(); //翻转透明度, 只适于透明图片
FillColor(); //填充遮罩色, 用于透明图片
CreateMask(); //建立蒙版; 是从 TBitmap 中把各像素的透明度提取为一个数组, 返回数组指针
ApplyMask(); //添加蒙版, 其参数应该是有 CreateMask() 建立的
CreateThumbnail(); //建立略缩图
LoadFromFile(); //从文件载入
LoadFromStream(); //从流中载入
LoadThumbnailFromFile(); //从文件载入为略缩图
SaveToFile(); //保存到文件
SaveToStream(); //保存到流
HandleRemove(); //从 Handles 数组移除对象, 并没有释放
HandleAdd(); //添加对象到 Handles 数组
HandleExists(); //判断指定对象是否已添加到 Handles 数组
{ 属性 }
Width : Integer; //宽
Height : Integer; //高
Handles[AItem: Pointer] : Pointer; //访问 Handles 中的对象, 索引是指针; 写入前需要先 HandleAdd();
HandlesNeedUpdate[AItem: Pointer] : Boolean; //判断 Handles 中的指定对象是否需要更新
Canvas : TCanvas; //获取绘图表面
Pixels[X, Y: Integer] : TAlphaColor; //获取或设置指定位置的颜色值
ScanLine[Y: Integer] : PAlphaColorArray; //获取一条横线上的像素数组的指针
StartLine : PAlphaColorArray; //获取像素数组的指针
ResourceBitmap : TBitmap; //该属性应该是内部使用的
StyleLookup : string; //这应该是和控件的造型相关的, 暂不知 TBitmap 要它干嘛
{ 事件 }
OnChange: TNotifyEvent; //
--------------------------------------------------------------------------------
Create()、SetSize()、Clear()、IsEmpty():
--------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
bit: TBitmap;
begin
bit := TBitmap.Create(0, 0);
ShowMessage(BoolToStr(bit.IsEmpty, True));
bit.SetSize(100, 100);
ShowMessage(BoolToStr(bit.IsEmpty, True));
bit.Clear(claRed);
Image1.Bitmap.Assign(bit);
bit.Free;
end;
--------------------------------------------------------------------------------
Rotate()、FlipHorizontal()、FlipVertical():
--------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Image1.Bitmap.LoadFromFile(OpenDialog1.FileName);
Image1.WrapMode := TImageWrapMode.iwFit;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('Rotate');
Image1.Bitmap.Rotate(60);
ShowMessage('FlipHorizontal');
Image1.Bitmap.FlipHorizontal;
ShowMessage('FlipVertical');
Image1.Bitmap.FlipVertical;
end;
--------------------------------------------------------------------------------
FillColor():
--------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Image1.Bitmap.LoadFromFile(OpenDialog1.FileName); //要个透明图片
Image1.WrapMode := TImageWrapMode.iwFit;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Bitmap.FillColor($800000FF);
// Image1.Bitmap.FillColor($FF0000FF);
end;
--------------------------------------------------------------------------------
CreateMask()、ApplyMask():
--------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Image1.Bitmap.LoadFromFile(OpenDialog1.FileName); //要个透明图片
Image1.WrapMode := TImageWrapMode.iwFit;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
bit: TBitmap;
bitAs: PByteArray;
begin
bit := TBitmap.Create(0, 0);
bit.Assign(Image1.Bitmap); //从 Image1 复制 TBitmap
bitAs := bit.CreateMask;
Image1.Bitmap.Clear(claBlue);
Image1.Bitmap.ApplyMask(bitAs);
bit.Free;
end;
--------------------------------------------------------------------------------
StartLine: 尽管该属性是只读的, 但因为是指针, 所以可以直接改写像素.
--------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Image1.Bitmap.LoadFromFile(OpenDialog1.FileName); //要个透明图片
Image1.WrapMode := TImageWrapMode.iwFit;
end;
end;
//点击按钮调整图像的透明度
procedure TForm1.Button1Click(Sender: TObject);
var
bit: TBitmap;
bts: PAlphaColorArray;
i: Integer;
j: Integer;
begin
bit := TBitmap.Create(0, 0);
bit.Assign(Image1.Bitmap);
bts := bit.StartLine;
for i := 0 to bit.Width - 1 do
for j := 0 to bit.Height - 1 do
TAlphaColorRec(bts[i*j]).A := TAlphaColorRec(bts[i*j]).A div 2; //现在通过数组指针可以直接索引元素了, 太好
Image1.Bitmap.Assign(bit);
bit.Free;
end;
--------------------------------------------------------------------------------
Pixels[X, Y: Integer]:
--------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Image1.Bitmap.LoadFromFile(OpenDialog1.FileName); //要个透明图片
Image1.WrapMode := TImageWrapMode.iwFit;
Image1.Position.X := 0;
Image1.Position.Y := 0;
Image1.Width := Image1.Bitmap.Width;
Image1.Height := Image1.Bitmap.Height;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
bit: TBitmap;
W,H,i,j: Integer;
R: TRectF;
begin
W := Trunc(Image1.Width);
H := Trunc(Image1.Height);
bit := TBitmap.Create(W div 2, H div 2);
for i := 0 to W - 1 do
for j := 0 to H - 1 do
begin
if Odd(i) and Odd(j) then //复制单数行以缩小图像一倍
bit.Pixels[i div 2, j div 2] := Image1.Bitmap.Pixels[i, j];
end;
Image1.Width := bit.Width;
Image1.Height := bit.Height;
Image1.Bitmap.Assign(bit);
Realign;
bit.Free;
end;
--------------------------------------------------------------------------------
Handles 相关: TBitmap 内部管理着一个对象数组, 访问索引也是一个指针.
--------------------------------------------------------------------------------
var
bit1,bit2,bit3: TBitmap;
procedure TForm1.FormCreate(Sender: TObject);
begin
bit1 := TBitmap.Create(100, 100);
bit2 := TBitmap.Create(100, 100);
bit3 := TBitmap.Create(100, 100);
bit1.Clear(claRed);
bit2.Clear(claGreen);
bit3.Clear(claBlue);
Image1.Width := 100;
Image1.Height := 100;
Image1.Bitmap.HandleAdd(Button1);
Image1.Bitmap.Handles[Button1] := bit1;
Image1.Bitmap.HandleAdd(Button2);
Image1.Bitmap.Handles[Button2] := bit2;
Image1.Bitmap.HandleAdd(Button3);
Image1.Bitmap.Handles[Button3] := bit3;
Button2.OnClick := Button1.OnClick;
Button3.OnClick := Button1.OnClick;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Bitmap := Image1.Bitmap.Handles[Sender];
end;
--------------------------------------------------------------------------------
通过 FMX.Types 单元中的 GetMeasureBitmap() 函数可以快速获取 1*1 的 TBitmap 对象.
$show_page$
Delphi XE2 之 FireMonkey 入门(10) - 常用结构 TPoint、TPointF、TSmallPoint、TSize、TRect、TRectF 及相关方法
它们都是结构, TPointF、TRectF 属新增, 其它也都有升级; 现在都拥有丰富的方法和方便的运算符重载; 且有一组相关的公共函数.
这组内容重要的是它们都来自 System.Types 单元, 也就是不仅仅在 FM 中可用.
--------------------------------------------------------------------------------
TPoint:
--------------------------------------------------------------------------------
Create(); //
{运算符重载}
Equal; // =
NotEqual; // <>
Add; // +
Subtract; // -
Implicit; // 可从 TSmallPoint 隐身转换到 TPoint
Explicit; // 可显示转换到 TSmallPoint
{方法}
Distance(); // 计算两点之间的距离
SetLocation(); // 重定位
Offset(); // 偏移
Add(); // 加
Subtract(); // 减
IsZero(); // 是否在 [0,0] 点
{数据成员}
X,Y: Longint;
{ 测试 }
procedure TForm1.Button1Click(Sender: TObject);
var
p1,p2,p3: TPoint;
begin
p1 := TPoint.Create(11, 22);
p2.Create(11, 11);
p3 := p1 + p2;
ShowMessageFmt('%d,%d', [p3.X, p3.Y]); //22,33
p3.SetLocation(0, 0);
p3 := p1.Add(p2);
ShowMessageFmt('%d,%d', [p3.X, p3.Y]); //22,33
end;
--------------------------------------------------------------------------------
TPointF: 比 TPoint 多出三个方法:
--------------------------------------------------------------------------------
Ceiling(); //
Truncate(); //
Round(); //
procedure TForm1.Button1Click(Sender: TObject);
var
pf: TPointF;
p1,p2,p3: TPoint;
begin
pf.Create(1.4, 1.6);
p1 := pf.Ceiling;
p2 := pf.Truncate;
p3 := pf.Round;
ShowMessageFmt('%d,%d %d,%d %d,%d', [p1.X, p1.Y, p2.X, p2.Y, p3.X, p3.Y]); //2,2 1,1 1,2
end;
--------------------------------------------------------------------------------
TSmallPoint: 用得少, 成员也少.
--------------------------------------------------------------------------------
Create(); //
{运算符重载}
Equal; // =
NotEqual; // <>
Add; // +
Subtract; // -
{方法}
Add(); // 加
Subtract(); // 减
Distance(); // 计算两点间距
IsZero(); // 是否是 [0,0] 点
{数据成员}
X,Y: SmallInt;
--------------------------------------------------------------------------------
TSize:
--------------------------------------------------------------------------------
Create(); //
{运算符重载}
Equal; // =
NotEqual; // <>
Add; // +
Subtract; // -
{方法}
Add(); // 加
Subtract(); // 减
Distance(); // 计算两点间距
IsZero(); // 是否是 [0,0] 点
{属性}
Width; //
Height; //
{数据成员}
cx,cy: Single;
--------------------------------------------------------------------------------
TRect:
--------------------------------------------------------------------------------
Create(); //建立时和可同时规格化矩形; 参见 NormalizeRect() 方法
{运算符重载}
Equal; // =
NotEqual; // <>
Add; // + (并集)
Multiply; // * (交集)
{类方法}
Empty; //获取一个空的 TRect 对象; 内联
Intersect; //获取两个矩形的交集矩形
Union; //获取两个矩形的并集矩形
{方法}
NormalizeRect(); //规格化矩形; 当 Top > Bottom 或 Left > Right 时, 会置换数据使之合理.
IsEmpty(); //是否为空
Contains(); //是否包含指定点或指定矩形
IntersectsWith(); //判断和指定矩形是否交叉
Intersect(); //和指定矩形进行交集运算
Union(); //和指定矩形进行并集运算
Offset(); //偏移
SetLocation(); //设置新原点
Inflate(); //放大矩形(保持中心点)
CenterPoint(); //获取中心点
SplitRect(); //切除, TSplitRectType 枚举(Left、Top、Right、Bottom)指示要留住的一边
{属性}
Width: Integer; //有这些属性很方便
Height: Integer; //
Size: TSize; //
Location: TPoint; //
{数据结构, 这同前}
(Left, Top, Right, Bottom: Longint) 或 (TopLeft, BottomRight: TPoint)
--------------------------------------------------------------------------------
TRectF: 只比 TRect 多出了转换到 TRect 时关于小数取舍的三个方法.
--------------------------------------------------------------------------------
Ceiling(); //
Truncate(); //
Round(); //
--------------------------------------------------------------------------------
相关的公共函数与过程:
--------------------------------------------------------------------------------
{ function }
EqualRect(); //判断 TRect 或 TRectF 是否相等
Rect(); //构建 TRect
RectF(); //构建 TRectF
NormalizeRectF(); //从 TPointF 数组规格化出一个 TRectF
NormalizeRect(); //规格化 TRectF
RectWidth(); //获取矩形宽度
RectHeight(); //获取矩形高度
RectCenter(); //让矩形在另一指定矩形中居中
Bounds(); //根据原点、宽、高构建矩形
Point(); //构建 TPoint
PointF(); //构建 TPointF
MinPoint(); //比对两个点返回小的(优先判断了 Y)
ScalePoint(); //按指定比例移动点
SmallPoint(); //构建 TSmallPoint
PtInRect(); //判断点是否在指定矩形中
PtInCircle(); //判断点是否在指定了中心与半径的圆中
IntersectRect(); //判断两矩形是否相交
UnionRect(); //结合两矩形
IsRectEmpty(); //判断矩形是否为空
OffsetRect(); //偏移矩形
CenterPoint(); //获取矩形中心点
SplitRect(); //矩形切除
CenteredRect(); //算出两个矩形的中间过渡矩形; 应该是用于动画的
IntersectRectF(); //输出两矩形的交集
UnionRectF(); //输出两矩形的并集
{ procedure }
MultiplyRect(); //按比放缩矩形
InflateRect(); //按量放缩矩形
Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号
执行时间: 0.17197394371033 seconds