Halbtransparenter Dialog



  • Hallo.

    Ich möchte ich meiner WinCE Anwendung einen Dialog haben, welcher schwarz und halbtransparent ist. Schwarz bekomme ich hin, halbtransparent nicht. 😃

    Eine Eigenschaft 'Opacity' wie bei .NET scheint es bei den MFC ja nicht zu geben. Wie kann man das also realisieren?

    Was ich mir dazu gedacht hatte scheint nicht zu funktionieren: Wenn ich in OnEraseBkgnd true zurückgebe, wird der neue Dialog-Hintergrund nicht gezeichnet. Nun habe ich versucht Pixel um Pixel den alten sichtbaren Hintergrund auszulesen, die Farbe neu zu berechnen und wieder zu zeichnen:

    GetClientRect(rect);
    
    for(int x = 0; x <= rect.right; x++)
    {
    	for(int y = 0; y <= rect.bottom; y++)
    	{
    		PxOldColor = pDC->GetPixel(x,y);
    		PxNewColor = PxNewColor | (COLORREF)((PxOldColor & 0x0000ff) / 2) & 0x0000ff;
    		PxNewColor = PxNewColor | (COLORREF)((PxOldColor & 0x00ff00) / 2) & 0x00ff00;
    		PxNewColor = PxNewColor | (COLORREF)((PxOldColor & 0xff0000) / 2) & 0xff0000;
    		pDC->SetPixel(x,y,PxNewColor);
    	}
    }
    

    Zum einen funktioniert diese Lösung gar nicht, da der 'alte' Hintergrund zwar noch zu sehen ist, aber mit GetPixel scheinbar nicht auszulesen ist und zum anderen ist diese Vorgehensweise nicht sehr performant. Der Aufbau des Fenster dauert mehrere Sekunden.

    Wie kann ich also einen halbtransparenten Dialog bekommen?



  • *push*


  • Mod

    Opacity ist IMHO auf .NET CE genausowenig vorhanden.
    Ansonsten ist SetPixel overkill und unsinnig. Du musst schon eine Blockfunktion verwenden.

    In Der Windows API mit der MFC fürde ich das mit WS_EX_LAYERED lösen.

    Ansonsten kannst Du so was machen.
    http://www.codeguru.com/cpp/g-m/bitmap/specialeffects/article.php/c1773

    Das Problem ist nur, dass Dieses Verharen nicht dynamisch ist. D.h. Änderungen in dem unterliegenden Fenster werden dennoch verdeckt.


Anmelden zum Antworten