Transparenter Hintergrund



  • Hallo alle zusammen,
    hab da so 'n kleines Problem. Ich hab ein Fenster erstellt, in dem ein RoundRect
    enthalten ist, ich will jetzt das dieses RoundRect so int etwa mein Fenster darstellt (hab das Fenster mit WS_POPUP erstellt). Dazu hab ich in der WNDCLASS die eigenschaft hbrBackground auf NULL gesetzt. Klappt ja auch ganz gut aber ein paar Sachen stören noch, wenn hinter meinem Fenster ein anderes Fenster (z.B. Explorer) geöffnet ist und ich dieses Fenster jetzt minimiere, dann bleiben Teile dieses Fensters im Bereich meines Fensters, der eigentlich trasparent sein müsste. (hoffe hab mich versändlich ausgedrückt).
    Kennt jemand eine Lösung, wie ich den Hintergrund des Fensters dauerhaft transparent halte?

    MfG
    Whisel



  • Schau dir mal das hier an: Win32 Window Skinning 🙂



  • Hallo flenders,
    vielen, vielen dank! 😃
    Genau das hab ich gesucht, nur wusste ich nicht, unter welchem Topic ich das finden soll.



  • Feines kleines Tutorial... hab aber damit ein Problem:

    CPaintDC dc(this); 
    HDC dcSkin = CreateCompatibleDC(0);
    HBITMAP hOldBmp = (HBITMAP)SelectObject(dcSkin, _hBitMap);
    BOOL b = BitBlt(dc, 0,0,320,240, dcSkin, 0,0, SRCCOPY);
    

    ...funktioniert erst mal, BitBlt kopiert mir das Bitmap in den dc 🙂

    Dann habe ich versucht, das ganze noch transparent zu machen:

    SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
    lpfnSetLayeredWindowAttributes SetLayeredWindowAttributes;
    HMODULE hUser32 = GetModuleHandle("user32.dll");
    SetLayeredWindowAttributes = (lpfnSetLayeredWindowAttributes GetProcAddress (hUser32,"SetLayeredWindowAttributes");
    SetLayeredWindowAttributes(m_hWnd,0 , g_iCount, LWA_ALPHA);
    

    ...funzt auch, aber das Bitmap wird nur kanz kurz angezeigt und nach dem ersten Aufruf von SetLayeredWindowAttributes wird nur noch das ganz normale Fenster angezeigt. 😞
    Wieso?? BitBlt returned mit 1, das ist auch OK.
    Wie kann ich das machen, dass er mein BitMap transparent macht?



  • Hast du das mit BitBlt in WM_PAINT stehen - dort gehört das nämlich hin 😉



  • yes...in dlg::OnDraw

    Wie gesagt, es funktioniert...bis zu dem Zeitpunkt wo

    SetLayeredWindowAttributes
    

    aufgerufen wird. Die Funktion zeigt dann wieder meinen Dialog im Standard-Look an, aber trasparent.
    Ein Invalidate ruf ich auch noch nach SetLayeredWindowAttributes auf, damit der Dialog neu gezeichnet wird - funzt auch, aber das Bitmap wird nicht mehr angezeigt.


Anmelden zum Antworten