Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TImage problem in verbindung mit UpdateLayeredWindow (https://www.delphipraxis.net/131624-timage-problem-verbindung-mit-updatelayeredwindow.html)

EWeiss 27. Mär 2009 19:09


TImage problem in verbindung mit UpdateLayeredWindow
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo

Ich erstelle ein Bitmap mit folgender Funktion
Delphi-Quellcode:
procedure TClockForm.FormShow(Sender: TObject);
var
 tempBI    : BITMAPINFO;
 ImgW      : Cardinal;
 ImgH      : Cardinal;
 graphics  : Cardinal;
 curWinStyle: Integer;
 winSize   : TSize;
 srcPoint  : TPoint;
 hBM1       : HBitmap;
 DC        : HDC;
 blendfunc : BLENDFUNCTION;
 P4         : Pointer;
 hbmReturn : HBitmap;

begin
  DoubleBuffered := True;

  if GDIReady then
  begin
    With tempBI.bmiHeader do
    begin
      biSize := SizeOf(tempBI.bmiHeader);
      biBitCount := 32;
      biHeight := Height;
      biWidth := Width;
      biPlanes := 1;
      biSizeImage := biWidth * biHeight * (biBitCount div 8);
    end;

    DC := CreateCompatibleDC(Canvas.Handle);
    hBM1 := CreateDIBSection(DC, tempBI, DIB_RGB_COLORS, P4, 0, 0);
    SelectObject(DC, hBM1);
    GdipCreateFromHDC(DC, graphics);

    ImgBack := CreateImageFromFile('wall.png');
    GetImageSize(ImgBack, ImgW, ImgH);

    if ImgBack <> 0 then
    begin
      GdipDrawImageRect(graphics, ImgBack, 0, 0, ImgW, ImgH);

      curWinStyle := GetWindowLong(Handle, GWL_EXSTYLE);
      SetWindowLong(Handle, GWL_EXSTYLE, curWinStyle Or WS_EX_LAYERED);
      SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE);

      srcPoint.x := 0;
      srcPoint.y := 0;
      winSize.cx := ImgW;
      winSize.cy := ImgH;

      With blendFunc do
      begin
        AlphaFormat := AC_SRC_ALPHA;
        BlendFlags := 0;
        BlendOp := AC_SRC_OVER;
        SourceConstantAlpha := 255; // here you can set Alpha
      end;

      GdipDisposeImage(ImgBack);
      GdipDeleteGraphics(graphics);
      UpdateLayeredWindow(Handle, Canvas.Handle, nil, @winSize, DC, @srcPoint, 0, @blendFunc, ULW_ALPHA);

      (*hbmReturn := LoadSourceImage('wall.png');
      if hbmReturn <> 0 then
      begin
        ClockBack := TBitmap.Create;
        ClockBack.Handle := hbmReturn;
        CombineImage(BackImage.Picture.Bitmap.Handle, ClockBack.Handle, 0, 0,
                     true);
      end;*)

   end;
   InitHand;
  end;

end;
Mein problem ist nun das ich das Bitmap welches auf der Form mit GDI+ gezeichnet wird in ein TImage konvertieren muss.
Damit ich dieses an
Delphi-Quellcode:
BackImage.Picture.Bitmap.Handle
übergeben kann.
Ich benötige es deshalb um das Hintergrund Bild mit den Bildern für Zeiger usw.. zu kombinieren.
Schalte ich die GDI routine aus und verwende nur den auskommentierten teil dann geht es auch.
Das problem was ich aber dann habe ist , ich muss dann ein Timage auf die Form legen
nur dann funktioniert UpdateLayeredWindow nicht mehr da die Form kein Bitmap hat.
Ich brauche aber ein PNG Image mit Alpha Channel..

Wie kann ich also "ImgBack" zu einen TImage konveriteren ?
Am angehängten Bild kann man sehen das es geht die Qualität ist aber sehr besch ... eiden.
gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 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