Besserer Algorithmus zum Ausblenden einer Winform

7

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.

    
afaolek 19.09.2012, 15:23
quelle

6 Antworten

15

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.

%Vor%

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.

    
Victor Stoddard 07.11.2014 17:09
quelle
12

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%     
Servy 19.09.2012 16:29
quelle
3
%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%     
Aniket Inge 19.09.2012 15:30
quelle
1

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%     
Guillermo Villasana 11.11.2016 18:17
quelle
0

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%     
Tom 19.09.2012 15:52
quelle
0

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:

Ссылка

    
Nathan Fiscaletti 28.03.2017 10:04
quelle

Tags und Links