CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Obraz bmp jako tło Form1
Strona 1 z 1

Obraz bmp jako tło Form1

Nowy postNapisane: sobota, 19 sierpnia 2017, 17:50
przez Arnold_S
Witam!
Chciałbym "wtopić" w tło formy obraz w formacie bmp. Próbowałem zrobić to według przepisu podanego poniżej ale nie bardzo chce działać.
http://programowanie.cal.pl/cyfbar/grafika.html#graf7

W kodzie który jest na stronie zamieniłem Image1 na Form1, tak jak poniżej:
KOD cpp:     UKRYJ  
void __fastcall TForm1::FormShow(TObject *Sender)
{
  bmp = new Graphics::TBitmap;
  bmp->LoadFromFile("nazwa_pliku");

  Form1->Canvas->Brush->Bitmap = bmp;
  Form1->Canvas->FillRect(Rect(0,0,Width,Height));
}
 

Gdy wczytuję obrazek do obiektu Image1, to wszystko działa jak należy. Jeśli wczytuję do Form1, to mam szare, standardowe tło :[
Obrazek jest sprawdzony pod kątem głębi i rozszerzenia - bmp 24bit.
Zainstalowałem C++ Builder XE2.

/Edit
Ten sposób działa...ale...tylko jeśli umieszczę go w zdarzeniu OnPaint dla Form1. Tak to wygląda:
KOD cpp:     UKRYJ  
void __fastcall TForm1::FormPaint(TObject *Sender)
{
                Graphics::TBitmap *bmp = new Graphics::TBitmap;
                try
                {
                        BrushBmp->LoadFromFile("test.bmp");
                        Canvas->Brush->Bitmap = bmp;
                        TRect rect;
                        rect.Left = 0;
                        rect.Top = 0;
                        rect.Right = ClientWidth;
                        rect.Bottom = ClientHeight;
                        //Canvas->StretchDraw(rect, bmp);

                        Canvas->FillRect(rect);
                }
                __finally
                {
                Canvas->Brush->Bitmap = NULL;
                delete bmp;
                }
}
 

Mam jeszcze pytanie: dlaczego nie chce działać dla innych zdarzeń tj.: OnCreate albo OnShow?

Re: Obraz bmp jako tło Form1

Nowy postNapisane: niedziela, 20 sierpnia 2017, 10:53
przez polymorphism
Dlatego że obraz, który malujesz na oknie, jest nietrwały i wymaga wielokrotnego odmalowywania. Do tego służy zdarzenie OnPaint, które jest wywoływane w razie potrzeby, a nie OnCreate czy OnShow.