Конференция "Компоненты" » Получение Canvas из TGraphicControl [D6, WinXP]
 
  • petun (06.05.08 01:00) [0]
    Вот такое дело.
    создаю компонент, который создает надписи к фото.

    Использую TGraphicControl как родителя.
    Рисую все с помощью Canvas.
    Т.е.
    --
    Canvas.StretchDraw(GetRect,FPicture.Graphic);
    --
    Canvas.TextOut(FPosX,FPosY,FText);
    --
    и т.д.

    Вопрос, как мне потом сохранить содержимое этого самого канваса.

    Пробую уже в программе достучаться до этого свойства, а онон не доступно. Пробую публиковать так:


    public
    property Canvas: TCanvas read GetCanvas;
    private
    function GetCanvas: TCanvas;



    а вот что в теле писать, никак не укладывается. Помогите плиз.

    на последок исходный код компонента:


    unit TextImage;

    interface

    uses
     Windows, Messages, SysUtils, Classes, Controls, Graphics, Forms, Dialogs;

    type
     TTextImage = class(TGraphicControl)
     private
      {загрузка картинки}
      FPicture : TPicture;
      FFont :TFont;
      FStretch : Boolean;
      FText: string;
      FPosX : Integer;
      FPosY : Integer;
      procedure SetPicture(Value: TPicture);
      procedure SetStretch(Value: boolean);
      procedure SetFont(const Value: TFont);
      procedure SetText(value: String);
      procedure SetPosX(Value: integer);
      procedure SetPosY(Value: integer);

      function GetCanvas: TCanvas;

      procedure PictureChanged(Sender: TObject);
       { Private declarations }
     protected
      procedure Paint; override;
      function GetRect: TRect;
      procedure DrawText();
       { Protected declarations }
     public
      constructor Create(AOwner: TComponent); override;
      property Canvas: TCanvas read GetCanvas;
       { Public declarations }
     published
      property Picture: TPicture read FPicture write SetPicture;
      property Font: TFont read FFont write SetFont;
      property Stretch: Boolean read FStretch write SetStretch default true;
      property Text: String read FText write SetText;
      property PosX:integer read FPosX write  SetPosX default 0;
      property PosY:integer read FPosY write  SetPosY default 0;

       { Published declarations }
     end;

    procedure Register;

    implementation

    function TTextImage.GetCanvas: TCanvas;
    begin

    end;

    constructor TTextImage.Create(AOwner: TComponent);
    begin
    inherited Create(AOwner);
    FPicture := TPicture.Create;
    FPicture.OnChange := PictureChanged;
    FFont := TFont.Create;
    end;

    procedure TTextImage.PictureChanged(Sender: TObject);
    begin
     Canvas.StretchDraw(GetRect,FPicture.Graphic);
    end;

    function TTextImage.GetRect :TRect;
    begin
    if (FStretch) then
     Result := ClientRect
    else
     Result := Rect(0, 0, FPicture.Width, FPicture.Height);
    end;

    procedure TTextImage.SetStretch(Value: boolean);
    begin
    FStretch := Value;
    Repaint;
    end;

    procedure TTextImage.Paint;
    begin
    if csDesigning in ComponentState then
      with inherited Canvas do
       begin
         Pen.Style := psDash;
         Brush.Style := bsClear;
         Rectangle(0, 0, Width, Height);
       end;
    with inherited Canvas do

    begin
     StretchDraw(GetRect, FPicture.Graphic);
     Font := FFont;
     TextOut(FPosX,FPosY,FText);
    end;
    end;

    procedure TTextImage.SetPicture(Value: TPicture);
    begin
    FPicture.Assign(Value);
    end;

    //
    // ПРИСВОЕНИЕ ТЕКСТА КООРДИНАТ И Т,Д,
    //
    procedure TTextImage.SetText(Value : String);
    begin
    FText := value;
    DrawText();
    end;

    procedure TTextImage.SetPosX(Value : integer);
    begin
    FPosX := value;
    DrawText();
    end;

    procedure TTextImage.SetPosY(Value : integer);
    begin
    FPosY := value;
    DrawText();
    end;

    procedure TTextImage.SetFont(const Value: TFont);
    begin
    FFont.Assign(Value);
    DrawText();
    end;

    procedure TTextImage.DrawText();
    begin
    Canvas.Font := FFont;
    {что бы не было под шрифтом ничего}
    Canvas.Brush.Style := bsClear;
    { рисуем текст}
    Canvas.TextOut(FPosX,FPosY,FText);
    { обновляем}
    Refresh;
    end;

    procedure Register;
    begin
     RegisterComponents('Standard', [TTextImage]);
    end;

    end.

  • DimaBr © (06.05.08 08:33) [1]
    Ничего не надо, так как вы наследуетесь от TGraphicsControl, в котором Canvas уже реализован, достаточно просто повысить его видимость


    public
     property Canvas;

  • petun (06.05.08 14:12) [2]
    Спасибо!
 
Конференция "Компоненты" » Получение Canvas из TGraphicControl [D6, WinXP]
Есть новые Нет новых   [134464   +62][b:0][p:0.002]