Fenster teils Transparent, teils undurchsichtig



  • Also ich komm am besten mal auf den Punkt 😃
    Ich möchte ein Fenster wie folgendes Erstellen: klick

    Problem für mich ist jedoch Folgendes: das Fenster ist Teilwese etwas transparent, sodass man hindurchgucken kann wie am Rand, aber auch teilweise eben nicht wie beispielsweise beim Text. Für mich irgendwie ein Ding der Unmöglichkeit oO
    Ich hab die letzten Tage schon so einige Versuche unternommen, beispielswesie mit WS_EX_LAYERED als Style und SetLayeredWindowAttributes, Colorkey und was weiß ich nich alles aber irgendwie komm ich noch zum gewollten Ergebnis.

    Kann mir einer von euch da auf die Sprünge helfen?! (Wenn möglich realisierbar mit C/C++^^)



  • Vieleicht hilft dir das hier weiter:
    http://www.vresh.net/2009/08/01/100-cpp-aero-glass-in-winapi-fenster/

    Alternativ wäre da noch GDI+.



  • naja direkt Aero Glas will ich nicht, damit erreich ich den effekt nich unbedingt..
    Eher iwi was mit der GDI+.. wär nett wenn du ne Idee dazu hättest^^
    PNGs ins Fenster bekomm ich ja damit mehr oder minder gut ins Fenster, aber dann hat das Fenster ja noch ne Hintergrundfarbe..
    Und wenn ich vorher mit nem Colorkey rangeh Funktioniert es auch nich: die Ränder vom PNG die halbtransparent sind haben dann den pinken/roten rand^^



  • Wirklich gute Tutorials dazu gibt es nicht.
    Da wirst du wohl nicht drum rum kommen, dir die Doku zu Gemüte zu führen:
    http://msdn.microsoft.com/en-us/library/ms533798(VS.85).aspx

    Ich habe selbst noch nicht wirklich viel mit GDI+ geschweige denn GDI gemacht. Vieleicht kann dir da ein anderer besser helfen.



  • Nja gut da war ich auch schon und hab mir so einiges angeguckt...
    Keine Ahnung obs noch sowas wie ne Art Alphachannel für das Fenster gibt.. speziell wie ich den dann ansprechen würde..
    Notfalls mit Aero Glas, aber das ganze ohne Unschärfe zu verwirklichen würde mich trotzdem freuen^^



  • Du brauchst "UpdateLayeredWindow" ( http://msdn.microsoft.com/en-us/library/ms633556(VS.85).aspx )
    und erzeugst dafür eine Bitmap mit Alphachannel und Transparenz an den gewünschten Stellen.



  • Knuddel, shau mal uf 'usermode aero' für XP (ohne blur):

    #include <windows.h>
    #pragma comment(lib, "msimg32.lib")
    
    int width(RECT *rc) {return rc->right - rc->left;}
    int height(RECT *rc) {return rc->bottom - rc->top;}
    
    void DrawMe(HWND hwnd, HDC hdcOrigin, HDC hdcTemp)
    {
    	RECT rc;
    	BLENDFUNCTION bf;
    	int w, h;
    	HDC hdcDesktop = GetDC(0);
    	HDC hdcWindow =  GetWindowDC(hwnd);
    
    	bf.BlendOp = AC_SRC_OVER;
    	bf.BlendFlags = 0;
    	bf.AlphaFormat = AC_SRC_ALPHA;
    	bf.SourceConstantAlpha = 255;
    
    	GetWindowRect(hwnd, &rc);
    	w = width(&rc);
    	h = height(&rc);
    	// copy from desktop bitmap to temporary bitmap
    	BitBlt(hdcTemp, 0, 0, w, h, hdcDesktop, rc.left, rc.top, SRCCOPY);
    	// blend the original window bitmap onto temporary bitmap
    	AlphaBlend(hdcTemp, 0, 0, w, h, hdcOrigin, 0, 0, w, h, bf);
    	// show the result
    	BitBlt(hdcWindow, 0, 0, w, h, hdcTemp, 0, 0, SRCCOPY);
    
    	ReleaseDC(hwnd, hdcWindow);
    	ReleaseDC(0, hdcDesktop);
    }
    
    BOOL __stdcall MyWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	static HDC _hdcOrigin; // window bitmap with alpha pixels
    	static HDC _hdcTemp;
    
    	switch (uMsg)
    	{
    		case WM_WINDOWPOSCHANGED: {
    			WINDOWPOS *pos = (WINDOWPOS*)lParam;
    			if ((pos->flags & SWP_SHOWWINDOW) && !_hdcOrigin)
    			{
    				WINDOWINFO wi;
    				BITMAPINFOHEADER bh;
    				RGBQUAD *pixels;
    				POINT pt;
    				int left, top;
    				HDC hdc = GetWindowDC(hwnd);
    
    				wi.cbSize = sizeof(wi);
    				GetWindowInfo(hwnd, &wi);
    
    				ZeroMemory(&bh, sizeof(bh));
    				bh.biSize     = sizeof(bh);
    				bh.biWidth    = width(&wi.rcWindow);
    				bh.biHeight   = height(&wi.rcWindow);
    				bh.biPlanes   = 1;
    				bh.biBitCount = 32;
    
    				// create window bitmap
    				_hdcOrigin = CreateCompatibleDC(hdc);
    				DeleteObject(SelectObject(_hdcOrigin, CreateDIBSection(
    					hdc, (BITMAPINFO*)&bh, DIB_RGB_COLORS, (void**)&pixels, 0, 0)));
    				BitBlt(_hdcOrigin, 0, 0, width(&wi.rcWindow), height(&wi.rcWindow), hdc, 0, 0, SRCCOPY);
    
    				// temporary bitmap for drawing
    				_hdcTemp = CreateCompatibleDC(hdc);
    				DeleteObject(SelectObject(_hdcTemp, CreateCompatibleBitmap(
    					hdc, width(&wi.rcWindow), height(&wi.rcWindow))));
    
    				ReleaseDC(0, hdc);
    
    				// initialize alpha pixels
    				// client area: 255
    				// nonclient area: 128
    				left = wi.rcClient.left - wi.rcWindow.left;
    				top  = wi.rcClient.top - wi.rcWindow.top;
    				SetRect(&wi.rcClient, left, top, left+width(&wi.rcClient), top+height(&wi.rcClient));
    
    				for (pt.y=0; pt.y<bh.biHeight; pt.y++)
    				{
    					int y = bh.biHeight - pt.y - 1;
    					RGBQUAD *lineptr = &pixels[y * bh.biWidth];
    
    					for (pt.x=0; pt.x<bh.biWidth; pt.x++)
    					{
    						lineptr[pt.x].rgbReserved = PtInRect(&wi.rcClient, pt) ? 255 : 128;
    					}
    				}
    			}
    			DrawMe(hwnd, _hdcOrigin, _hdcTemp);
    			break;
    		}
    		case WM_CLOSE: {
    			DestroyWindow(hwnd);
    			break;
    		}
    		case WM_DESTROY: {
    			if (_hdcOrigin) {
    				DeleteDC(_hdcOrigin);
    				DeleteDC(_hdcTemp);
    			}
    			PostQuitMessage(0);
    			break;
    		}
    		case WM_MOVE:
    		case WM_NCACTIVATE:
    		case WM_ACTIVATE:
    		case WM_ACTIVATEAPP:
    		case WM_MOUSEACTIVATE:
    		case WM_NCLBUTTONDOWN:
    		case 0x02A2:
    		case WM_SIZING:
    			DrawMe(hwnd, _hdcOrigin, _hdcTemp);
    	}
    	return FALSE;
    }
    
    int main(void)
    {
    	MSG msg;
    	HWND hwnd = CreateWindowEx(WS_EX_LAYERED, WC_DIALOG, TEXT("Transparent Caption"), WS_CAPTION|WS_SYSMENU|WS_BORDER,0,0,0,0,0,0,0,0);
    	SetLayeredWindowAttributes(hwnd, 0, 255, LWA_ALPHA);
    	SetWindowLong(hwnd, DWL_DLGPROC, (LONG)MyWndProc);
    	SetWindowPos(hwnd,0,200,200,400,300,SWP_NOZORDER|SWP_SHOWWINDOW);
    
    	while (GetMessage(&msg, 0, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return 0;
    }
    

Anmelden zum Antworten