Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Auswahl-Rechteck mit invertiertem Hintergrund als Farbe (https://www.delphipraxis.net/46364-auswahl-rechteck-mit-invertiertem-hintergrund-als-farbe.html)

sieppl 23. Mai 2005 18:45


Auswahl-Rechteck mit invertiertem Hintergrund als Farbe
 
Hi!

Ich habe gerade ein kleines Problem die richtigen BitBlt-Operationen zu finden, die mich zum Ziel bringen.
Ein TImage und ein TGraphicControl liegen auf einem Panel. Der GraphicControl zeichnet ein Rechteck welches
die invertierte Hintergrundfarbe (also des TImage) haben soll. Mit anderen Worten: Stellen die auf dem
TImage weiß sind, sind auf dem Rechteck schwarz und umgekehrt. Bei den Farben dazwischen muss es natürlich
gemischt werden. Warum? Das Rechteck soll einen Crop-Bereich festlegen und immer super zu sehen sein.

Ich habe schon alle BitBlt Parameter durchprobiert, wober MERGEPAINT dem Ziel am ähnlichsten ist.

Code:
Delphi-Quellcode:
procedure TAreaSelect.Paint;
var
  I: Integer;
  TempBitmap: TBitmap;
begin
  inherited;
  TempBitmap := TBitmap.Create;
  FillBitmapWithColor(TempBitmap, clWhite);
  TempBitmap.TransparentColor := clWhite;
  TempBitmap.Transparent := True;
  TempBitmap.Width := Canvas.ClipRect.Right;
  TempBitmap.Height := Canvas.ClipRect.Bottom;
  TempBitmap.Canvas.Rectangle(FCalcRect.Corners);

  BitBlt(Canvas.Handle, 0, 0, TempBitmap.Width, TempBitmap.Height, TempBitmap.Canvas.Handle, 0, 0, MERGEPAINT);
  FreeAndNil(TempBitmap);
Danke für Eure Tipps!

Sebastian

SirThornberry 23. Mai 2005 18:50

Re: Auswahl-Rechteck mit invertiertem Hintergrund als Farbe
 
du kannst das ganze auch mit scanline manuell machen. (muss natürlich noch angepasst werden wenn es nur für ein gewissen bereich sein soll)
Delphi-Quellcode:
procedure InvertBitmap(ABitmap: TBitmap);
type
  TPixRow = array[0..65000] of TRGBTriple;
  PPixRow = ^TPixRow;
var ARow: PPixRow;
    LCountX, LCountY: Integer;
    LPixel: PRGBTriple;
begin
  ABitmap.PixelFormat := pf24bit;
  for LCountY := 0 to ABitmap.Height - 1 do
  begin
    ARow := ABitmap.ScanLine[LCountY];
    for LCountX := 0 to ABitmap.Width - 1 do
    begin
      LPixel := @ARow[LCountX];
      LPixel.rgbtBlue := not(LPixel.rgbtBlue);
      LPixel.rgbtGreen := not(LPixel.rgbtGreen);
      LPixel.rgbtRed := not(LPixel.rgbtRed);
    end;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz