Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Fenster langsam einblenden

8 views
Skip to first unread message

Matthias H.

unread,
Dec 4, 2003, 5:09:43 AM12/4/03
to
Hi Leutz!

WinXP kann Fenster langsam einblenden und ausblenden,
indem die Durchsichtigkeit langsam erhöht/ verniedrigt
wird.
Man kann theoretisch die Methoden Load und Closed
benutzen hat aber den Nachteil, daß der Fensterinhalt
nicht zu sehen ist, während des Ein und Ausblendens.
Gibt es nicht noch Methoden wie BeforeLoad, AfterLoad und
BeforeClosing und AfterClosing, wie es früher bei VB der
Fall war?
Welche Möglichkeiten hab ich noch?

Sebastian Richter

unread,
Dec 4, 2003, 6:10:02 AM12/4/03
to
Hallo,

Am 4.12.2003-11:09 schrieb Matthias H.:
> WinXP kann Fenster langsam einblenden und ausblenden,
> indem die Durchsichtigkeit langsam erhöht/ verniedrigt
> wird.

Win2000 auch! Und am besten in einem Timer.

> Man kann theoretisch die Methoden Load und Closed
> benutzen hat aber den Nachteil, daß der Fensterinhalt
> nicht zu sehen ist, während des Ein und Ausblendens.

Weil du der Anwendung keine Zeit gibst, sich darzustellen. Du könntest im
Loop Application.DoEvents() aufrufen oder (viel besser) in einem Timer
Ein-/Ausblenden.

> Welche Möglichkeiten hab ich noch?

Timer.

... ich hab da mal was vorbereitet:

public sealed class Fading
{
public Fading( Form form )
{
_form = form;
_form.Opacity = 0;
_form.Closing += new CancelEventHandler( onClosing );

_timer.Interval = 40;
_timer.Tick += new EventHandler( onTimer );
_timer.Start();
}

private void onClosing( object sender, CancelEventArgs e )
{
if( !_closing )
{
e.Cancel = true;
_closing = true;
_timer.Start();
}
}

private void onTimer( object sender, EventArgs e )
{
if( _starting )
{
_form.Opacity = _form.Opacity + 0.05;
if( _form.Opacity >= 1.0 )
{
_starting = false;
_timer.Stop();
}
}

if( _closing )
{
_form.Opacity = _form.Opacity - 0.05;
if( _form.Opacity <= 0.0 )
_form.Close();
}
}

private readonly Form _form;
private readonly Timer _timer = new Timer();

private bool _starting = true;
private bool _closing = false;
}

Die ist ganz einfach zu benutzen. Einfach im Konstructor des Forms diese
Zeile einfügen:

new Fading( this );

Danach wird das Form schön Ein- und beim beenden Ausgeblendet.

Eine Referenz auf die Klasse ist nicht notwendig, da sie sich ins Form
einklinkt.

mfg
Basti
--
Ich bin zwei Signaturen

Günter Prossliner

unread,
Dec 4, 2003, 6:32:56 AM12/4/03
to
Netter Code! Ein Nachteil ist aber, dass das Einfaden (im Konstruktor) IMO
erst beim Anzeigen des Formulars stattfinden sollte. Ich gehe nähmlich z.B.
oft so vor, dass ich Formulare lade, ohne diese unmittelbar anzuzeigen, oder
zeige ein bereits erzeugtes Formular (also ohne dass der Konstruktor noch
mal aufgerufen wird) mehrmals an.

mfg GP

"Sebastian Richter" <ne...@cyberbasti.de> wrote in message
news:m3ib2dr2ylv2$.17cwp7zenn37r$.dlg@40tude.net...

Herfried K. Wagner [MVP]

unread,
Dec 4, 2003, 6:52:22 AM12/4/03
to
Hallo Günter!

* Günter Prossliner <gpointpr...@removegmx.at> scripsit:


> Netter Code! Ein Nachteil ist aber, dass das Einfaden (im Konstruktor) IMO
> erst beim Anzeigen des Formulars stattfinden sollte. Ich gehe nähmlich z.B.
> oft so vor, dass ich Formulare lade, ohne diese unmittelbar anzuzeigen, oder
> zeige ein bereits erzeugtes Formular (also ohne dass der Konstruktor noch
> mal aufgerufen wird) mehrmals an.

Naja, du übergibst ja der Klasse die Formularinstanz, also sollte das
kein Problem sein. Ich würde aber auf solchen benutzerfeindilichen
Schnickschnack sowieso verzichten.

--
Herfried K. Wagner [MVP]
<http://www.mvps.org/dotnet>

Dirk Primbs [MS]

unread,
Dec 4, 2003, 7:24:32 AM12/4/03
to
hirf-spa...@gmx.at (Herfried K. Wagner [MVP]) schrieb in news:bqn7b6
$23v43m$4...@ID-208219.news.uni-berlin.de:

> Ich würde aber auf solchen benutzerfeindilichen
> Schnickschnack sowieso verzichten.

Hm...
Es gibt allerdings durchaus Fälle, in denen sich derartiges gut _und_
benutzerfreundlich einsetzen läßt.
Populäres Beispiel: Mailbenachrichtigung in Outlook.

Gruß,
Dirk

Herfried K. Wagner [MVP]

unread,
Dec 4, 2003, 7:41:04 AM12/4/03
to
Hallo Dirk!

* Dirk Primbs [MS] <dirk_...@hotmail.com> scripsit:


>> Ich würde aber auf solchen benutzerfeindilichen
>> Schnickschnack sowieso verzichten.
>
> Hm...
> Es gibt allerdings durchaus Fälle, in denen sich derartiges gut _und_
> benutzerfreundlich einsetzen läßt.
> Populäres Beispiel: Mailbenachrichtigung in Outlook.

Da ich Outlook nicht verwende, kenne ich das Verhalten dort
nicht. Allerdings würde es mich nerven, wenn ich erst einmal 2 Sekunden
warten muss, bis ich das Formular verwenden kann.

Ralf Jänike

unread,
Dec 4, 2003, 7:57:35 AM12/4/03
to
Anderes populäres Beispiel: Winamp 5 (RC8) da wird ein Feld ein- und
ausgeblendet wenn ein neuer Track abgespielt wird

"Herfried K. Wagner [MVP]" <hirf-spa...@gmx.at> schrieb im Newsbeitrag
news:bqnaeh$24546e$8...@ID-208219.news.uni-berlin.de...

Matthias H.

unread,
Dec 4, 2003, 8:01:44 AM12/4/03
to
>Da ich Outlook nicht verwende, kenne ich das Verhalten
dort
>nicht. Allerdings würde es mich nerven, wenn ich erst
einmal 2 Sekunden
>warten muss, bis ich das Formular verwenden kann.


Da geb ich dir prinzipiell mal Recht, aber die Anwendung
an der ich sitze, braucht nur wenig Benutzereingaben und
da macht sich solch ein Schnick-Schnack optisch ganz gut.
Ich finde eh, daß man ein wenig Zeit für ein paar Effekte
aufbringen sollte. Wenn die Anwendungen heute immer noch
im Standard-Grau von früher wären, dann wäre das Arbeiten
damit auch nicht interessant. Man kann dem User ja die
Möglichkeit des Ein und Ausschaltens geben. Dabei würde
mich gleich mal interessieren, wo man das bei WindowsXP
machen kann, weil mein Startmenü macht diesen tollen
Effekt seit Ewigkeiten nicht mehr...

Matthias H.

unread,
Dec 4, 2003, 9:41:41 AM12/4/03
to
Ich hab deinen tollen Quellcode ausprobiert. Sieht ganz
gut aus, bis auf die Tatsache, daß das Fenster nicht
gefadet wird...
Stattdessen hab ich es mit dem DoEvents()-Befehl gemacht.
Der funktioniert. Insgesamt geht das Faden aber relativ
langsam, obwohl als Zeitspanne nur 1 Tick
(new TimeSpan(1)) angegeben ist. Woran kann das liegen?

Sebastian Richter

unread,
Dec 4, 2003, 10:02:02 AM12/4/03
to
Hallo,

Am 4.12.2003-15:41 schrieb Matthias H.:
> Ich hab deinen tollen Quellcode ausprobiert. Sieht ganz
> gut aus, bis auf die Tatsache, daß das Fenster nicht
> gefadet wird...

komisch... ich hatte noch kein Form, wo der Code die Fading-Klasse nicht
funktioniert.

Mit einem neuem C#-WinApp-Projekt sollte es auf jeden Fall funktionieren.
Evtl. machst du noch irgend etwas anderes, was meiner Klasse entgegen
wirkt.

> Stattdessen hab ich es mit dem DoEvents()-Befehl gemacht.
> Der funktioniert. Insgesamt geht das Faden aber relativ
> langsam, obwohl als Zeitspanne nur 1 Tick
> (new TimeSpan(1)) angegeben ist. Woran kann das liegen?

TimeSpan? 1 Tick? Das klingt verwirrend. Zeig mal etwas Code. So weiss ich
überhaupt nicht was du meinst.

Herfried K. Wagner [MVP]

unread,
Dec 4, 2003, 11:49:10 AM12/4/03
to
* "Ralf Jänike" <meine_mai...@nurfuerspam.de> scripsit:

> Anderes populäres Beispiel: Winamp 5 (RC8) da wird ein Feld ein- und
> ausgeblendet wenn ein neuer Track abgespielt wird

Bis jetzt hat es noch kein Winamp auf meine Platte geschafft.

SCNR

Herfried K. Wagner [MVP]

unread,
Dec 4, 2003, 11:48:45 AM12/4/03
to
Hallo Matthias!

* "Matthias H." <anon...@discussions.microsoft.com> scripsit:


>> Da ich Outlook nicht verwende, kenne ich das Verhalten
>> dort
>> nicht. Allerdings würde es mich nerven, wenn ich erst
>> einmal 2 Sekunden
>> warten muss, bis ich das Formular verwenden kann.
>
> Da geb ich dir prinzipiell mal Recht, aber die Anwendung
> an der ich sitze, braucht nur wenig Benutzereingaben und
> da macht sich solch ein Schnick-Schnack optisch ganz gut.

Hängt natürlich vom Typ der Anwendung ab. Wenn ich aber eine Anwendung
vor mir habe, mit der ich mehrere Stunden am Tag verbringe, dann will
ich diese Effekte nicht. Zumindest will ich sie über eine Option
deaktivieren können. Abgesehen davon funktioniert der Transparenzeffekt
nicht auf allen Windows-Versionen, sodass vielleicht einige Benutzer
warten müssen, ohne überhaupt etwas zu sehen.

> Ich finde eh, daß man ein wenig Zeit für ein paar Effekte
> aufbringen sollte. Wenn die Anwendungen heute immer noch

Aus Erfahrung meine ich, dass so mancher Entwickler weniger Zeit für
Schnickschnack und stattdessen mehr Zeit für Stabilität und
Funktionalität aufbringen sollte.



> im Standard-Grau von früher wären, dann wäre das Arbeiten
> damit auch nicht interessant.

Warum nicht interessant? Bei einem funktional interessanten Programm
kommt es mir nicht auf irgendwelche Effekte in der GUI an, sondern auf
schnelle und praktische Handhabung sowie Qualität der Implementierung.

> Man kann dem User ja die
> Möglichkeit des Ein und Ausschaltens geben. Dabei würde
> mich gleich mal interessieren, wo man das bei WindowsXP
> machen kann, weil mein Startmenü macht diesen tollen
> Effekt seit Ewigkeiten nicht mehr...

Welchen Effekt? Den Einblendeeffekt? Vielleicht "Eigenschaften von
Anzeige" -> "Darstellung" -> "Effekte" -> dort bei der ersten Option
"Einblenden" aktivieren.

Juergen Frieling

unread,
Dec 4, 2003, 12:07:27 PM12/4/03
to
Hallo Herfried

> Welchen Effekt? Den Einblendeeffekt? Vielleicht "Eigenschaften von
> Anzeige" -> "Darstellung" -> "Effekte" -> dort bei der ersten Option
> "Einblenden" aktivieren.

Har, Klasse, Danke! Habs gleich mal *de*aktiviert :-)

Gruss,
Juergen

Herfried K. Wagner [MVP]

unread,
Dec 4, 2003, 12:26:48 PM12/4/03
to
* Juergen Frieling <jue...@beer.com> scripsit:

>> Welchen Effekt? Den Einblendeeffekt? Vielleicht "Eigenschaften von
>> Anzeige" -> "Darstellung" -> "Effekte" -> dort bei der ersten Option
>> "Einblenden" aktivieren.
>
> Har, Klasse, Danke! Habs gleich mal *de*aktiviert :-)

Dieses Feature habe ich _aktiviert_.

Thomas Scheidegger [MVP]

unread,
Dec 4, 2003, 8:21:01 PM12/4/03
to
Hallo Matthias

> Fenster langsam einblenden und ausblenden,
> indem die Durchsichtigkeit langsam erhöht/ verniedrigt wird.


auf GotDotNet von Microsoft:
http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=cf20b9ce-c0d1-47cc-932d-45337f1520d2


--
Thomas Scheidegger - MVP .NET - 'NETMaster'
http://www.cetus-links.org/oo_dotnet.html - http://dnetmaster.net/


Sebastian Pfützner

unread,
Dec 5, 2003, 12:12:25 AM12/5/03
to
Moin,
ich hatte vor einiger Zeit mal einen Dialog geschrieben, der sich sanft ein-
und ausblendet und während des Einbelndens auch benutzbar war. Hier mal der
Codeausschnitt:

public OptionsDialog()
{
InitializeComponent();
Opacity = 0;
}

protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
base.OnPaint(e);
Application.DoEvents();
if (Opacity == 0)
new System.Threading.Thread(
new System.Threading.ThreadStart(Start)).Start();
}

private void Start()
{
lock (this)
{
while (Opacity < .85)
{
Opacity += .0425;
System.Threading.Thread.Sleep(40);
}
}
}

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
lock (this)
{
while (Opacity > 0)
{
Opacity -= .085;
System.Threading.Thread.Sleep(40);
}
}
base.OnClosing(e);
}

--
Sebastian Pfützner
s.pfu...@onlinehome.de
ICQ-ID: 39965036


Matthias H.

unread,
Dec 5, 2003, 2:44:47 AM12/5/03
to
Bei mir ist das Feature aktiviert, aber trotzdem geht die
Einblendung so schnell, daß man es nicht erkennt.

Matthias H.

unread,
Dec 5, 2003, 2:51:47 AM12/5/03
to
TimeSpan m=new TimeSpan(1);
this.Opacity=0;
this.Show();
Application.DoEvents();
DateTime u= DateTime.Now;
while (this.Opacity<=o)
{
if (DateTime.Now.Subtract(u)>=m)
{
Application.DoEvents();
this.Opacity=this.Opacity+0.01;
u=DateTime.Now;
}
}

Das ist mein Code. Steht bei mir in der FormLoad()
Methode. o entspricht der Opacity, die eingestellt werden
soll.
Ein Tick enspricht laut Hilfe 100 Nanosekunden. Bei der
Opacity-Schrittweite von 1% müsste um auf 100% zukommen
also 100Ticks=10000Nanosekunden dauern= 10 Millisekunden.
Es dauert aber etwa 2 Sekunden, was für meinen Geschmack
zu lang ist.

Sebastian Richter

unread,
Dec 5, 2003, 3:41:57 AM12/5/03
to
Hallo,

also ich finde die Lösung, das Fenster im Timer einzublenden besser und
sauberer.

Aber egal...

> while (this.Opacity<=o)
Muss das nicht < und nicht <= sein?

Und du ignorierst mit deinem Code die Zeit, die Application.DoEvents und
Opacity += 0.01 braucht, da du u erst danach aktualisierst. Umgerechnet
fehlt dir also die Zeit, welche die beiden Zeilen 100x brauchen... das kann
evtl. die Ursache für deine 2 sek. sein. Davon unabhängig ist 0.01 viel zu
fein. Wenn das einblenden zum Beispiel eine halbe Sekunde dauern soll, und
Filme nur mit 25 Bilder/Sekunde laufen, sollte 10-15 Schritte völlig
reichen.

Beispiel:

Opacity = 0.0;
Show();
while( Opacity < 1.0 )
{
Application.DoEvents();
Opacity += 0.1;
Thread.Sleep( 10 );
}

Hatte ich schon erwähnt, dass ich das eh lieber per Timer implementieren
würde...

Matthias H.

unread,
Dec 5, 2003, 5:54:58 AM12/5/03
to
>> while (this.Opacity<=o)
>Muss das nicht < und nicht <= sein?

Stimmt!

> sollte 10-15 Schritte völlig reichen.

Stimmt, aber das sieht der Effekt scheisse aus.

>Hatte ich schon erwähnt, dass ich das eh lieber per
Timer implementieren würde...

Ja hattest du :-) Ich stimm dir da ja zu, aber ich benutz
schon einen und noch einen will ich nicht...

cu

Thomas Scheidegger [MVP]

unread,
Dec 5, 2003, 7:00:56 AM12/5/03
to
Hallo Sebastian

> Dialog geschrieben, der sich sanft ein- und ausblendet

> new System.Threading.ThreadStart(Start)).Start();
> private void Start()
> lock (this)
> while (Opacity < .85)
> Opacity += .0425;
> System.Threading.Thread.Sleep(40);


dieser Code mag (manchmal) funktionieren, verletzt jedoch
die Single-Threaded Beschränkung von Forms.

Rufe im Thread (z.B. am Beginn von Start() )
einmal this.InvokeRequired auf.
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemWindowsFormsControlClassInvokeRequiredTopic.asp

Falls return = true, darf man nicht direkt auf Form (Dialog)
und dessen Properties (wie Opacity) zugreifen....

Das: lock( this ) ist da kein Ersatz.

Sebastian Pfützner

unread,
Dec 5, 2003, 12:44:58 PM12/5/03
to
Danke für den Hinweis!
Allerdings ist mir noch nicht ganz klar, warum lock(this) nicht richtig ist,
was soll denn da noch passieren?
Funktioniert so wie es da steht eigentlich auf allen Rechnern auf denen ich
es getestet habe ohne Fehler... oder ist das so ein Fall von
unspezifiziertem Verhalten, und funktioniert so nur "rein zufällig"? Was
spricht dagegen?
und... tschüß

Thomas Scheidegger [MVP]

unread,
Dec 5, 2003, 2:28:30 PM12/5/03
to
> nicht ganz klar, warum lock(this) nicht richtig ist,
> was soll denn da noch passieren?

lock(this) löst nur das Problem,
dass nicht 2 Threads -GLEICHZEITIG- auf
die .NET Klasse zugreifen.


Gemäss etwa:
http://msdn.microsoft.com/library/en-us/cpguide/html/cpcondevelopingmultithreadedwindowsformscontrol.asp

"...Forms is based on native Win32 windows that are inherently apartment-threaded..."

waren die native Windows (Win32) nie dazu designed,
dass sie überhaupt aus -UNTERSCHIEDLICHEN- Threads
angesprochen werden können.

Die Gründe sind also sehr viel tiefer,
rund um native Windows-Handles und Message-Queues usw...

Dirk Primbs [MS]

unread,
Dec 6, 2003, 6:00:45 AM12/6/03
to
hirf-spa...@gmx.at (Herfried K. Wagner [MVP]) schrieb in
news:bqnaeh$24546e$8...@ID-208219.news.uni-berlin.de:

> Da ich Outlook nicht verwende, kenne ich das Verhalten dort
> nicht. Allerdings würde es mich nerven, wenn ich erst einmal 2
> Sekunden warten muss, bis ich das Formular verwenden kann.

Immer wenn eine Mail eintrifft, erscheint ein kleines Fenster mit Titel
und ein paar anderen Informationen und blendet langsam aus. Wenn man mit
der Maus darüber fährt, wird es sofort massiv und man kann z.B. direkt
löschen, weiterleiten oder ein Flag setzen. In dem Fall schließt sich
das Fenster. Wenn ich die Maus ohne Aktion aus dem Fenster bewege,
blendet es sich eben aus...

Fenster, die durchsichtig sind können übrigens trotzdem auf
Benutzeraktionen reagieren sonst würde das tatsächlich ziemlich nerven.

Gruß,
Dirk

0 new messages