Opacitiy Effekt gesucht?



  • Hallo..

    Ich möchte in meinem Projekt (BDS 2006) eine Passwortabfrage einfügen.
    Ein kleines Fenster für die Eingabe soll in der Mitte erscheinen.
    Soweit so gut. Funktioniert auch.

    Jetzt möchte ich die sache aber Grafisch ein wenigs anspruchsvoller gestalten.
    Das Passwortfenster in der mitte nimmt ja nicht die gesamte Fensterfläche ein. Um die PW eingabe drumherum soll das darunterliegende Form verdunkelt werdern. (ähnlich dem Schwarz/Weiss effekt bei der Abfrage Windows herunterfahren/neustarten/standby)
    Gibt es da eine Möglichkeit??? Zb b irgendwas Transparentes über das Fenster legen??



  • Gibt keine Möglichkeit, du musst dir selbst etwas einfallen lassen.

    Einfachste Methode (und vermutl. das, was auch Windows macht): Mach 'n Screenshot von dem darunterliegenden Fenster. Das sich öfnende Fenster setzt du dann einfach so, dass es das darunterliegende zu 100% überdeckt und darauf den Screenshot anzeigt. Den Screenshot selbst kannst du dann beliebig bearbeiten 😉



  • Ich hab da mal was gemacht. Hier die Funktion:

    VOID DarkenScreen()
    {
       HBITMAP           hBrushBmp;
       HDC               hMemDC;
       HDC               hdc;
       HBRUSH            hBrush, hOrgBrush;
       int               i, k, offset, width, height;
    
       // Vorbereitungen
       width     = Screen->Width;
       height    = Screen->Height;
       hdc       = GetWindowDC(GetDesktopWindow());
       hMemDC    = CreateCompatibleDC(hdc);
       hBrushBmp = CreateCompatibleBitmap(hdc, 8, 8);
       SelectObject(hMemDC, hBrushBmp);
    
       // Das Brush-Bitmap erstellen im DC
       offset = 0;
       for(i=0; i<8; i=i+1)
       {
          for(k=0; k<8; k=k+1)
             if(   (  (k + offset) % 2  ) == 0   )
                SetPixel(hMemDC, k, i, RGB(0,0,0));
             else
                SetPixel(hMemDC, k, i, RGB(255,255,255));
          offset = offset + 1;
       }
    
       // Den Brush erstellen und ins Screen-DC hauen
       hBrush = CreatePatternBrush(hBrushBmp);
       hOrgBrush = (HBRUSH)SelectObject(hdc, hBrush);
    
       // Den Bildschirm verdunkeln
       PatBlt(hdc, 0, 0, width, height, 0xA000C9);
    
       // Aufräumen
       SelectObject(hdc, hOrgBrush);
       DeleteObject(hBrush);
       DeleteObject(hBrushBmp);
       ReleaseDC(NULL, hMemDC);
       ReleaseDC(GetDesktopWindow(), hdc);
    }
    


  • Goile Sache !!
    Und wie kann ich den Bildschirm wieder auf die ursprünglichen Werte setzen ?



  • Na, wie wohl:

    InvalidateRect(NULL, NULL, TRUE);
    


  • Stimmt !! Das ich da nicht selbst drauf gekommen bin !! 😢



  • Ja...



  • Soo... nach langem Grübeln und Testen ist mir die Eigenschaft Alphablending aufgefallen.
    Ich lasse jetzt einfach vor dem Passwortfenster ein hellblaues leeres Fenster mit AlphaBlending = 200 im Vollbildmodus

    this->Height = Screen->Height;
    this->Width = Screen->Width;
    

    aufgehen (nicht nodal!!).
    Das Passwortfenster liegt dann modal darüber. Ein Schreenshot findet ihr hier

    Funktioniert aber nur im XP-Style 😞



  • Gut... Wenn du so viel Rechenleistung verpowern willst...

    EDIT: Und nebenbei hättest du dich wenigstens mal für meine Bemühungen bedanken können. Ich such das extra für dich raus, teste es nochmal und von dir kommt dahingehend nicht mal irgendeine Reaktion.



  • Bitte Entschuldige.
    Tut mir leid... kommt ned nochmal vor.

    Danke für Eure Beiträge!

    Die Rechenleistung spielt eigentlich keine Rolle. Das Fenster geht wieder zu bevor irgendetwas auf die Passworteingabe reagiert.



  • Das AlphaBlending allein verbraucht richtig viel Power.



  • Einen ähnlichen Effekt bekommst du übrigens mit folgender Funktion:

    VOID DarkenScreenVCL()
    {
      TCanvas* ScreenCanvas;
      Graphics::TBitmap* bmp;
      int i,k, offset;
    
      ScreenCanvas = new TCanvas;
      ScreenCanvas->Handle = GetWindowDC( GetDesktopWindow() );
    
      bmp = new Graphics::TBitmap;
      bmp->Width  = 8;
      bmp->Height = 8;
      bmp->PixelFormat = pf32bit;
      //bmp->Monochrome = true;
    
      offset = 0;
      for(i=0; i<8; ++i)
      {
         for(k=0; k<8; ++k)
            if(   (  (k + offset) % 2  ) == 0   )
               bmp->Canvas->Pixels[k][i] = clBlue;
            else
               bmp->Canvas->Pixels[k][i] = clWhite;
         offset++;
      }
    
      ScreenCanvas->Brush->Color  = clGray;
      ScreenCanvas->Brush->Bitmap = bmp;
      PatBlt(ScreenCanvas->Handle, 0, 0, Screen->Width, Screen->Height, 0xA000C9);
    
      delete bmp;
      ReleaseDC(NULL, ScreenCanvas->Handle);
      ScreenCanvas->Handle = NULL;
      delete ScreenCanvas;
    }
    

Anmelden zum Antworten