CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Skalowanie gradientu na Image

Skalowanie gradientu na Image

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Skalowanie gradientu na Image

Nowy postprzez usermaw » sobota, 7 maja 2011, 18:07

Witam
Na początku kod wypełniający gradientem Image

Kod: Zaznacz cały
TRIVERTEX        vert[2] ;
GRADIENT_RECT    gRect;
vert [0] .x      = 0;
vert [0] .y      = 0;
vert [0] .Red    = 0x0000;
vert [0] .Green  = 0x0000;
vert [0] .Blue   = 0x0000;
vert [0] .Alpha  = 0x0000;

vert [1] .x      = Image1->Width;
vert [1] .y      = 20;
vert [1] .Red    = 0x0000;
vert [1] .Green  = 0x0000;
vert [1] .Blue   = 0xff00;
vert [1] .Alpha  = 0x0000;

gRect.UpperLeft  = 0;
gRect.LowerRight = 1;
GradientFill(Image1->Canvas->Handle,vert,2,&gRect,1,GRADIENT_FILL_RECT_H);


Image z parametrem Align=alClient jest umieszczony na Panelu, Panel -> alBottom

Moje pytanie, Jak sprawić, aby obszar wypełnienia skalował się do szerokości formy?
Podczas rozciągania formy po odcieniu gradientu widać (ciemnieje), że się skaluje, tylko obszar wypełnienia pozostaje cały czas niezmienny, czyli o szerokości formy po uruchomieniu programu.

Zapewne pytanie banalne, ale się jakoś zaciąłem.

Pozdro
Avatar użytkownika
usermaw
Homos antropiczny
Homos antropiczny
 
Posty: 55
Dołączył(a): piątek, 2 stycznia 2009, 20:43
Podziękował : 2
Otrzymał podziękowań: 0
    Windows XPFirefox

Re: Skalowanie gradientu na Image

Nowy postprzez Cyfrowy Baron » sobota, 7 maja 2011, 18:42

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:

KOD cpp:     UKRYJ  
GradientFill(Image1->Canvas->Handle,vert,2,&gRect,1,GRADIENT_FILL_RECT_H);


zrób to na TBitmap:

KOD cpp:     UKRYJ  
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:

KOD cpp:     UKRYJ  
#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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości

cron