Shaped Window
-
Diese Frage taucht immer mal wieder auf. Wie erzeuge ich ein Shaped Window?
Hier ist ein gutes Beispiel: http://www.codeguru.com/dialog/ShapedWindow.html
-
Da gibt es aber viel bessere Artikel drüber. Du hast gerade den schlechtesten erwischt
-
Kommt mir wie gerufen,schon probiert ,funktioniert wunderbar.Danke für den Link.
Mfg Giga
-
@<;)>: War nur ein Zufallsfund. Wie wärs, wenn Du die besseren Stellen postest, oder willst Du nur angeben?
-
Habs zwar ein wenig ummodifiziert,kann mir aber nicht vorstellen wie mans besser machen könnte.Noch was Mr.Anonymus -> Kritik hegen alleine reicht nicht,wenn dann mußt du uns auf jeden Fall einen besseren Lösungsvorschlag unterbreiten.Wir warten
Mfg Giga
-
-
Seite schon gespeichert
Mfg Giga
-
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. ]