Changeset 30 for trunk/UMetaCanvas.pas


Ignore:
Timestamp:
Apr 18, 2015, 6:17:34 PM (9 years ago)
Author:
chronos
Message:
  • Added: Automatic zooming to all existed map stations. This solve problem if too many stations were existed and some of them appeared behind window border.
  • Added: Much of used TCanvas functions are now available through TMetaCanvas.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UMetaCanvas.pas

    r29 r30  
    66
    77uses
    8   Classes, SysUtils, Graphics, Contnrs;
     8  Classes, SysUtils, Graphics, Contnrs, GraphMath, Types;
    99
    1010type
     11  TArrayOfPoint = array of TPoint;
    1112
    1213  { TCanvasObject }
     
    1415  TCanvasObject = class
    1516    procedure Paint(Canvas: TCanvas); virtual;
     17    procedure Zoom(Factor: Double); virtual;
     18    procedure Move(Delta: TPoint); virtual;
    1619  end;
    1720
     
    1922
    2023  TCanvasText = class(TCanvasObject)
     24    Brush: TBrush;
     25    Font: TFont;
    2126    Position: TPoint;
    2227    Text: string;
    2328    procedure Paint(Canvas: TCanvas); override;
     29    procedure Zoom(Factor: Double); override;
     30    procedure Move(Delta: TPoint); override;
     31    constructor Create;
     32    destructor Destroy; override;
     33  end;
     34
     35  { TCanvasRectangle }
     36
     37  TCanvasRectangle = class(TCanvasObject)
     38    Pen: TPen;
     39    Brush: TBrush;
     40    BoundingRect: TRect;
     41    procedure Paint(Canvas: TCanvas); override;
     42    procedure Zoom(Factor: Double); override;
     43    procedure Move(Delta: TPoint); override;
     44    constructor Create;
     45    destructor Destroy; override;
     46  end;
     47
     48  { TCanvasLine }
     49
     50  TCanvasLine = class(TCanvasObject)
     51    Pen: TPen;
     52    P1, P2: TPoint;
     53    procedure Paint(Canvas: TCanvas); override;
     54    procedure Zoom(Factor: Double); override;
     55    procedure Move(Delta: TPoint); override;
     56    constructor Create;
     57    destructor Destroy; override;
     58  end;
     59
     60  { TCanvasPolygon }
     61
     62  TCanvasPolygon = class(TCanvasObject)
     63    Pen: TPen;
     64    Brush: TBrush;
     65    Points: array of TPoint;
     66    procedure Paint(Canvas: TCanvas); override;
     67    procedure Zoom(Factor: Double); override;
     68    procedure Move(Delta: TPoint); override;
     69    constructor Create;
     70    destructor Destroy; override;
     71  end;
     72
     73  { TCanvasEllipse }
     74
     75  TCanvasEllipse = class(TCanvasObject)
     76    Pen: TPen;
     77    Brush: TBrush;
     78    BoundingRect: TRect;
     79    procedure Paint(Canvas: TCanvas); override;
     80    procedure Zoom(Factor: Double); override;
     81    procedure Move(Delta: TPoint); override;
     82    constructor Create;
     83    destructor Destroy; override;
     84  end;
     85
     86  { TCanvasPie }
     87
     88  TCanvasPie = class(TCanvasObject)
     89    Pen: TPen;
     90    Brush: TBrush;
     91    BoundingRect: TRect;
     92    StartPoint: TPoint;
     93    EndPoint: TPoint;
     94    procedure Paint(Canvas: TCanvas); override;
     95    procedure Zoom(Factor: Double); override;
     96    procedure Move(Delta: TPoint); override;
     97    constructor Create;
     98    destructor Destroy; override;
     99  end;
     100
     101  { TCanvasStretchDraw }
     102
     103  TCanvasStretchDraw = class(TCanvasObject)
     104    SrcGraphic: TGraphic;
     105    DestRect: TRect;
     106    procedure Paint(Canvas: TCanvas); override;
     107    procedure Zoom(Factor: Double); override;
     108    procedure Move(Delta: TPoint); override;
     109    constructor Create;
     110    destructor Destroy; override;
    24111  end;
    25112
     
    28115  TMetaCanvas = class(TCanvas)
    29116  private
    30 
     117    FSize: TPoint;
     118    FPenPos: TPoint;
     119  protected
     120    procedure SetHeight(AValue: Integer); override;
     121    function GetHeight: Integer; override;
     122    procedure SetWidth(AValue: Integer); override;
     123    function GetWidth: Integer; override;
     124    procedure DoLine (x1,y1,x2,y2:integer); override;
     125    procedure DoTextOut(X, Y: Integer; Text: string); override;
     126    procedure TextOut(X,Y: Integer; const Text: String); override;
     127    procedure DoRectangle(const Bounds: TRect); override;
     128    procedure DoRectangleFill(const Bounds: TRect); override;
     129    procedure Polygon(Points: PPoint; NumPts: Integer; Winding: boolean = False); override;
     130    procedure DoPolygon(const Points: array of TPoint); override;
     131    procedure CreateHandle; override;
     132    procedure Ellipse(x1, y1, x2, y2: Integer); override;
     133    procedure DoEllipse(const Bounds: TRect); override;
     134    procedure StretchDraw(const DestRect: TRect; SrcGraphic: TGraphic); override;
     135    function TextExtent(const Text: string): TSize; override;
     136    procedure DoMoveTo(X, Y: Integer); override;
     137    procedure DoLineTo(X, Y: Integer); override;
     138    procedure Pie(EllipseX1, EllipseY1, EllipseX2, EllipseY2,
     139      StartX, StartY, EndX, EndY: Integer); override;
    31140  public
    32141    Objects: TObjectList;
     142    procedure SetSize(Size: TPoint);
    33143    procedure Reset;
    34144    procedure DrawTo(Canvas: TCanvas);
     145    procedure Zoom(Factor: Double);
     146    procedure Move(Delta: TPoint);
    35147    constructor Create;
    36148    destructor Destroy; override;
     
    39151implementation
    40152
     153uses
     154  UGeometric;
     155
     156{ TCanvasPie }
     157
     158procedure TCanvasPie.Paint(Canvas: TCanvas);
     159begin
     160  Canvas.Brush.Assign(Brush);
     161  Canvas.Pen.Assign(Pen);
     162  Canvas.Pie(BoundingRect.Left, BoundingRect.Top,
     163    BoundingRect.Right, BoundingRect.Bottom, StartPoint.X, StartPoint.Y,
     164    EndPoint.X, EndPoint.Y);
     165end;
     166
     167procedure TCanvasPie.Zoom(Factor: Double);
     168begin
     169  BoundingRect := Rect(Trunc(BoundingRect.Left * Factor),
     170    Trunc(BoundingRect.Top * Factor),
     171    Trunc(BoundingRect.Right * Factor),
     172    Trunc(BoundingRect.Bottom * Factor));
     173  Pen.Width := Trunc(Pen.Width * Factor);
     174  StartPoint := Point(Trunc(StartPoint.X * Factor), Trunc(StartPoint.Y * Factor));
     175  EndPoint := Point(Trunc(EndPoint.X * Factor), Trunc(EndPoint.Y * Factor));
     176end;
     177
     178procedure TCanvasPie.Move(Delta: TPoint);
     179begin
     180  BoundingRect := ShiftRect(BoundingRect, Delta);
     181  StartPoint := AddPoint(StartPoint, Delta);
     182  EndPoint := AddPoint(EndPoint, Delta);
     183end;
     184
     185constructor TCanvasPie.Create;
     186begin
     187  Pen := TPen.Create;
     188  Brush := TBrush.Create;
     189end;
     190
     191destructor TCanvasPie.Destroy;
     192begin
     193  Pen.Free;
     194  Brush.Free;
     195  inherited Destroy;
     196end;
     197
     198{ TCanvasStretchDraw }
     199
     200procedure TCanvasStretchDraw.Paint(Canvas: TCanvas);
     201begin
     202  Canvas.StretchDraw(DestRect, SrcGraphic);
     203end;
     204
     205procedure TCanvasStretchDraw.Zoom(Factor: Double);
     206begin
     207  DestRect := Rect(Trunc(DestRect.Left * Factor),
     208    Trunc(DestRect.Top * Factor),
     209    Trunc(DestRect.Right * Factor),
     210    Trunc(DestRect.Bottom * Factor));
     211end;
     212
     213procedure TCanvasStretchDraw.Move(Delta: TPoint);
     214begin
     215  DestRect := ShiftRect(DestRect, Delta);
     216end;
     217
     218constructor TCanvasStretchDraw.Create;
     219begin
     220  SrcGraphic := nil;
     221end;
     222
     223destructor TCanvasStretchDraw.Destroy;
     224begin
     225  inherited Destroy;
     226end;
     227
     228{ TCanvasEllipse }
     229
     230procedure TCanvasEllipse.Paint(Canvas: TCanvas);
     231begin
     232  Canvas.Pen.Assign(Pen);
     233  Canvas.Brush.Assign(Brush);
     234  Canvas.Ellipse(BoundingRect);
     235end;
     236
     237procedure TCanvasEllipse.Zoom(Factor: Double);
     238begin
     239  BoundingRect := Rect(Trunc(BoundingRect.Left * Factor),
     240    Trunc(BoundingRect.Top * Factor),
     241    Trunc(BoundingRect.Right * Factor),
     242    Trunc(BoundingRect.Bottom * Factor));
     243  Pen.Width := Trunc(Pen.Width * Factor);
     244end;
     245
     246procedure TCanvasEllipse.Move(Delta: TPoint);
     247begin
     248  BoundingRect := ShiftRect(BoundingRect, Delta);
     249end;
     250
     251constructor TCanvasEllipse.Create;
     252begin
     253  Pen := TPen.Create;
     254  Brush := TBrush.Create;
     255end;
     256
     257destructor TCanvasEllipse.Destroy;
     258begin
     259  Pen.Free;
     260  Brush.Free;
     261  inherited Destroy;
     262end;
     263
     264{ TCanvasPolygon }
     265
     266procedure TCanvasPolygon.Paint(Canvas: TCanvas);
     267begin
     268  Canvas.Pen.Assign(Pen);
     269  Canvas.Brush.Assign(Brush);
     270  Canvas.Polygon(Points);
     271end;
     272
     273procedure TCanvasPolygon.Zoom(Factor: Double);
     274var
     275  I: Integer;
     276begin
     277  for I := 0 to High(Points) do
     278    Points[I] := Point(Trunc(Points[I].X * Factor),
     279      Trunc(Points[I].Y * Factor));
     280  Pen.Width := Trunc(Pen.Width * Factor);
     281end;
     282
     283procedure TCanvasPolygon.Move(Delta: TPoint);
     284var
     285  I: Integer;
     286begin
     287  for I := 0 to High(Points) do
     288    Points[I] := AddPoint(Points[I], Delta);
     289end;
     290
     291constructor TCanvasPolygon.Create;
     292begin
     293  Pen := TPen.Create;
     294  Brush := TBrush.Create;
     295end;
     296
     297destructor TCanvasPolygon.Destroy;
     298begin
     299  Brush.Free;
     300  Pen.Free;
     301  inherited Destroy;
     302end;
     303
     304{ TCanvasLine }
     305
     306procedure TCanvasLine.Paint(Canvas: TCanvas);
     307begin
     308  Canvas.Pen.Assign(Pen);
     309  Canvas.Line(P1, P2);
     310end;
     311
     312procedure TCanvasLine.Zoom(Factor: Double);
     313begin
     314  P1 := Point(Trunc(P1.X * Factor), Trunc(P1.Y * Factor));
     315  P2 := Point(Trunc(P2.X * Factor), Trunc(P2.Y * Factor));
     316  Pen.Width := Trunc(Pen.Width * Factor);
     317end;
     318
     319procedure TCanvasLine.Move(Delta: TPoint);
     320begin
     321  P1 := AddPoint(P1, Delta);
     322  P2 := AddPoint(P2, Delta);
     323end;
     324
     325constructor TCanvasLine.Create;
     326begin
     327  Pen := TPen.Create;
     328end;
     329
     330destructor TCanvasLine.Destroy;
     331begin
     332  Pen.Free;
     333  inherited Destroy;
     334end;
     335
     336{ TCanvasRectangle }
     337
     338procedure TCanvasRectangle.Paint(Canvas: TCanvas);
     339begin
     340  Canvas.Pen.Assign(Pen);
     341  Canvas.Brush.Assign(Brush);
     342  Canvas.Rectangle(BoundingRect);
     343end;
     344
     345procedure TCanvasRectangle.Zoom(Factor: Double);
     346begin
     347  BoundingRect := Rect(Trunc(BoundingRect.Left * Factor),
     348    Trunc(BoundingRect.Top * Factor),
     349    Trunc(BoundingRect.Right * Factor),
     350    Trunc(BoundingRect.Bottom * Factor));
     351  Pen.Width := Trunc(Pen.Width * Factor);
     352end;
     353
     354procedure TCanvasRectangle.Move(Delta: TPoint);
     355begin
     356  ShiftRect(BoundingRect, Delta);
     357end;
     358
     359constructor TCanvasRectangle.Create;
     360begin
     361  Pen := TPen.Create;
     362  Brush := TBrush.Create;
     363end;
     364
     365destructor TCanvasRectangle.Destroy;
     366begin
     367  Pen.Free;
     368  Brush.Free;
     369  inherited Destroy;
     370end;
     371
    41372{ TCanvasText }
    42373
    43374procedure TCanvasText.Paint(Canvas: TCanvas);
    44375begin
     376  Canvas.Brush.Assign(Brush);
     377  Canvas.Font.Assign(Font);
    45378  Canvas.TextOut(Position.X, Position.Y, Text);
    46379end;
    47380
     381procedure TCanvasText.Zoom(Factor: Double);
     382begin
     383  Position := Point(Trunc(Position.X * Factor), Trunc(Position.Y * Factor));
     384  Font.Size := Trunc(Font.Size * Factor);
     385end;
     386
     387procedure TCanvasText.Move(Delta: TPoint);
     388begin
     389  Position := AddPoint(Position, Delta);
     390end;
     391
     392constructor TCanvasText.Create;
     393begin
     394  Font := TFont.Create;
     395  Brush := TBrush.Create;
     396end;
     397
     398destructor TCanvasText.Destroy;
     399begin
     400  Brush.Free;
     401  Font.Free;
     402  inherited Destroy;
     403end;
     404
    48405{ TCanvasObject }
    49406
     
    53410end;
    54411
     412procedure TCanvasObject.Zoom(Factor: Double);
     413begin
     414
     415end;
     416
     417procedure TCanvasObject.Move(Delta: TPoint);
     418begin
     419end;
     420
    55421{ TMetaCanvas }
     422
     423procedure TMetaCanvas.SetHeight(AValue: Integer);
     424begin
     425  FSize.Y := AValue;
     426end;
     427
     428function TMetaCanvas.GetHeight: Integer;
     429begin
     430  Result := FSize.Y;
     431end;
     432
     433procedure TMetaCanvas.SetWidth(AValue: Integer);
     434begin
     435  FSize.X := AValue;
     436end;
     437
     438function TMetaCanvas.GetWidth: Integer;
     439begin
     440  Result := FSize.X;
     441end;
     442
     443procedure TMetaCanvas.DoLine(x1, y1, x2, y2: integer);
     444var
     445  NewObj: TCanvasLine;
     446begin
     447  NewObj := TCanvasLine.Create;
     448  NewObj.Pen.Assign(Pen);
     449  NewObj.P1 := Point(X1, Y1);
     450  NewObj.P2 := Point(X2, Y2);
     451  Objects.Add(NewObj);
     452end;
     453
     454procedure TMetaCanvas.DoTextOut(X, Y: Integer; Text: string);
     455var
     456  NewObj: TCanvasText;
     457begin
     458  NewObj := TCanvasText.Create;
     459  NewObj.Font.Assign(Font);
     460  NewObj.Brush.Assign(Brush);
     461  NewObj.Position := Point(X, Y);
     462  NewObj.Text := Text;
     463  Objects.Add(NewObj);
     464end;
     465
     466procedure TMetaCanvas.TextOut(X, Y: Integer; const Text: String);
     467begin
     468  DoTextOut(X, Y, Text);
     469end;
     470
     471procedure TMetaCanvas.DoRectangle(const Bounds: TRect);
     472var
     473  NewObj: TCanvasRectangle;
     474begin
     475  NewObj := TCanvasRectangle.Create;
     476  NewObj.Pen.Assign(Pen);
     477  NewObj.BoundingRect := Bounds;
     478  Objects.Add(NewObj);
     479end;
     480
     481procedure TMetaCanvas.DoRectangleFill(const Bounds: TRect);
     482var
     483  NewObj: TCanvasRectangle;
     484begin
     485  NewObj := TCanvasRectangle.Create;
     486  NewObj.Brush.Assign(Brush);
     487  NewObj.Pen.Assign(Pen);
     488  NewObj.BoundingRect := Bounds;
     489  Objects.Add(NewObj);
     490end;
     491
     492procedure TMetaCanvas.Polygon(Points: PPoint; NumPts: Integer; Winding: boolean
     493  );
     494var
     495  APoints: array of TPoint;
     496  I: Integer;
     497begin
     498  SetLength(APoints, NumPts);
     499  for I := 0 to High(APoints) do
     500    APoints[I] := Points[I];
     501  DoPolygon(APoints);
     502end;
     503
     504procedure TMetaCanvas.DoPolygon(const Points: array of TPoint);
     505var
     506  NewObj: TCanvasPolygon;
     507  I: Integer;
     508begin
     509  NewObj := TCanvasPolygon.Create;
     510  NewObj.Brush.Assign(Brush);
     511  NewObj.Pen.Assign(Pen);
     512  SetLength(NewObj.Points, Length(Points));
     513  for I := 0 to High(Points) do
     514    NewObj.Points[I] := Points[I];
     515  Objects.Add(NewObj);
     516end;
     517
     518procedure TMetaCanvas.CreateHandle;
     519begin
     520end;
     521
     522procedure TMetaCanvas.Ellipse(x1, y1, x2, y2: Integer);
     523begin
     524  DoEllipse(Rect(X1, Y1, X2, Y2));
     525end;
     526
     527procedure TMetaCanvas.DoEllipse(const Bounds: TRect);
     528var
     529  NewObj: TCanvasEllipse;
     530begin
     531  NewObj := TCanvasEllipse.Create;
     532  NewObj.Brush.Assign(Brush);
     533  NewObj.Pen.Assign(Pen);
     534  NewObj.BoundingRect := Bounds;
     535  Objects.Add(NewObj);
     536end;
     537
     538procedure TMetaCanvas.StretchDraw(const DestRect: TRect; SrcGraphic: TGraphic);
     539var
     540  NewObj: TCanvasStretchDraw;
     541begin
     542  NewObj := TCanvasStretchDraw.Create;
     543  NewObj.SrcGraphic := SrcGraphic;
     544  NewObj.DestRect := DestRect;
     545  Objects.Add(NewObj);
     546end;
     547
     548function TMetaCanvas.TextExtent(const Text: string): TSize;
     549begin
     550  Result := Size(0, 0);
     551end;
     552
     553procedure TMetaCanvas.DoMoveTo(X, Y: Integer);
     554begin
     555  FPenPos := Point(X, Y);
     556end;
     557
     558procedure TMetaCanvas.DoLineTo(X, Y: Integer);
     559begin
     560  DoLine(FPenPos.X, FPenPos.Y, X, Y);
     561  DoMoveTo(X, Y);
     562end;
     563
     564procedure TMetaCanvas.Pie(EllipseX1, EllipseY1, EllipseX2, EllipseY2, StartX,
     565  StartY, EndX, EndY: Integer);
     566var
     567  NewObj: TCanvasPie;
     568begin
     569  NewObj := TCanvasPie.Create;
     570  NewObj.Brush.Assign(Brush);
     571  NewObj.Pen.Assign(Pen);
     572  NewObj.BoundingRect := Rect(EllipseX1, EllipseY1, EllipseX2, EllipseY2);
     573  NewObj.StartPoint := Point(StartX, StartY);
     574  NewObj.EndPoint := Point(EndX, EndY);
     575  Objects.Add(NewObj);
     576end;
     577
     578procedure TMetaCanvas.SetSize(Size: TPoint);
     579begin
     580  FSize := Size;
     581end;
    56582
    57583procedure TMetaCanvas.Reset;
     
    68594end;
    69595
     596procedure TMetaCanvas.Zoom(Factor: Double);
     597var
     598  I: Integer;
     599begin
     600  for I := 0 to Objects.Count - 1 do
     601    TCanvasObject(Objects[I]).Zoom(Factor);
     602end;
     603
     604procedure TMetaCanvas.Move(Delta: TPoint);
     605var
     606  I: Integer;
     607begin
     608  for I := 0 to Objects.Count - 1 do
     609    TCanvasObject(Objects[I]).Move(Delta);
     610end;
     611
    70612constructor TMetaCanvas.Create;
    71613begin
     614  inherited;
     615  FPenPos := Point(0, 0);
    72616  Objects := TObjectList.Create;
    73617end;
Note: See TracChangeset for help on using the changeset viewer.