UpdateLayeredWindow mit Bitmaps
-
Ich würde gerne eine Bitmap auf einem Fenster anzeigen. Dabei sollen einige Stellen der Bitmap transparent sein.
Also hab ich mir folgendes gedacht: Ich habe eine Bitmap mit den Farben und eine mit der Deckfähigkeit. Dann bring ich die beide zusammen, sodass ich sie mit UpdateLayeredWindow verwenden kann.
Das Problem ist, dass ich keine Ahnung habe, wie ich beide Bitmaps zusammenfügen kann. Und auch nicht, wie ich bei UpdateLayeredWindow vorgehen muss. Da gibt man einen Source-DC an. Muss ich einfach mit CreateCompatibleDC einen DC erstellen und mit SelectObject die Bitmap damit verknüpfen.
Ich würde mich freuen, wenn jemand ein kleines Beispiel hätte oder mir einen Denkansatz geben könnte.

-
Schau dir mal TransparentBlt an. Dies sollte eigentlich genau das sein, was du suchst. Dies müsste man auch auf in einem virtuellen DC zusammen mit BitBlt kombinieren können.
Update:
Falls du einfach nur ein Bitmap mit teilweise transparenten Stellen auf ein Fenster legen willst, und das Fenster selber nicht transparent ist, sieht das ganze grob so aus:
HANDLE hBitmap; BITMAP bitmap; HDC hdc, hdcMem; PAINTSTRUCT ps; hdc = BeginPaint(m_hwnd, &ps); hdcMem = CreateCompatibleDC (hdc); hBitmap = handle des Bitmaps GetObject(hBitmap, sizeof(BITMAP), &bitmap); SelectObject(hdcMem, hBitmap); TransparentBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, (UINT) GetPixel(hdcMem, 0 ,0)); DeleteDC(hdcMem); EndPaint(m_hwnd, &ps);
-
Danke, aber wenn ich das richtig verstanden habe, kann man bei TransparentBlt nur eine Farbe transparent machen. Ich brauche aber leider mehrere Abstufungen, deshalb auch die zweite Bitmap.
Man muss die doch irgendwie kombinieren können, sodass man eine HBITMAP mit 32-Bit Farbtiefe und Alphachannel erhält ...
-
Sowas müsste mit AlphaBlend und BLENDFUNCTION gehen. Du müsstest erst mit BitBlt dein Basisbild in einen DC blitten und danach mit AlphaBlend das Bitmap mit der Deckfähigkeit darüberlegen. In BLENDFUNCTION muss dann AC_SRC_ALPHA gesetzt werden. Wie das mit den Bitmaps mit Alphachannel funktioniert, ist in der MSDN bei BLENDFUNCTION erklärt. Ausprobiert habe ich es jetzt nicht aber es klingt zumindest, als wäre dies eine Möglichkeit, so etwas hinzubekommen.