Transparens auf Selbstgezeichneter Schaltfläche
-
und wie soll ich das genau benutzen?
habe das jetzt so in WM_DRAWITEM reingeschrieben:
TransparentBlt(pdis->hDC, rectEnte.left, 200, 50, 50, pdis->hDC, rectEnte.left, 200, 50, 50, RGB(255,255,255));ging nicht..
-
Und welche Farbe gedenkst Du zu ersetzen? Wirklich Weiß?
-
ja weiß wäre gut.. nur was ist falsch?=
-
1. lösch den Hintergrund des Controls
2. dem Button-Status entsprechende Bitmap in eine zweiten DC laden
3. diesen DC dann mit TransparentBlt(pdis->hDC,...) auf das Control bringen
-
ich bekomms nicht hin.. ist aussenrum immernoch weiss..
bis jetzt bin ich so weit:
case WM_DRAWITEM: pdis = (LPDRAWITEMSTRUCT) lParam; hdcWindow = GetDC(hEnte); hdc2 = CreateCompatibleDC(hdcWindow); hBM = CreateCompatibleBitmap(hdc2, 50, 50); SelectObject(hdc2, hBM); hBitmap = LoadBitmap(hInst, _T("ENTE")); hBrush = CreatePatternBrush(hBitmap); DeleteObject(hBitmap); FillRect(hdcWindow, &pdis->rcItem, hBrush); TransparentBlt(pdis->hDC, 0, 0, 50, 50, hdcWindow, 0,0,50,50, RGB(255,255,255)); DeleteObject(hBM); DeleteDC(hdcWindow); DeleteDC(hdc2); break;
-
lass den Mist mit dem PatternBrush und selecte die Bitmap direkt in hdcWindow.
Erst nach TransparentBlt() darfst du die Bitmap bzw. hdcWindow löschen.
Außerdem musst du den Hintergrund mit irgendeiner Farbe (ausgenommen Weiß) löschen, bevor du TransparentBlt() aufrufst.
-
...
und hdcWindow sollte eigentlich hdc2 sein (in den du dann auch die Bitmap lädst)
-
case WM_DRAWITEM: pdis = (LPDRAWITEMSTRUCT) lParam; /* get desktop DC */ hdcWindow = GetDC(GetDesktopWindow()); hdc2 = CreateCompatibleDC(hdcWindow); hBitmap = LoadBitmap(hInst, _T("ENTE")); SelectObject(hdc2, hBitmap); ReleaseDC(GetDesktopWindow(),hdcWindow); hBrush = CreateSolidBrush(0xff); /* erase background with red brush */ FillRect(pdis->hDC,&pdis->rcItem,hBrush); TransparentBlt(pdis->hDC, 0, 0, 50, 50, hdc2, 0,0,50,50, RGB(255,255,255)); DeleteObject(hBrush); DeleteDC(hdc2);
-
jetzt ist es aber einfach nur rot statt weiss.. und aussenrum von der ente noch ein bisschen weiss....
tu ich rot vom ganzem fenster abziehen dann gehts.. nur is dahinter ein hintergrund bild, den teil von dem bild sieht man dann auch nichtmehr. sondern das fenster dahinter.
-
Was verstehst du den unter Transparent? Du hast einen Hintergrund den du mit einem zweiten Bild überlagerst, wobei hier nur bestimmte Bereiche kopiert werden. In gezeigten code ist der Hintergrund rot gefärbt - natürlich kannst du hier auch irgendein anders Bild hin laden.
Oder möchtest du einen Button in 'Enten'-Form erstellend, d.h. das nur ein klick auf die ‚Ente‘ den Button schaltet?
-
ja genau einen button in entenform.
der klick kann ruhig ein bisschen daneben gehen so wie die bildgröße halt ist.. hier z.b 50x50.. nur aussenrum bleibt halt immer dieses rote viereck.. und da wo das rot ist sollte das hintergrundbild des clientbereichs sein
-
naja, du hast ja das Hintergrund Bild des eltern Fenstes. Von diesem must du einfach nur den entsprechenden Bereich kopieren (BitBlt) bevor du die 'Ente' drüber legst.
-
nur wie bekomme ich das in FillRect wo ja ein hBrush rein kommt.. bin jetzt so weit.
case WM_DRAWITEM: pdis = (LPDRAWITEMSTRUCT) lParam; /* get desktop DC */ hdcWindow = GetDC(GetDesktopWindow()); hdc2 = CreateCompatibleDC(hdcWindow); hBitmap = LoadBitmap(hInst, _T("ENTE")); SelectObject(hdc2, hBitmap); ReleaseDC(GetDesktopWindow(),hdcWindow); // Hier der Hintergrund hdc1 = GetDC(hWnd); hBitmap=LoadBitmap(hInst, TEXT("HINTERGRUND")); hBrush = CreatePatternBrush(hBitmap); SelectObject(hdc1, hBrush); BitBlt(hdc2, rEnte.left, rEnte.top, 50, 50, hdc1, rEnte.left, rEnte.top, SRCCOPY); /* erase background with red brush */ FillRect(pdis->hDC,&pdis->rcItem,hBrush); TransparentBlt(pdis->hDC, 0, 0, 50, 50, hdc2, 0,0,50,50, RGB(255,255,255)); DeleteObject(hBrush); DeleteDC(hdc2); break;
-
Du hast den falschen Ansatz. Wenn das Fenster selbst eine nicht Rechteckform haben soll, dann musst Du die Region des Fensters ändern:
-
ahh, danke schön.. das ist interessant.
nur is halt mfc. mal gucken