Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#1

TImage problem in verbindung mit UpdateLayeredWindow

  Alt 27. Mär 2009, 19:09
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
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
Miniaturansicht angehängter Grafiken
dclock_104.jpg  
  Mit Zitat antworten Zitat