powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TCanvasEx
15 сообщений из 15, страница 1 из 1
TCanvasEx
    #39470640
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваяю для целей универсальности и кроссплатформа свою обертку вокруг различных рендеров.

Предпологается простой и удобный интрефейс без заморочек с нюансами платформ.
По мотивам VCL TCanvas.

Режимы отрисовки с использованием:
GDI
GDI+
Graphics32
Direct2D
FMX renderer

Пока пре-альфа версия, но мой ГИС уже через нее рендерит под Win32/Win64/Linux/Android.
Яблочную продукцию не проверял в связи с отсутствием таковой.

CanvasEx.pas
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
unit CanvasEx;

interface

{$IF DECLARED(FireMonkeyVersion)}
  {$IF FMX.Types.FireMonkeyVersion >= 16}
    {$DEFINE FMX}
  {$IFEND}
{$ENDIF}

uses
{$IFNDEF FMX}
  GR32, GR32_Resamplers, GR32_Backends, GR32_Polygons,
{$ENDIF}
  System.Types, System.UITypes, System.SyncObjs, System.SysUtils, System.Classes,
  System.Math.Vectors,
{$IFDEF FMX}
  FMX.Graphics, FMX.Surfaces, FMX.Types;
{$ELSE}
  Winapi.Windows, Vcl.Graphics, Vcl.Direct2D, Winapi.D2D1,
  GDIPAPI, GDIPOBJ;
{$ENDIF}

{$M+}

type

{$IFDEF FMX}
  TPenStyle = (psSolid, psDash, psDot, psDashDot, psDashDotDot, psClear, psInsideFrame, psUserStyle, psAlternate);
  TBrushStyle = (bsSolid, bsClear, bsHorizontal, bsVertical, bsFDiagonal, bsBDiagonal, bsCross, bsDiagCross);

  TColor = type cardinal;   // $00BBGGRR
  TColor32 = type cardinal; // $AABBGGRR

  TColor32Helper = record helper for TColor32
    function ARGB: TColor32;
  end;

  TCanvas = FMX.Graphics.TCanvas;
  TBitmap = FMX.Graphics.TBitmap;

const
  clBlack       = $00000000;
  clDimGray     = $003F3F3F;
  clGray        = $007F7F7F;
  clLightGray   = $00BFBFBF;
  clWhite       = $00FFFFFF;
  clMaroon      = $007F0000;
  clGreen       = $00007F00;
  clOlive       = $007F7F00;
  clNavy        = $0000007F;
  clPurple      = $007F007F;
  clTeal        = $00007F7F;
  clRed         = $00FF0000;
  clLime        = $0000FF00;
  clYellow      = $00FFFF00;
  clBlue        = $000000FF;
  clFuchsia     = $00FF00FF;
  clAqua        = $0000FFFF;
  clSilver      = $00C0C0C0;

  clBlack32     = $FF000000 and clBlack;
  clDimGray32   = $FF000000 and clDimGray;
  clGray32      = $FF000000 and clGray;
  clLightGray32 = $FF000000 and clLightGray;
  clWhite32     = $FF000000 and clWhite;
  clMaroon32    = $FF000000 and clMaroon;
  clGreen32     = $FF000000 and clGreen;
  clOlive32     = $FF000000 and clOlive;
  clNavy32      = $FF000000 and clNavy;
  clPurple32    = $FF000000 and clPurple;
  clTeal32      = $FF000000 and clTeal;
  clRed32       = $FF000000 and clRed;
  clLime32      = $FF000000 and clLime;
  clYellow32    = $FF000000 and clYellow;
  clBlue32      = $FF000000 and clBlue;
  clFuchsia32   = $FF000000 and clFuchsia;
  clAqua32      = $FF000000 and clAqua;
  clSilver32    = $FF000000 and clSilver;

  clNone        = $01000000;

{$ELSE}
  TPointF = record
    X,Y : double;
  end;
{$ENDIF}

type
{$IFNDEF FMX}
  TRenderMode = (rmAuto, rmGDI, rmGDIPlus, rmGR32, rmDirect2D);
{$ELSE}
  TRenderMode = (rmAuto, rmFireMonkey);
{$ENDIF}

  TColorHelper = record helper for TColor
    function isNull: boolean;
    function isNotNull: boolean;
  end;

  TCanvasEx = class;

  TPenEx = class
  private
    FParent  : TCanvasEx;
    FColor32 : TColor32;
    FStyle   : TPenStyle;
    FWidth   : double;
    procedure SetColor32(const Value: TColor32);
    function GetColor: TColor; overload;
    procedure SetColor(Value: TColor);
    procedure SetStyle(const Value: TPenStyle);
    procedure SetWidth(const Value: double); overload;
    procedure SetWidth(const Value: integer); overload;
    function GetWidth: integer;
  public
    Optimizations : boolean;

    constructor Create(Parent: TCanvasEx);
    procedure Assign(Source: TPenEx); overload;
    procedure Assign(Source: TCanvas); overload;
{$IFNDEF FMX}
    procedure Assign(Source: TPen); overload;
{$ENDIF}
  published
    property Color: TColor read GetColor write SetColor default clWhite;
    property Width: integer read GetWidth write SetWidth;
    property WidthD: double read FWidth write SetWidth;
    property Style: TPenStyle read FStyle write SetStyle default psSolid;
    property Color32: TColor32 read FColor32 write SetColor32 default clWhite32;
  end;

  TBrushEx = class
  private
    FParent  : TCanvasEx;
    FColor32 : TColor32;
    FStyle   : TBrushStyle;
    procedure SetColor32(const Value: TColor32);
    function GetColor: TColor; overload;
    procedure SetColor(Value: TColor); overload;
    procedure SetStyle(const Value: TBrushStyle);
  public
    Optimizations : boolean;

    constructor Create(Parent: TCanvasEx);
    procedure Assign(Source: TBrushEx); overload;
    procedure Assign(Source: TCanvas); overload;
{$IFNDEF FMX}
    procedure Assign(Source: TBrush); overload;
{$ENDIF}
  published
    property Color: TColor read GetColor write SetColor default clWhite;
    property Color32: TColor32 read FColor32 write SetColor32 default clWhite32;
    property Style: TBrushStyle read FStyle write SetStyle default bsSolid;
  end;

  TFontEx = class
  private
    FParent        : TCanvasEx;
    FColor32       : TColor32;
    FName          : TFontName;
    FStyle         : TFontStyles;
    FOrientation   : Integer;
    FSize          : Integer;
    FPixelsPerInch : Integer;

{$IFNDEF FMX}
    function FontStylesToInt(FS: TFontStyles): integer;
{$ENDIF}
    function GetColor: TColor;
    procedure SetColor(const Value: TColor);
    procedure SetColor32(const Value: TColor32);
    procedure SetHeight(const Value: Integer);
    procedure SetName(const Value: TFontName);
    procedure SetOrientation(const Value: Integer);
    procedure SetSize(const Value: Integer);
    procedure SetStyle(const Value: TFontStyles);
    function GetHeight: Integer;
  public
    Optimizations  : boolean;
    Charset        : integer;

    constructor Create(Parent: TCanvasEx);
    procedure Assign(Source: TFontEx); overload;
    procedure Assign(Source: TCanvas); overload;
{$IFNDEF FMX}
    procedure Assign(Source: TFont); overload;
{$ENDIF}
  published
    property Color: TColor read GetColor write SetColor default clWhite;
    property Color32: TColor32 read FColor32 write SetColor32 default clWhite32;
    property Height: Integer read GetHeight write SetHeight;
    property Name: TFontName read FName write SetName;
    property Orientation: Integer read FOrientation write SetOrientation default 0;
    property Size: Integer read FSize write SetSize stored False;
    property Style: TFontStyles read FStyle write SetStyle;
  end;


{$IFNDEF FMX}
  TDirect2DCanvasHelper = class helper for Vcl.Direct2D.TDirect2DCanvas
    procedure LineTo(X, Y: Integer);
  end;

  TDirect2DBrushHelper = class helper for Vcl.Direct2D.TDirect2DBrush
  private
    function GetColor32: TColor32;
    procedure SetColor32(const Value: TColor32);
  public
    property Color32: TColor32 read GetColor32 write SetColor32 default clBlack32;
  end;

  TDirect2DPenHelper = class helper for Vcl.Direct2D.TDirect2DPen
  private
    function GetColor32: TColor32;
    procedure SetColor32(const Value: TColor32);
  public
    property Color32: TColor32 read GetColor32 write SetColor32 default clBlack32;
  end;
{$ENDIF}

  TCanvasEx = class
  private
    FAntialiased: boolean;
    procedure SetAntialiased(const Value: boolean);
  const
    FD2DOpLimit = 100000;
    FGR32EllipseQuality = 1;
  var
    FSource       : TCanvas;

    FPen          : TPenEx;
    FFont         : TFontEx;
    FBrush        : TBrushEx;

    FLastPenPos   : TPoint;

{$IFNDEF FMX}
    FGDI          : TCanvas;

    FGDP          : TGPGraphics;
    FGDPPen       : TGPPen;
    FGDPBrush     : TGPBrush;
    FGDPFont      : TGPFont;
    FGDPFontBrush : TGPBrush;

    FG32          : TBitmap32;
    FG32Resampler : TKernelResampler;
    FG32Poly      : TPolygon32;

    FD2D          : TDirect2DCanvas;

    FRendererMode :  TRenderMode;
{$ENDIF}
    procedure SetBrush(const Value: TBrushEx);
    procedure SetFont(const Value: TFontEx);
    procedure SetPen(const Value: TPenEx);

    function GetPixel(X, Y: Integer): TColor;
    procedure SetPixel(X, Y: Integer; Value: TColor);
    function GetClipRect: TRect;
  public
    Optimizations  : boolean;

    constructor Create(Source: TCanvas; RenderMode: TRenderMode = rmAuto);
    destructor Destroy; override;

{$IFNDEF FMX}
    function Handle: HWND;
{$ENDIF}
    function Parent: TCanvas;

    // Support

    property ClipRect: TRect read GetClipRect;

    procedure BeginUpdates;
    procedure EndUpdates;

    procedure Clear(Color: TColor); overload;
    procedure Clear(Color: TColor32); overload;

    // Draw Routines

    procedure MoveTo(X, Y: Integer);
    procedure LineTo(X, Y: Integer);

    procedure Line(X1, Y1, X2, Y2: Integer);

    procedure Polyline(const Points: array of TPoint);

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

    procedure FillRect(const Rect: TRect); overload;
    procedure FillRect(X1, Y1, X2, Y2: Integer); overload;

    procedure Polygon(const Points: array of TPoint); overload;
    procedure Polygon(const Points: array of TPointF); overload;
    procedure Polygon(Points: array of TPoint; NPoints: array of integer); overload;

    procedure Ellipse(X1, Y1, X2, Y2: double); overload;
    procedure Ellipse(X, Y, Radius: double); overload;
    procedure Ellipse(R: TRect); overload;

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

    procedure StretchDraw(const Rect: TRect; Graphic: TBitmap); overload;
{$IFNDEF FMX}
    procedure StretchDraw(const Rect: TRect; Graphic: TBitmap32); overload;
    procedure Draw(X, Y: Integer; Graphic: TGraphic);
{$ENDIF}
    procedure Draw(X, Y: Integer; Graphic: TBitmap);

    function TextHeight(const Text: string): Integer;
    function TextWidth(const Text: string): Integer;

    procedure Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer); overload;
    procedure Pie(X, Y, Radius: integer; AngleStart, AngleSize: double); overload;

    // Styles

    property AntialiasedGeometry: boolean read FAntialiased write SetAntialiased;

    property Pen: TPenEx read FPen write SetPen;
    property Brush: TBrushEx read FBrush write SetBrush;
    property Font: TFontEx read FFont write SetFont;

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



Работает как то так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure Draw(Bmp: TBitmap);
var
  CV: TCanvasEx;
begin
  CV:=TCanvasEx.Create(Bmp.Canvas);
  try
    CV.BeginUpdates;

    CV.Pen.Color:=clRed;
    CV.Pen.Style:=psSolid;
    CV.Brush.Style:=bsClear;
    CV.Rectangle(Rect);

    CV.EndUpdates;
  finally
    CV.Free;
  end;
end;



Мысли есть?
...
Рейтинг: 0 / 0
TCanvasEx
    #39470648
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Этот путь так или иначе проходили все создатели кроссплатформенных библиотек.
Мысли с ходу:
1. Почему координаты integer?
2. Юнит в пакет уже не вслючить
3. Расширяемость примерно нулевая. Если делать нормально, то канвас, пен, браш и.тд. должны быть полностью абстрактными классами.
4. Где трансформы? Без них ценность стремится к нулю.
...
Рейтинг: 0 / 0
TCanvasEx
    #39470670
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

ещё не хватает
регионов

save\restore

из движков ещё AggPas можно добавить

PS: За что всегда не любил TCanvas, так это за кривоватую архитектуру, а тут просто калька с неё. Это превращает библу в ширпотреб вроде bgrabitmap
...
Рейтинг: 0 / 0
TCanvasEx
    #39470682
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
rgreatВаяю для целей универсальности и кроссплатформа свою обертку вокруг различных рендеров.

Предпологается простой и удобный интрефейс без заморочек с нюансами платформ.
По мотивам VCL TCanvas.

Режимы отрисовки с использованием:
GDI
GDI+
Graphics32
Direct2D
FMX renderer
Мысли есть?

Есть. Всё написано до нас: Asphyre Platform eXtended Library

Очень, очень мощная штука с универсальным канвасом.
...
Рейтинг: 0 / 0
TCanvasEx
    #39470704
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

зачем столько нулевых констант?
...
Рейтинг: 0 / 0
TCanvasEx
    #39470707
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Aleksandr Sharahovrgreat,

зачем столько нулевых констант?

Да, довольно занимательно )))

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
const
  clBlack       = $00000000;
  clDimGray     = $003F3F3F;
  clGray        = $007F7F7F;
  clLightGray   = $00BFBFBF;
  clWhite       = $00FFFFFF;
  clMaroon      = $007F0000;
  clGreen       = $00007F00;
  clOlive       = $007F7F00;
  clNavy        = $0000007F;
  clPurple      = $007F007F;
  clTeal        = $00007F7F;
  clRed         = $00FF0000;
  clLime        = $0000FF00;
  clYellow      = $00FFFF00;
  clBlue        = $000000FF;
  clFuchsia     = $00FF00FF;
  clAqua        = $0000FFFF;
  clSilver      = $00C0C0C0;

  clBlack32     = $FF000000 and clBlack;
  clDimGray32   = $FF000000 and clDimGray;
  clGray32      = $FF000000 and clGray;
  clLightGray32 = $FF000000 and clLightGray;
  clWhite32     = $FF000000 and clWhite;
  clMaroon32    = $FF000000 and clMaroon;
  clGreen32     = $FF000000 and clGreen;
  clOlive32     = $FF000000 and clOlive;
  clNavy32      = $FF000000 and clNavy;
  clPurple32    = $FF000000 and clPurple;
  clTeal32      = $FF000000 and clTeal;
  clRed32       = $FF000000 and clRed;
  clLime32      = $FF000000 and clLime;
  clYellow32    = $FF000000 and clYellow;
  clBlue32      = $FF000000 and clBlue;
  clFuchsia32   = $FF000000 and clFuchsia;
  clAqua32      = $FF000000 and clAqua;
  clSilver32    = $FF000000 and clSilver;

...
Рейтинг: 0 / 0
TCanvasEx
    #39470742
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, стоит еще посмотреть на TeeChart в плане интерфейса, они давно свой TeeCanvas пишут
...
Рейтинг: 0 / 0
TCanvasEx
    #39470745
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorОчень, очень мощная штука с универсальным канвасом
Да, хорошая штука. Мне тоже понравилась
...
Рейтинг: 0 / 0
TCanvasEx
    #39470834
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahovrgreat,

зачем столько нулевых констант?Криворукость. :)

Надо не AND а OR конечно.
...
Рейтинг: 0 / 0
TCanvasEx
    #39470859
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovrgreat,

Этот путь так или иначе проходили все создатели кроссплатформенных библиотек.
Мысли с ходу:
1. Почему координаты integer?
Для большей совместимости по коду с классическими TCanvas.
Скорей всего будет больше overload-ов с float.

2. Юнит в пакет уже не вслючить
Было бы желание.

3. Расширяемость примерно нулевая. Если делать нормально, то канвас, пен, браш и.тд. должны быть полностью абстрактными классами.Да я просто в основном коде что надо допишу. Зачем так усложнять?

4. Где трансформы? Без них ценность стремится к нулю.Мне пока за всю жизнь не пригождались.
Обходился математекой.
Потому не приоритет.
...
Рейтинг: 0 / 0
TCanvasEx
    #39470867
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)rgreat,

ещё не хватает
регионов

Планироал добавить позже.

save\restore

Ага, хорошая идея.

из движков ещё AggPas можно добавить
Он стоит того?

PS: За что всегда не любил TCanvas, так это за кривоватую архитектуру, а тут просто калька с неё. Это превращает библу в ширпотреб вроде bgrabitmapА что там с архитектурой тебя не прет?
...
Рейтинг: 0 / 0
TCanvasEx
    #39470881
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorЕсть. Всё написано до нас: Asphyre Platform eXtended Library

Очень, очень мощная штука с универсальным канвасом.Интересно. Смотрю. Только там какие-то примеры замороченные.
...
Рейтинг: 0 / 0
TCanvasEx
    #39470895
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
rgreatdefecatorЕсть. Всё написано до нас: Asphyre Platform eXtended Library

Очень, очень мощная штука с универсальным канвасом.Интересно. Смотрю. Только там какие-то примеры замороченные.

ничего там не заморочено, всё примитивно до безобразия.

На FormCreate:

указываешь, что будет использоваться - DirectX, OpenGL или OpenGL ES:
Код: pascal
1.
Factory.UseProvider(idDirectX11);



создаешь девайс и рабочий канвас:

Код: pascal
1.
2.
     GameDevice := Factory.CreateDevice();
     GameCanvas := Factory.CreateCanvas();



определяешь обработчики:
Код: pascal
1.
2.
procedure TMainForm.TimerEvent(Sender: TObject);
procedure TMainForm.ProcessEvent(Sender: TObject);



в первом (он основной) будет обрабатываться собственно рендеринг,
во втором - что угодно, обычно там клава/мышь, но можно и забить.

простейшее содержимое:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TMainForm.TimerEvent(Sender: TObject);
begin
     { отрисовать сцену }
     GameDevice.Render(RenderEvent, $000050);

     { выполнить обработчик строго интервала - тот самый TMainForm.ProcessEvent }
     Timer.Process();
end ;



запускаешь внутренний таймер:

Код: pascal
1.
2.
3.
     Timer.OnTimer  := TimerEvent;
     Timer.OnProcess:= ProcessEvent;
     Timer.Enabled  := True;



ну и самой главное, где всё и происходит - обработчик RenderEvent,
в котором рисуешь всё, что хочешь и как хочешь.
Только надо не забыть, что отрисовка сцены там будет в том порядке, в котором написан код.


В примерах к Asphyre есть пример Basic, вот там всё, что нужно, оттуда можно брать код как шаблон.
Я всегда так делаю, просто копирую проект к себе, и переписываю RenderEvent и ProcessEvent
Больше ничего.

В библиотеке есть также построитель интерфейса на базе Asphyre и нужные тулзы для рендеринга спрайтов, шейдеров, шрифтов.

А если сверху добавить движок XParticles, тоже писанный на Pascal, то разработка вот таких игр - плёвое дело в плане графики:

...
Рейтинг: 0 / 0
TCanvasEx
    #39470926
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

а как насчет идеи сделать TCanvasEx наследником TCanvas, перегрузив всё что возможно?
Для совместимости с остальными компонентами? Фантазирую, например подсунуть его потом FastReport'у.
...
Рейтинг: 0 / 0
TCanvasEx
    #39470934
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён rgreat,

а как насчет идеи сделать TCanvasEx наследником TCanvas, перегрузив всё что возможно?
Для совместимости с остальными компонентами?Имхо это не реально.
Почти все библиотеки используемые для рисования не совместимы с TCanvas.

Фантазирую, например подсунуть его потом FastReport'у.Тут другая идея.
Можно взять этот самый TCanvas после отработки этого самого FastReport, прицепить к нему TCanvasEx и дорисовать что надо.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TCanvasEx
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]