TPaintBox nie posiada własnej powierzchni na której można by rysować. To tylko zestaw narzędzi do rysowania. Czyli rysując na PainBox rysujesz tak naprawdę na powierzchni na której PainBox się znajduje. PaintBox nie posiada również pamięci tego, co zostało na nim narysowane, więc jeżeli coś narysujesz na PaintBox a potem np. zminimalizujesz i przywrócisz okno programu to zawartość PaintBox zniknie. Dlatego trzeba odrysowywać zawartość PaintBox każdorazowo gdy zachodzą zmiany w formularzu, a to oznacza, że kod rysujący po PaintBox musi znajdować się w jego zdarzeniu OnPaint. Ponieważ PaintBox sam z siebie nic nie robi, by wypełnić go kolorem nie wystarczy ustawić koloru powierzchni, trzeba tą powierzchnię tym kolorem wypełnić np. za pomocą funkcji FillRect, np:
void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
{
PaintBox1->Canvas->Brush->Color=clYellow;
PaintBox1->Canvas->FillRect(PaintBox1->ClientRect);
}
Kolejna sprawa, gdy chcesz teraz na takiej powierzchni narysować np. prostokąt w innym kolorze, to musisz najpierw ustawić Brush dla powierzchni a potem Brush dla prostokąta, np:
void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
{
PaintBox1->Canvas->Brush->Color = clYellow;
PaintBox1->Canvas->FillRect(PaintBox1->ClientRect);
PaintBox1->Canvas->Brush->Color = clWhite;
PaintBox1->Canvas->Pen->Color = clGreen;
PaintBox1->Canvas->Pen->Width = 3;
PaintBox1->Canvas->Rectangle(10, 10, 100, 50);
}
Cały kod odrysowujący musi być powtarzany w zdarzeniu OnPaint. Nie można najpierw narysować coś, a potem dorysować coś innego. Możesz oczywiście tworzyć funkcje i w zdarzeniu OnPaint umieszczać te funkcje.