Einzelnen Beitrag anzeigen

crypti

Registriert seit: 12. Feb 2005
43 Beiträge
 
#4

Re: Transparente Komponente - Flackern

  Alt 10. Nov 2006, 10:07
Hi!

Zitat von chaosben:
Zitat von crypti:
Nun dachte ich, man könnte die Zeichnungsaktivitäten erst in einem Bild (Bitmap) machen und dann am Ende der Paint Funktion einfach mit dem Original Canvas zusammenmergen,
Das ist genau das, was du tun musst, um das Flackern zu beseitigen. Hier ein Beispiel:
Delphi-Quellcode:
var
  Buffer : TBitmap;
begin
  Buffer:=TBitmap.Create;
  Buffer.Width:=Self.Width //...usw
  
  //Transparenz entsteht, wenn man das anzeigt, was hinter dem Control ist
  //also fordern wir unseren Parent auf, genau das zu zeichnen
  DrawParentBackground(Buffer.Canvas.Handle);

  //Jetzt das malen, was wir wollen
  
  //Danach den Buffer ins Control malen
  BitBlt(Self.Canvas.Handle,
         0,0,
         Self.Width, Self.Height,
         Buffer.Canvas.Handle,
         0,0,
         SRCCOPY);
  
  Buffer.Free;
end;

//leider weiß ich nicht mehr, von wem die Prozedur war :(
procedure TMyControl.DrawParentBackground(AToDC : HDC);
var
  SaveIndex: Integer;
  Position: TPoint;
begin
  SaveIndex := SaveDC(AToDC);
  GetViewportOrgEx(AToDC, Position);
  SetViewportOrgEx(AToDC, Position.X - Left, Position.Y - Top, nil);
  IntersectClipRect(AToDC, 0, 0, Parent.ClientWidth, Parent.ClientHeight);
  Parent.Perform(WM_ERASEBKGND, AToDC, 0);
  Parent.Perform(WM_PAINT, AToDC, 0);
  RestoreDC(AToDC, SaveIndex);
end;
Die Lösung kenne ich schon, jedoch bringt einen diese nicht ans Ziel. Wenn ich in der Paint Funktion über die DrawParentBackground arbeite, dann wird bei mir nicht der Hintergrund des Controls in das temporäre Bitmap gezeichnet, sondern es ist schlichtweg einfach nur weiß. Man kann das Bitmap ja nach der Erzeugung mit DrawParentBackground einfach mal abspeichern, aber es ist wirklich weiß.
Ich habe auch gesehen das diese Funktionen beim FlatPanel mit zum Einsatz kommen. Jedoch habe ich dort genau den gleichen Effekt. Es wird nicht transparent, sondern ist einfach nur weiß.

Aus diesem Grund habe ich oben auch geschrieben das es nicht funktioniert.


Was mit mitlerweile aufgefallen ist.

Wenn ich das Control mit WS_EX_TRANSPARENT zeichne, dann wird bei einem Zeichnen die Zeichenfläche nicht aktualisiert. Dies bedeutet, wenn ich in das Control ein Label o.ä. reinpacke, dann überdecken sich die Texte. Man muss hier im Paint ein zusätzliches Repaint auf das Parent des Controls ausführen. Wenn ich dieses Paint weglasse, dann flackert auch nichts mehr. Aber wenn ich ein Transparentes PNG o.ä. dort mit reinpacken will, dann brauche ich ja exakt den Hintergrund um immer die gleiche Darstellung zu erhalten. Sonst wird ein Grau nach der dritten Aktualisierung zu einem Grau.

Wenn man die Transparenz nur "simulieren" will und zwar über ein Bitmap das aus dem Hintergrund immer wieder neu entsteht, dann brauchen wir das WS_EX_TRANSPARENT ja überhaupt nicht. Wahrscheinlich ist diese Funktionsweise sogar die schnellste.

Ich danke euch das ihr euch meiner Fragen annehmt.

tschöööö
  Mit Zitat antworten Zitat