TTimer + AlphaBlendValue -> Fenster langsam ausblenden
-
Hallo Leute!
Habe mich eben hier angemeldet, und in den FAQ folgendes gelesen:
mit 'nem timer und dann mit application->ondeactivate
und application->activate das form ein und ausblenden
lassen wenn ein anderes programm den fokus erhaelt,
echt spitze!in URL FAQ 39243
Naja, jedenfalls schreibe ich testweise an einem Chatprogramm. Und wenn das Chatfenster in den Systray minimiert ist, dann wird dem User in einem neuem Form (MsgForm) rechts unten die neue Nachricht angezeigt.
Nach einem Intervall = 1700 verschindet das Fenster automatisch wieder.
Aber ich fände es furchtbar toll, wenn sich das Fenster nicht einfach "zerstören" würde, wenn es verschwindet, sondern wenn es sich schrittweise ausblendet.
Dazu habe ich folgendes versucht:void __fastcall TChatForm::Timer1Timer(TObject *Sender) { cl = 255; MsgForm->AlphaBlend = true; while (cl > 100) { MsgForm->AlphaBlendValue = cl; cl = cl - 20; MsgForm->Refresh(); } MsgForm->Close(); Timer1->Enabled = false; }Aber es geschieht nix
Das neue Form erscheint etwas transparent, aber es verändert sich dann nicht weiter, d.h. es bleibt immer gleich transparent, und schließt sich dann mit Close();Ich hoffe, mein Problem best möglich dargestellt zu haben, und hoffe nun, das ihr mir weiterhelfen könnt!
MfG
Tippo
-
Wozu die while Schleife, wenn Du doch einen Timer benutzt.
eigentlich reicht folgendes:
void __fastcall TForm1::Timer1Timer(TObject *Sender) { if(Form1->AlphaBlendValue > 20) Form1->AlphaBlendValue -= 20; else Form1->Close(); }
-
Sorry, hatte nicht genau gelesen. Der Timer bestimmt bei Dir nur für die Dauer der Anzeige?!
Aber wenn ich es so mache wie du gehts bei mir auch:
while(Form1->AlphaBlendValue > 20) { Form1->AlphaBlendValue -= 20; } Form1->Close();vielleicht hilft ein
Application->ProcessMessages();
-
Also der Timer hält das Fenster für 1800ms offen, in der zeit kann er User die Nachricht lesen, dann soll das Fenster verschwinden, bisher Close() jetzt soll es halt ausbleden.
Mit deinem Code habe ich jetzt einen neuen Timer auf dem Meldungsform MsgForm erstellt, der nur noch für die Änderung von AlphaBlendValue auf dem MsgForm zuständig ist.
Also nicht mehr die Zeit bis zum schließen zählt und dann schließt.void __fastcall TMsgForm::FormCreate(TObject *Sender) { Timer2->Interval = 10; Timer2->Enabled = true; MsgForm->Left = Screen->Width - ClientWidth; MsgForm->Top = Screen->Height - ClientHeight; SetWindowPos(Application->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); // always on top handle } //--------------------------------------------------------------------------- void __fastcall TMsgForm::Timer2Timer(TObject *Sender) { if (AlphaBlendValue > 100) AlphaBlendValue -= 100; } //--------------------------------------------------------------------------- void __fastcall TMsgForm::FormClose(TObject *Sender, TCloseAction &Action) { Timer2->Enabled = false; } //---------------------------------------------------------------------------Aber es geschieht immer noch nichts. Irgendwas scheine ich ganz falsch zu machen mit dem Timer...
Aber danke schon mal an dich!
-
Naja, der Maximalwert von AlphaBlendValue ist ja 255. wenn Du da gleich 100 abziehst ist das ja schon nach 2 Schritten vorbei. Das geht ja schneller als du kucken kannst.
AlphaBlend hast Du auf true gesetzt? Hast Du es denn auch schon mit anderen Schrittweiten und/ oder längeren Intervallen versucht?
Das Problem ist halt: ich kann da eigentlich kein Problem sehen. Bei mir geht das halt problemlos...
-
^^Kann ich nur bestätigen. Was willst Du bei lediglich zwei Durchgängen beobachten. Weiterhin, wie bereits angesprochen, fehlt in Deinem Timerereignis ein ProcessMessages() oder ein TForm::Refresh().
Der von Dir zuerst gepostete Code funktioniert auch bei mir problemlos.
Nochmal genau schauen und den Debugger benutzen.int cl = 255; Form1->AlphaBlend = true; Form1->AlphaBlendValue = 255; Application->ProcessMessages(); int x = 1; while (cl >= 0) { Form1->AlphaBlendValue = cl; cl = cl - 5 - x; //Form1->Refresh(); Application->ProcessMessages(); // ^^gleiches Ergebnis x += 5; } Form1->Close();
-
Guten Abend die Herren!
Danke für die wirklich schnellen Post!

Ihr habt natürlich Recht: das mit dem -100 da schaffe ich nur 2 Durchläufe ^^ is klaaa
Man, ich hab mich selber aufs Kreuz gelegt: habe an anderer Stelle im Code nochmal auf de AlphaBlendValue Wert direkt zugegriffen, und den hat es dann auch übernommen.Das habe ich korrigiert. Und nun läufts! Aber viel hat man ja nicht davon, ich meine das läuft ja verdammt schnell ab, auch wenn man die Werte noch weiter nach unten korrigiert.
Danke nochmal,
MfGTippo
-
Dann korrigier mal den Dekrenmentwert der Schleife Richtung 1. Das läuft doch (zu) langsman ab.
-
oder bau noch ein Sleep() mit ein.
-
Jop, hab ich eben gemacht, jetzt funzt es super!
Danke für die fachkundige Hilfe!Tippo