G
Hier meine Version um einfach und bequem ein ShapedWindow zu erstellen.
Übergeben muß man der Methode InitShapedWnd lediglich das Handle des Fensters das geformt werden soll,das Bitmapverzeichnis(anhand des Bitmaps wird die Region berechnet)und als letzten Parameter die Farbe der Bitmapbereiche die nicht in die Regionsberechnung miteinbezogen werden soll.
Keine Methode gibt einen Wert zurück,der Aufschluß darüber gibt,ob die Funktion erfolgreich ausgeführt werden konnte oder nicht.Genausowenig wurde auf doppelten Aufruf der Methode InitShapedWnd geprüft.
Viel Spaß Mfg Giga
Folgend das Interface ->
#include <windows.h>
class CShapedWnd
{
private:
HWND hWndStore; // Handle des Fensters speichern
HBITMAP hBitmap; // Handle des Bitmaps
HDC hdc,hdcBitmap; // Kontext des Bitmaps und des Clientbereiches
HRGN hRgn_Combine,hRgn_Temp; // Handle der Regionen,hRgn_Combine = Gesamtregion,hRgn_Temp = Zwischenspeicherung
BITMAP bmp; // Bitmapstruktur zum Speichern von Größe des Bitmaps
long Counter_Width,Counter_Height,Counter_Width_Store_Begin; // zum Ermitteln des Regionsbeginnes\ende etc.
bool fRgnBegin; // hat Region schon begonnen ?
public:
CShapedWnd(void); // Konstruktor
~CShapedWnd(); // Destruktor
void InitShapedWnd(HWND hWnd,const char* BmpFilename,COLORREF TransColor); // Regionen berechnen
void ShowBitmap(long x_Pos,long y_Pos); // gesamtes Bitmap auf berechnetes Fenster blitten
};
Source ->
#include "ShapedWindow.h"
CShapedWnd::CShapedWnd(void) // Konstruktor
{
Counter_Width = -1;
fRgnBegin = false;
}
CShapedWnd::~CShapedWnd() // Destruktor
{
DeleteDC(hdcBitmap);
DeleteObject(hBitmap);
DeleteObject(hRgn_Combine);
}
// *************************************************** Initialisieren des Shaped Window *******************************************************
void CShapedWnd::InitShapedWnd(HWND hWnd,const char* BmpFilename,COLORREF TransColor)
{
hWndStore = hWnd;
hRgn_Combine = CreateRectRgn(0,0,0,0); // leere Region erstellen
hdc = GetDC(hWnd);
hBitmap = (HBITMAP) LoadImage((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),BmpFilename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); // Bitmap laden
hdcBitmap = CreateCompatibleDC(hdc);
SelectObject(hdcBitmap,hBitmap);
GetObject(hBitmap,sizeof(BITMAP),&bmp);
ReleaseDC(hWnd,hdc);
// Berechnung der Regionen
for(Counter_Height = 0;Counter_Height < bmp.bmHeight;Counter_Height++)
{
while(Counter_Width != bmp.bmWidth)
{
while((GetPixel(hdcBitmap,++Counter_Width,Counter_Height) == TransColor) && (Counter_Width != bmp.bmWidth));
if(Counter_Width != bmp.bmWidth)
{
Counter_Width_Store_Begin = Counter_Width;
while((GetPixel(hdcBitmap,++Counter_Width,Counter_Height) != TransColor) && (Counter_Width != bmp.bmWidth));
hRgn_Temp = CreateRectRgn(Counter_Width_Store_Begin,Counter_Height,Counter_Width,Counter_Height + 1);
CombineRgn(hRgn_Combine,hRgn_Combine,hRgn_Temp,RGN_OR);
DeleteObject(hRgn_Temp); // Temp Region löschen
}
}
Counter_Width = -1;
}
// Ende Berechnung der Regionen
SetWindowRgn(hWnd,hRgn_Combine,true); // Fertige Region setzen,wird nun von Windows intern verwendet
}
// *************************************************** Blitten des Bitmaps auf fertiges Fenster ***********************************************
void CShapedWnd::ShowBitmap(long x_Dest,long y_Dest)
{
hdc = GetDC(hWndStore);
BitBlt(hdc,x_Dest,y_Dest,bmp.bmWidth,bmp.bmHeight,hdcBitmap,0,0,SRCCOPY);
ReleaseDC(hWndStore,hdc);
}
[ Dieser Beitrag wurde am 02.06.2003 um 15:56 Uhr von Gigabyte editiert. ]