Einzelnen Beitrag anzeigen

Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.611 Beiträge
 
#1

Weisser Hintergrund trotz FillRect mit anderer Farbe?

  Alt 5. Sep 2007, 10:38
Hi,

ich hab ein eigenes Control.
Dieses Zeichnet sich in einer überschriebenen Paint-Routine selber: Erst Hintergrund (Farbe), dann Vordergrund (Text), dann Rahmen.

Delphi-Quellcode:
procedure TMyCustomPanel.Paint;
var Rect: TRect;
begin
  Rect := GetClientRect;

  doPaintBackground(Rect);
  doPaintBorder(Rect);
  doPaintText;
end;

procedure TMyCustomPanel.doPaintBackground(const ARect: TRect);
begin
  if not ParentBackground then
  begin
    Canvas.Brush.Color := Color;
    Canvas.FillRect(ARect);
  end;
end;
Das Funktioniert einwandfrei. Das Control ist hinterher hellgrün mit schwarzem Text und der Rahmen hat auch die richtige Farbe.

Nun habe ich eine Ableitung davon, die zusätzlich ein Hintergrundbild haben kann.

Alte Version:
Delphi-Quellcode:
procedure TMyPanelAbleitung.doPaintBackground(const ARect: TRect);
begin
  inherited; // hier WIRD das obere Paint ausgeführt

  // draw background image if availabe
  if Assigned(FBackgroundBitmap) then
  begin
    BitBlt(Canvas.Handle,
           ARect.Left + 2,
           ARect.Top + 2,
           FBackgroundBitmap.Width,
           FBackgroundBitmap.Height,
           FBackgroundBitmap.Canvas.Handle,
           0,
           0,
           SRCCOPY
    );
  end;
end;
Tja. Nun ist das ganze Control aber leider innen weiss - mit dem gezeichneten Bild. Rahmen und Text passen weiterhin - aber der vorher gezeichnete hellgrüne Hintergrund ist futsch und mit Weiss überzeichnet.

Die aktuelle Version benutzt folgenden Code: http://www.delphipraxis.net/internal...t.php?t=30824:

Delphi-Quellcode:
procedure TMyPanelAbleitung.doPaintBackground(const ARect: TRect);
var BlendFunction: TBlendFunction;
begin
  inherited;

  // draw background image if availabe
  if Assigned(FBackgroundBitmap) then
  begin
    BlendFunction.AlphaFormat := 0;
    BlendFunction.AlphaFormat := 0;
    BlendFunction.BlendFlags := 0;
    BlendFunction.BlendOp := AC_SRC_OVER;
    BlendFunction.SourceConstantAlpha := 100; // 0 .. 255 (255 = volle Sichtbarkeit)

    TryAlphaBlend(Canvas.Handle,
           ARect.Left + 2,
           ARect.Top + 2,
           FBackgroundBitmap.Width,
           FBackgroundBitmap.Height,
           FBackgroundBitmap.Canvas.Handle,
           0,
           0,
           FBackgroundBitmap.Width,
           FBackgroundBitmap.Height,
           BlendFunction
    );
  end;
end;
Nun wird das Bild halt Transparent aufs Weiss gezeichnet - nix vom Hellgrünen über.

Wo ist der Hintergrund hin, den ich in der Basisklasser definitiv einwandfrei zeichne?
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat