Transparenter Dialog mit 256 Transparenz-Stufen



  • Unter welchen Windows-Versionen soll es denn laufen ?

    Edit: Ignorier diesen Post einfach 😉



  • Danke!



  • Servus.
    Man kann jedes beliebige Fenster in einen "Layered Modus" umschalten.
    Du kannst den unten stehenden Code einfach in dein Project einfügen.
    Rufe dann bei Message==WM_INITDIALOG die Funktion auf. iAlpha ist dabei der sogenannte "Blendfaktor". Er kann Werte von 0-255 annehmen. Jeh größer dieser Faktor, umso undurchsichtiger wird dein Fenster.
    Nun zu "COLOR_TRANSPARENT":
    Erstens: Die Farbe ist beliebig.
    Zweitens: Wenn deine Hintergrundfarbe des Fensters identisch ist mit "COLOR_TRANSPARENT" oder du irgendetwas in deinem Fenster in dieser Farbe zeichnest, wird dein Fenster an der Stelle 100% transparent.
    Ich glaube, das ist was du suchst 😉

    #ifndef WS_EX_LAYERED
    #define WS_EX_LAYERED 0x00080000
    #endif
    
    #ifndef LWA_COLORKEY
    #define LWA_COLORKEY 1
    #endif
    #ifndef LWA_ALPHA
    #define LWA_ALPHA 2
    #endif
    
    #define COLOR_TRANSPARENT	RGB(0,0,1)
    
    int SetWindowTransparent_l(HWND hwnd, int iAlpha)
    {
      typedef DWORD (WINAPI *PSLWA)(HWND, DWORD, BYTE, DWORD);
      PSLWA			pSetLayeredWindowAttributes;
      HMODULE		hDLL;
      SetWindowLong (hwnd , GWL_EXSTYLE , GetWindowLong (hwnd , GWL_EXSTYLE ) | WS_EX_LAYERED ) ;
      hDLL = LoadLibrary ("user32.dll");
      if(!hDLL)
        MessageBox(NULL,TEXT("No Handle"),TEXT("ERROR"),MB_OK);
      pSetLayeredWindowAttributes = (PSLWA) GetProcAddress(hDLL,"SetLayeredWindowAttributes");
      if (pSetLayeredWindowAttributes != NULL)
      {
            /*
            * Second parameter RGB(255,255,255) sets the colorkey
            * to white LWA_COLORKEY flag indicates that color key
            * is valid LWA_ALPHA indicates that ALphablend parameter
            * (factor) is valid
            */
        pSetLayeredWindowAttributes (hwnd,COLOR_TRANSPARENT, iAlpha, LWA_COLORKEY|LWA_ALPHA);
      }
      return (0);
    }
    

    PS: An den 100% transparenten Stellen reagiert dein Fenster nicht mehr auf deine Eingaben, sondern das darunter liegende.



  • Man kann jedes beliebige Fenster in einen "Layered Modus" umschalten.

    Fenster mit dem WS_CHILD Flag nicht.

    Der Thread ist aber von 2004. Ich glaube nicht das er noch wirklich Hilfe braucht. 😉

    Aber trotzdem gut mal ein Beispiel dafür hier im Forum zu haben. 🙂



  • bei mir funktioniert das irgendwie nicht...
    kann jemand helfen???

    code:

    #define WIN32_LEAN_AND_MEAN //tells the compiler not to include MFC overhead
    #include <windows.h>
    #include <windowsx.h>
    #include <stdio.h>
    #include <math.h>
    
    #ifndef WS_EX_LAYERED
    #define WS_EX_LAYERED 0x00080000
    #endif
    
    #ifndef LWA_COLORKEY
    #define LWA_COLORKEY 1
    #endif
    #ifndef LWA_ALPHA
    #define LWA_ALPHA 2
    #endif
    
    #define COLOR_TRANSPARENT    RGB(255,255,255)
    
    int SetWindowTransparent_l(HWND hwnd, int iAlpha)
    {
      typedef DWORD (WINAPI *PSLWA)(HWND, DWORD, BYTE, DWORD);//BYTEv
      PSLWA            pSetLayeredWindowAttributes;
      HMODULE        hDLL;
      SetWindowLong (hwnd , GWL_EXSTYLE , GetWindowLong (hwnd , GWL_EXSTYLE ) | WS_EX_LAYERED ) ;
      hDLL = LoadLibrary ("user32.dll");
      if(!hDLL)
        MessageBox(NULL,TEXT("No Handle"),TEXT("ERROR"),MB_OK);
      pSetLayeredWindowAttributes = (PSLWA) GetProcAddress(hDLL,"SetLayeredWindowAttributes");
      if (pSetLayeredWindowAttributes != NULL)
      {
            /*
            * Second parameter RGB(255,255,255) sets the colorkey
            * to white LWA_COLORKEY flag indicates that color key
            * is valid LWA_ALPHA indicates that ALphablend parameter
            * (factor) is valid
            */
        pSetLayeredWindowAttributes (hwnd,COLOR_TRANSPARENT, iAlpha, LWA_COLORKEY|LWA_ALPHA);
      }
      return (0);
    }
    
    LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
    {
    	PAINTSTRUCT ps; //used when we get the WM_PAINT event
    	HDC hdc;
    	char buffer[80]; //used to print string
    	static int paintMessage = 0; //counter used to hold the number of times WM_PAINT has been called
    
    	//switch and see what message we are getting
    
    	if(msg==WM_INITDIALOG)
    		{
                    SetWindowTransparent_l(hwnd,100);
    		}
    
    	if(msg==WM_DESTROY)
    		{
    			PostQuitMessage(0);
    			return 0;
    		}
    
    	//take care of messages we didnt
    	return(DefWindowProc(hwnd, msg, wparam, lparam));
    
    }//end WindowProc
    
    //WinMain Entry
    int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
    {
    
    	WNDCLASSEX window; //blank window, we're using the extended windows class (WNDCLASSEX)
    	HWND hwnd; //window handle
    	MSG msg; //message
    
    	//now to fill in the window class
    	window.cbClsExtra = 0; //extra class stuff, set to 0 for now
    	window.cbSize = sizeof(WNDCLASSEX); //set to the size of the WINDOWCLASSEX structure
    	window.cbWndExtra = 0; //extra class stuff, set to 0 for now
    	window.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//BLACK_BRUSH); //sets the color of the brush to paint in, notice the type cast to HBRUSH, this is because GetStockObject() can be used for more tehn just getting the brushcolor
    	window.hCursor = LoadCursor(NULL, IDC_ARROW); //cursor for your app, sets it to the standard arrow
    	window.hIcon = LoadIcon(NULL, IDI_APPLICATION); //icon of your program
    	window.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //icon that appears on the titlebar and when minimized
    	window.hInstance = hinstance; //the application instance
    	window.lpfnWndProc = WindowProc; //name of the function that takes care of the messages
    	window.lpszClassName = "WINCLASS1"; //name of the class
    	window.lpszMenuName = NULL; //menu, dont worry about this now (maybe in a later example, just set it to NULL
    	window.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; //finally the style of the window, these are 
    																	//the most used and should suffice
    
    	//register the window class, notice we're using RegisterWindowEx() because we are using the extended window class
    	if(!RegisterClassEx(&window))
    		return 0;
    
    	//create the window
    	if(!(hwnd = CreateWindowEx(
    		NULL,//WS_EX_TRANSPARENT, //extended style
    		"WINCLASS1", //name of the class
    		"... by K4!53R", //title of the window
    		WS_OVERLAPPEDWINDOW | WS_VISIBLE, //common flags, you DO want to see your window, right?
    		0, 0, //initial x and y postion
    		300, 100, //initial height and width
    		NULL, //handle to parent, set to NULL so the desktop is the parent
    		NULL, //handle to menu, we didnt use a menu now so dont worry about it
    		hinstance, //instance of application
    		NULL ))) //extra param
    	return 0;
    
    	//main event loop
    	while(true)
    	{
    
    		//test if we have a message waiting for us in queue, if there is, take care of it
    		if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    		{
    
    			//check if message is a WM_QUIT message
    			if(msg.message == WM_QUIT)
    				break;
    
    			//translate any accelerator keys
    			TranslateMessage(&msg);
    
    			//send message to the window proc 
    			DispatchMessage(&msg);
    
    		}
    
    	}//end while
    
    	//use this to return to windows
    	return(msg.wParam);
    
    }//end WinMain
    


  • Fehlerbeschreibung?



  • Das fenster wird ganz normal angezeigt und ist kein bisschen durchsichtig...!



  • Hättest du dir auch nur ein bisschen Mühe gegeben hättest du gemerkt das du WM_INITDIALOG gar nicht bekommst. WM_CREATE ist der richtige Platz.

    Außerdem:

    WS_EX_LAYERED
    Windows 2000/XP: Creates a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.

    Bei meinem Test hat es aber trotz CS_OWNDC geklappt. 😕



  • COOL 😃 😮
    danke!!!
    vielen dank!
    es funzt!



  • transparente fenster sind scheisse 😃



  • wenn du nicht weist, worum es geht, kannst du dazu eigentlich nicht viel sagen, aber wenn du meinst...
    (du bist doch nur neidisch, dass ich das hinbekommen habe... 😉 😃 )


Anmelden zum Antworten