Wypełnianie formularza bitmapą

Czasami zamiast szarego tła aplikacji chcielibyśmy je wypełnić bitmapą. Można by umieścić jeden duży obrazek, jednak zajmowałby on bardzo dużo miejsca jako bitmapa. Zamiast tego można na wzór stron WWW umieścić bitmapę, która będzie się powtarzała zarówno w pionie jak i w poziomie. Znam dwa różne sposoby, jak to zrobić. Obydwa obsługują zdarzenie formularza OnPaint, które jest wywoływane w momencie jego odświeżania (czyli np. w momencie wyświetlenia programu, zmiany rozmiaru, czy położenia), następnie na początku każdego zdarzenia tworzona jest dynamicznie nowa bitmapa za pomocą słowa kluczowego new i wczytywany do niej obrazek z pliku za pomocą funkcji LoadFromFile(), gdzie argumentem jest ścieżka dostępu do bitmapy (należy zwrócić uwagę na podwójny backslash oddzielaj?cy katalogi), każdy ze sposobów kończy się również zwolnieniem zajmowanej przez bitmapę pamięci za pomocą słowa kluczowego delete. Różnica polega na sposobie powielania bitmapy na formularzu.

I sposób:

Bitmapa jest przypisywana do właściwości Form1->Canvas->Brush->Bitmap, która określa rodzaj wypełnienia, a następnie za pomocą funkcji FillRect() wypełniany jest cały obszar formularza (określony za pomocą funkcji Windows API GetClientRect):

Unit1.cpp

void __fastcall TForm1::FormPaint(TObject *Sender)
{
   Graphics::TBitmap *bg = new Graphics::TBitmap;
   bg->LoadFromFile("bg.bmp");

   Form1->Canvas->Brush->Bitmap = bg;
   Form1->Canvas->FillRect(GetClientRect());

   delete bg;
}

II sposób:

Główne zadanie pełną dwie pętle while i funkcja Draw(), przy pomocy której bitmapa jest rysowana na formularzu:

Unit1.cpp

void __fastcall TForm1::FormPaint(TObject *Sender)
{
   Graphics::TBitmap *bg = new Graphics::TBitmap;
   bg->LoadFromFile("bg.bmp");

   int szerokosc = bg->Width;
   int wysokosc = bg->Height;
   int y = 0;

   while (y < Form1->Height)
   {
      int x = 0;
      while (x < Form1->Width)
      {
         Form1->Canvas->Draw(x, y, bg);
         x = x + szerokosc;
      }
      y = y + wysokosc;
   }

   delete bg;
}