TGraphicControl Paint?

Rund um die LCL und andere Komponenten
Antworten
Flashbanger
Beiträge: 94
Registriert: Mi 28. Mär 2007, 22:01
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

TGraphicControl Paint?

Beitrag von Flashbanger »

Hallo

ich will folgendes machen.
Ich will eine Visuelle Komponente schreiben. Dazu hab ich sie von TGraphicControl abgeleitet.

Ich hab dann im überschriebenen Create eine Bitmap erzeugt.
Im überschriebenen Destroy wird sie wieder freigegeben.

Nun will ich folgende Paint-Mehode benutzen.

Code: Alles auswählen

procedure TCEProgressbar.Paint;
begin
if (FBitmap <> Nil) then begin
   if (FBitmap.Width <> Width) or (Fbitmap.Height <> Height) then Erstellen;
   canvas.Draw(0,0,FBitmap);
   end;
end;
Erstellen sieht so aus.

Code: Alles auswählen

procedure TCEProgressbar.Erstellen;
begin
if FBitmap <> Nil then begin
   Case FStyle of
   CpProgressbar : begin
                 if FBitmap.Height <> Height then FBitmap.Height:=Height;
                 if FBitmap.Width <> Width then Fbitmap.Width:=Width;
                 With Fbitmap.Canvas do begin
                     Pen.Color:=FBoarderColor;
                     Brush.Color:=clwhite;
                     ellipse(0,0,width,Height);
                     end;
                 end;
   Cpgauge       : begin
                 if FBitmap.Height <> Height then FBitmap.Height:=Height;
                 if FBitmap.Width <> Width then Fbitmap.Width:=Width;
                 FBitmap.Canvas.TextOut(0,0,'test');
                   end;
   end;
end;
end;
so was ich will, ist denk ich klar.

Ich will einen Kreis in die gesammte Bitmap zeichnen(von 0|0 bis Width|Height)

Im paint soll, falls die Abmessungen der Bitmap sich von der der Komponente unterscheiden ein neuer kreis in das Bitmap gezeichnet werden.

Leider klappt es nicht.

Zwar bekomme ich den kreis hin, aber....

am anfang(nach dem aufziehen der Komponente auf die Form), ist das gesammte Bild schwarz, obwohl im Create Erstellen ausgeführt wird(voher wird das Bitmap erstellt).

Wenn ich nun Erstellen ausführe, und danach ein Paint mache, dann hab ich den kreis.

Wenn ich dann die abmessungen der Komponente verändere wird aber nichts neues gemalt, sondern alles wird wieder schwarz.

gruß Flashbanger
Dateianhänge
ceprogressbar.pas
(4.77 KiB) 78-mal heruntergeladen

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Dein Bitmap hat keine Hintergrundfarbe:

Code: Alles auswählen

procedure TCEProgressbar.Erstellen;
begin
if FBitmap <> Nil then begin
 
 if FBitmap.Height <> Height then FBitmap.Height:=Height;
 if FBitmap.Width <> Width then Fbitmap.Width:=Width;
 
 FBitmap.Canvas.Brush.Color:=clyellow;
 FBitmap.Canvas.FillRect(0,0,Width,Height);
 
   Case FStyle of
   CpProgressbar :
    begin
      Fbitmap.Canvas.Pen.Color:=FBoarderColor;
      Fbitmap.Canvas.Brush.Color:=clwhite;
      Fbitmap.Canvas.Ellipse(0,0,width,Height);
     end;
   Cpgauge:
     begin
       FBitmap.Canvas.TextOut(0,0,'test');
     end;
   end;
 end;
end;

Flashbanger
Beiträge: 94
Registriert: Mi 28. Mär 2007, 22:01
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Beitrag von Flashbanger »

Es war ein anderer Fehler:

Diese With direktive klappt unter lazarus nicht:

Code: Alles auswählen

With FBitmap.Canvas do begin
{irgendwas}
end;
Auch diese geht net:

Code: Alles auswählen

With Fbitmap do
with canvas do begin
{irgendetwas}
end;

Code: Alles auswählen

nur diese hier funktioniert:
with FBitmap do begin
canvas.{irgnedwas};
end;
ist das ein fehler im FPC?

gruß Flashbanger

bembulak
Beiträge: 370
Registriert: Di 6. Feb 2007, 09:29
OS, Lazarus, FPC: L0.9.29 SVN:24607 FPC 2.4.0-32 bit @ Win XP SP3
CPU-Target: 32bit i386, ARM
Wohnort: Oberösterreich

Beitrag von bembulak »

Hm, ich glaube, mich erinnern zu können, dass unter http://lazarusroad.blogspot.com/" onclick="window.open(this.href);return false; sowas auch schon mal erwähnt wurde. Bug oder lediglich anderes Verhalten von FPC gegenüber Delphi kann ich nicht sagen.

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Flashbanger hat geschrieben:Es war ein anderer Fehler:
Das Füllen des Bitmap ist aber trotzdem sinnvoll.
Unter GTK Linux ist ein "leeres" Bitmap z.B. ein Pixelbrei.
Ausserdem löscht es das zuvor gemalte.

"With" benütze ich nie, das macht nur Ärger und den Code unleserlich.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Das Füllen des Bitmap ist aber trotzdem sinnvoll.
Das geht auch gar nicht anders... Muss wohl noch ein BUG sein. Ich hoffe das sie den noch beheben werden. Ich habe mir dafür eine kleine Procedure geschrieben. Womit ich die Größe der TBitMap einstellen kann. In mein uOpExt ist sie auch drin.

Die Procedure Kopiert erst alles in ein Temp BITMAP rein, dann ändert sie die Größe und füllt sie mit der angeben Farbe(Dieser Parameter ist Optinal*G*) und kopiert den Teil aus der TMP Bitmap wieder zurück.

Die Unit gibt es hier zu Downloaden....
MFG
Michael Springwald

Antworten