Transparentes Fenster verschieben!?



  • Hi,

    ich habe mir ein Fenster mit der HOLLOW_BRUSH erstellt, welches ich bei WM_MOUSEMOVE per SetWindowPos verschieben will. Nun habe ich aber immer Gestückel von den Fenstern darunter in meinem Fenster, es wird also nicht neu gezeichnet. Habe es schon mit InvalidateRect usw. nach jedem Verschieben versucht, klappt aber auch nicht.

    Hat jemand eine Idee, wie ich solch ein verschiebbares, transparentes Fenster erstellen kann?

    Danke! 🙂
    Alex



  • !!Alex!! schrieb:

    Hat jemand eine Idee, wie ich solch ein verschiebbares, transparentes Fenster erstellen kann?

    Jo mit SetLayeredWindowAttributes(...) und:

    // in deiner WndProc:
    // ...
    
       case WM_LBUTTONDOWN:
          SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0L);
          break;
    
    // ...
    


  • DANKE!!! 👍



  • Leider kennt der Kompiler die Funktion und den extendet style nicht.

    Ich habe die Windows-Versionenmakros über dem Include alle auf über 0x0500 definiert. Woran kann das noch liegen?

    Danke!



  • Platform SDK ist auch drauf ? Und Include-Verzeichnis Reihenfolge richtig eingestellt ?

    (btw. SetLayeredWindowAttributes() tut erst ab win2k, falls deine anwendung auch unter älteren windows-versionen noch rennen soll)



  • Du musst dir die Funktionsadresse aus der DLL direkt laden.



  • Hab grad noch was gefunden, das ich irg-wann mal geschrieben hab:

    bool SetTransparentLevel(HWND hWnd, BYTE byLevel) // byLevel: 0 = unsichtbar, 255 = sichtbar
    { 
    	BOOL (WINAPI *pSetLayeredWindowAttributes)(HWND hWnd, COLORREF crKey, BYTE byAlpha, DWORD dwFlags);
    	HMODULE hmUser32 = GetModuleHandle(TEXT("USER32.DLL")); 
    	if(hmUser32 == NULL)
    		return (false);
    	if(!(GetWindowLongPtr(hWnd, GWL_EXSTYLE) & 0x00080000L))
    		SetWindowLongPtr(hWnd, GWL_EXSTYLE, GetWindowLongPtr(hWnd, GWL_EXSTYLE) | 0x00080000L); 
    	pSetLayeredWindowAttributes = reinterpret_cast<BOOL (WINAPI *)(HWND hWnd, COLORREF crKey, BYTE byAlpha, DWORD dwFlags)>(
    		GetProcAddress(hmUser32, "SetLayeredWindowAttributes"));
    	if(pSetLayeredWindowAttributes != NULL)
    		if(pSetLayeredWindowAttributes(hWnd, NULL, byLevel, 0x00000002))
    			return (true);
    	return (false);
    }
    

    EDIT: Vertipper



  • Danke.

    Aber wenn die Funktion nur auf >=Win2000 läuft, dann kann ich sie leider nicht verwenden.

    Hat jemand eine Idee, wie man sich das auch auf älteren Systemen zusammenfrickeln kann? Ich brauche ja nur eine 100%ige Transparenz, das sollte doch machbar sein!?

    Und das mit dem Neuzeichnen während des Verschiebens klappt leider auch nicht. Es wird also immer noch alles darunter gezeichnete "übernommen" bzw. Fetzen davon usw. Ich nutze jetzt übrigens die WM_NCLBUTTONDOWN-Methode von CodeFinder für's draggen. (Thx)

    Gruß
    Alex



  • !!Alex!! schrieb:

    Danke.

    Aber wenn die Funktion nur auf >=Win2000 läuft, dann kann ich sie leider nicht verwenden.

    Hat jemand eine Idee, wie man sich das auch auf älteren Systemen zusammenfrickeln kann?

    Jo schau mal hier: < 💡 >


Anmelden zum Antworten