Bei der Suche nach Code zum Überblenden eines Winforms bin ich auf dieses Seite im MSDN-Forum.
%Vor% Die for
-Schleife hat ein nicht ganzzahliges Inkrement und, von einer vorherigen Frage, die ich fragte, ist das keine gute Programmiertechnik (wegen der ungenauen Darstellung der meisten Dezimalzahlen).
Ich habe diese Alternative gefunden.
%Vor%Welche davon ist effizienter?
Wenn es einen besseren Algorithmus zum Ausblenden eines Formulars gibt, bin ich sehr froh, wenn es enthalten ist.
Danke.
Vergessen Sie Timer (Wortspiel beabsichtigt).
Mit Visual Studio 4.5 oder höher können Sie nur await
eine Aufgabe verzögern. Ein Vorteil dieser Methode ist, dass sie asynchron ist, im Gegensatz zu einer Thread Sleep
oder DoEvents
Schleife, die die Anwendung während der Fade (und den anderen oben genannten DoEvents
Problemen) blockiert.
Verwendung:
%Vor%Sie sollten prüfen, ob das Objekt entfernt wurde, bevor Sie eine Transparenz darauf anwenden. Ich habe ein Formular als Objekt verwendet, aber Sie können jedes Objekt übergeben, das Transparenz unterstützt, solange es korrekt dargestellt wird.
Also, zuerst einmal application.DoEvents sollte vermieden werden , außer Sie wissen wirklich was Sie tun und sind sicher, dass dies eine angemessene Verwendung davon ist, und dass Sie es richtig verwenden. Ich bin ziemlich sicher, dass beides hier nicht der Fall ist.
Als nächstes kontrollieren Sie die Geschwindigkeit des Fadings? Im Grunde lassen Sie den Computer so schnell wie möglich ausbleichen und verlassen sich auf den inhärenten Overhead der Vorgänge (und Hintergrundprozesse), damit er länger dauert. Das ist wirklich kein sehr gutes Design. Sie sollten besser angeben, wie lange die Überblendung von Anfang an dauern sollte, damit sie zwischen den Maschinen konsistent ist. Sie können eine Timer
verwenden, um Code in den entsprechenden festgelegten Intervallen auszuführen und sicherzustellen, dass der UI-Thread für die Dauer der Überblendung nicht blockiert ist (ohne DoEvents
zu verwenden).
Ändern Sie einfach die duration
unten, um zu ändern, wie lange die Fade dauert, und ändern Sie steps
, um zu bestimmen, wie "abgehackt" es ist. Ich habe es auf 100 gesetzt, weil das genau das ist, was dein Code vorher getan hat. In der Realität brauchen Sie wahrscheinlich nicht so viele und Sie können einfach auf etwas senken, bevor es anfängt, abgehackt zu werden. (Je niedriger die Schritte, desto besser wird es funktionieren.)
Darüber hinaus sollten Sie sich nicht so um die Leistung für so etwas sorgen. Das Verblassen ist etwas, das im Maßstab von etwa einer Sekunde oder nicht viel weniger gemessen werden muss (damit ein Mensch es wahrnehmen kann) und für jeden Computer kann es heutzutage so viel mehr als das in einer Sekunde ist es nicht einmal lustig. Dies wird im Laufe einer Sekunde praktisch keine CPU in Bezug auf die Berechnung verbrauchen, so dass es eine Mikrooptimierung ist, zu versuchen, sie zu optimieren.
%Vor%ist effizienter, da die Anzahl der Gleitkommadivisionen im Vergleich zu Gleitkomma-Additionen (die vm-Flags nicht beeinflussen) maschinell teurer ist. Das heißt, Sie könnten die Anzahl der Iterationen um 1/2 reduzieren (das ist der Änderungsschritt zu i + = 0,02). Eine Verringerung der Opazität um 1% ist für das menschliche Gehirn NICHT wahrnehmbar und wird auch weniger teuer sein, wodurch es fast 100% schneller wird.
BEARBEITEN:
%Vor%Ich habe den Ansatz von Victor Stoddard auf einen SplashScreen angewendet. Ich habe es im Form_Load-Ereignis für fadeIn und FormClosing-Ereignis für fadeOut verwendet. HINWEIS: Ich musste die Deckkraft des Formulars vor dem Aufruf der fadeIn-Methode auf 0 setzen.
Hier sehen Sie die Reihenfolge der Ereignisse, die durch eine Winform (Lebenszyklus) ausgelöst werden: Ссылка
%Vor% In der Vergangenheit habe ich AnimateWindow
zum Ein- / Ausblenden eines generierten Formulars, das die gesamte Anwendung in SystemColor.WindowColor
.
Dieser nette kleine Trick bewirkt, dass Bildschirme in einer Assistenten-ähnlichen Oberfläche ausgeblendet werden. Ich habe so etwas eine Zeit lang nicht gemacht, aber ich habe P / Invoke in VB verwendet und die API in einem eigenen Thread ausgeführt.
Ich weiß, dass deine Frage in C # ist, aber es ist ungefähr dasselbe. Hier sind einige schöne VB, die ich ausgegraben habe und seit 2006 nicht mehr gesehen habe! Offensichtlich wäre es leicht, dies anzupassen, um Ihre eigene Form ein- und auszublenden.
%Vor% Ich habe eine Klasse speziell zum Ausblenden von Formularen geschrieben. Es unterstützt sogar ShowDialog
und DialogResults.
Ich habe es erweitert, da ich neue Funktionen benötigt habe, und bin offen für Vorschläge. Sie können hier nachsehen: