Transparenz-Slider mit Schwarz-Effekt???



  • Hi COM,

    Ich habe mittlerweile herausgefunden, wie ich Transparenz auf TForm anwende.
    Jetzt habe ich dieses Beispiel programmiert:

    void __fastcall TForm1::Button9Click(TObject *Sender)
    {
      int TranzFaktor = 255;
      while(TranzFaktor!=0)
      {
        int i = 0;
        while(i<10000)
        {
          i++;
        }
        SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_LAYERED);
        SetLayeredWindowAttributes(Handle, 0, TranzFaktor /* 0 - 255 */, LWA_ALPHA);
        TranzFaktor--;
      }
    
      while(TranzFaktor!=255)
      {
        int i = 0;
        while(i<10000)
        {
          i++;
        }
        SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_LAYERED);
        SetLayeredWindowAttributes(Handle, 0, TranzFaktor /* 0 - 255 */, LWA_ALPHA);
        TranzFaktor++;
      }
    }
    

    Dieses lässt das Formular1 (TForm1) allmählich verschwinden und wieder auftauchen bzw. dessen Transparanz-Grad wird jedesmal um 1 verringert (erste Schleife) und wieder um 1 erhöht (zweite Schleife). Die verschachtelte Schleife sorgt nur jeweils dafür, wie schnell die Transparenz zunimmt und wieder abnimmt.

    Jetzt habe ich das Problem, dass beim ersten Ausführen des Buttons das komplette Fenster schwarz wird und dann der Transparenz-Slide-Effekt (Ablauf beider Schleifen) durchgeführt wird. Erst beim zweiten Ausführen des Button bleibt das Komplette Fenster, so wie es ist, inkl. Buttons und anderer Komponenten sichtbar (Abläufe funktionieren aber wie gehabt).

    Daher meine Frage. Warum taucht der Schwarz-Effekt beim ersten Ausführen des Buttons auf, nicht aber beim erneuten ausführen? Und wie kann ich das verhindern, dass dieser Schwarz-Effekt überhaupt auftaucht, sodass das Formular1 gleich beim ersten ButtonClick in seiner vollen Pracht den Abläufen unterzogen wird (also optisch)?

    Vielen Dank im Voraus!!

    Gruß

    Schlitzauge 🙂 🙂 🙂 🙂



  • Zwar schon ein paar Jährchen verstrichen, dennoch großes Interesse daran.
    Weiß denn keiner Rat?

    Grüße

    Schlitzauge 🙂



  • Durch deine Schleife blockierst du ja die GUI, d.h. da kann es zu allerlei komischen Effekten führen.
    Benutze besser einen Timer (für jeden einzelnen Transparenzschritt).
    Auch wenn das minimale Timerintervall ca. 14/15 ms (Windows-Beschränkung) beträgt, so kannst du ja die Transparenz-Schrittweite entsprechend vergrößern (anstatt in Einer-Schritten) - den Unterschied sieht man ja als Anwender kaum (z.B. um die gesamte Transparenzanimation in ungefähr 1 Sekunde (=1000 ms) anzuzeigen - und du den Timer auf 15 setzt, wäre deine Schrittweite dann 256 / (1000 / 15) = 3.84 ~= 4)

    P.S. Die 256 beziehen sich selbstverständlich auf entweder das Ein- oder Ausblenden (für beides mußt du halt die Schrittweite entsprechend anpassen und im Timer dann zwei Modi vorsehen bzw. 2 verschiedene Timermethoden schreiben).


Log in to reply