To przez klasę TCanvas. Ma taki rozmiar, jaki ma Image w chwili rozpoczęcia rysowania. Musisz rysować na obiekcie typu TBitmap, ustalając wymiary na wymiary Image, a potem przepisać do do Image, czyli zamiast:
GradientFill(Image1->Canvas->Handle,vert,2,&gRect,1,GRADIENT_FILL_RECT_H);
zrób to na TBitmap:
Graphics::TBitmap *Bmp = new Graphics::TBitmap;
Bmp->Width = Image1->Widt;
Bmp->Height = Image1->Height;
GradientFill(Bmp->Canvas->Handle, vert,2, &gRect, 1, GRADIENT_FILL_RECT_H);
Image1->Picture->Bitmap->Assign(Bmp);
Rozciąganie działa tylko w odniesieniu do grafiki wczytanej do Image. Klasa TCanvas nie posiada własnej powierzchni, to tylko zestaw narzędzi, więc nie ma czego rozciągać, a Image przy zmianie rozmiaru, nie przerysowuje zawartości, poza tym obszar TCanvas zawsze będzie miał początkowe rozmiary obiektu i nie ulegnie zmianie. Wszak nie masz możliwości zmiany rozmiarów tego obszaru
Po każdej zmianie rozmiaru okna musisz ponownie wszystko odrysować, w przeciwnym razie gradient zostanie rozciągnięty, a to oznacza, że nie będzie on już tak łagodnie przechodził pomiędzy kolorami. Rozciągając Image tylko powielasz sąsiednie piksele.
Kod rysujący gradient powinieneś umieścić w zdarzeniu OnPaint dla formularza:
#include <memory>
void __fastcall TForm1::DrawGradient(TImage *Image)
{
std::auto_ptr<Graphics::TBitmap> Bmp(new Graphics::TBitmap);
Bmp->Width = Image1->Width;
Bmp->Height = Image1->Height;
int iHeight = (this->ClientHeight + 255) / 256 ;
for(int Row = 0; Row <= 255; Row++)
{
Bmp->Canvas->Brush->Color = RGB(0, 0, 255 - Row);
Bmp->Canvas->FillRect( Rect(0, Row * iHeight, this->ClientWidth,
(Row + 1) * iHeight) );
}
Image1->Picture->Assign(Bmp.get());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
DrawGradient(Image1);
}
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.