TBitmap nie na formie

0

Mam taki problem już od dłuższego czasu [???] :

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Img1: TBitmap; //Tego nie ma na formie
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Img1.Create;
Img1.LoadFromFile('image.bmp');
Form1.Canvas.Draw(5,5,Img1);
end;

end.
0

Trzeba myśleć!!! Przecież w OnCreate wywoływany jest komunikat WM_PAINT rysujący formatkę i jej całą
zawartość w postaci komponentów dlatego Twoj rysunek znika. Musisz obsłużyć ten komunikat - choćby tak:

// ...  private
    procedure WMPaint(var Message: TMessage); message WM_PAINT;
  public
  end;

var
  Form1 : TForm1;
  Img1 : TBitmap;

implementation

{$R *.dfm}

procedure TForm1.WMPaint(var Message: TMessage);
begin
  if Assigned(Img1) then
    Canvas.Draw(5, 5, Img1);
  inherited;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Img1 := TBitmap.Create;
  Img1.LoadFromFile('image.bmp');
  Canvas.Draw(5, 5, Img1);
end;

Inne rozwiązanie to rysować w OnActivate, ale bez obsłużenia komunikatu WM_PAINT po przesunięciu formy
albo jej minimalizacji albo przełączeniu na inną aplikację bitmapa by znikała bo znowu wywołano WM_PAINT.

0

Wielkie dzięki za szybką odpowiedź, działa. =D

0

@olesio masz rację - trzeba myśleć. Rysuje się w OnPaint

0

No masz rację Misiekd nie pomyślałem o tym zdarzeniu, bo zwykle obsługuje
komunikat WM_PAINT w osobnej procedurze dla tworzonych jakiś własnych
komponentów lub rysuje raczej na TImage, dlatego zapomniałem o OnPaint.

1 użytkowników online, w tym zalogowanych: 0, gości: 1