Einzelnen Beitrag anzeigen

Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#5

Re: [nonVCL] UpdateLayeredWindow & 32 Bit Bmp - Helfer g

  Alt 16. Sep 2006, 11:49
So, habs soweit hin bekommen. Das Project läuft nun ohne die Graphics Unit der VCL.

Das erstellen und Konvertieren des Bitmaps schaut nun so aus:

Delphi-Quellcode:
procedure CreateBitmap32(width, height: Word);
var
  bmi: BITMAPINFO;
begin
  BmpDC := CreateCompatibleDC(0);

  with bmi do
  begin
    bmiHeader.biSize := SizeOF(bmi.bmiHeader);
    bmiHeader.biWidth := width;
    bmiHeader.biHeight := -height;
    bmiHeader.biPlanes := 1;
    bmiHeader.biBitCount := 32;
    bmiHeader.biCompression := BI_RGB;
    bmiHeader.biSizeImage := 0;
    bmiHeader.biXPelsPerMeter := 0;
    bmiHeader.biYPelsPerMeter := 0;
    bmiHeader.biClrUsed := 0;
    bmiHeader.biClrImportant := 0;
  end;

  hBMP := CreateDIBSection(BmpDC, bmi, DIB_RGB_COLORS, bits, 0, 0);
  SelectObject(BmpDC, hBMP);
end;

procedure DeleteBitmap32;
begin
  DeleteDC(BmpDC);
  DeleteObject(hBMP);
end;
Delphi-Quellcode:
case uMsg of
    WM_CREATE:
      begin
        // Bitmap(s) aufbereiten /////////////////////////////////////////////

        // RGB Bitmap laden
        RGBBmp := LoadImage(hInstance, 'RGB', IMAGE_BITMAP, 0, 0, 0);
        RGBBmpDC := CreateCompatibleDC(0);
        SelectObject(RGBBmpDC, RGBBmp);

        GetObject(RGBBmp, sizeof(BITMAP), @BmpInfo);

        CreateBitmap32(BmpInfo.bmWidth, BmpInfo.bmHeight);

        BitBlt(BmpDC, 0, 0, BmpInfo.bmWidth, BmpInfo.bmHeight, RGBBmpDC, 0, 0, SRCCOPY);

        // noch 'n Close Button malen
        DrawFrameControl(BmpDC,
          _RECT(0, 0, 16, 16), DFC_CAPTION, DFCS_CAPTIONCLOSE);

        DeleteObject(RGBBmp);
        DeleteDC(RGBBmpDC);

        // Mask Bitmap laden

        MskBmp := LoadImage(hInstance, 'MASK', IMAGE_BITMAP, 0, 0, 0);
        MskBmpDC := CreateCompatibleDC(0);
        SelectObject(MskBmpDC, MskBmp);

        // noch 'n Alphawert für den Closebutton erzeugen
        Brush := CreateSolidBrush($00FFFFFF);
        FillRect(MskBmpDC, _RECT(0, 0, 16, 16), Brush);
        DeleteObject(Brush);

        // RGB und Alpha -Bitmap kombinieren
        for y := 0 to BmpInfo.bmHeight - 1 do
          for x := 0 to BmpInfo.bmWidth - 1 do
          begin
            // "Get Pixel form Pointer"
            rgba := pRGBA(INTEGER(bits) + (x + y * BmpInfo.bmWidth) * 4);
            //

            PixColor := GetPixel(MskBmpDC, x, y);

            rgba.alpha :=
                 (GetRValue(PixColor) +
                  GetGValue(PixColor) +
                  GetBValue(PixColor)) div 3;
         end;

        DeleteObject(MskBmp);
        DeleteDC(MskBmpDC);
        ////////////////////////////////////////////////////////////////////////

        // einen Button zum Schliessen erstellen (welcher auf dem Bitmap ist)

        //...
      end;

    WM_DESTROY:
  // ...
Das läuft nun noch etwas "langsam", ich denke mal wegen dem GetRValue etc.

Mal schauen was man da machen kann.

Den akt. Code gibts im Anhang und die fertige Exe ist inkl. Bitmaps nur noch ~ 76 KB gross.
Angehängte Dateien
Dateityp: zip alpha_test_5_141.zip (40,6 KB, 92x aufgerufen)
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat