delphi XE2 之 FireMonkey 入门6-10  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi XE2 之 FireMonkey 入门6-10



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