Sanduhr zeigen

In einer WinForms-Anwendung den Mauspfeil in eine Sanduhr zu verwandeln, ist eigentlich einfach:

Dim curCurrent As Cursor = Cursor.Current
Cursor.Current = Cursors.WaitCursor
...
Cursor.Current = curCurrent

Aber Achtung! Der veränderte Mauszeiger bleibt nur solange sichtbar, bis in der Windows Message Queue wieder eine Nachricht steht und Gelegenheit war, sie zu verarbeiten. Gelegenheit zur Verarbeitung bekommt Windows explizit durch den Aufruf von Application.DoEvents() oder implizit z.B. durch Aufruf einer MsgBox. Das ist ja auch verständlich.

Weniger offensichtlich ist, das ja die Windows Message Queue weiter verarbeitet wird, wenn der Mauszeiger in einem Hintergrund-Thread verändert wird, z.B.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    threading.ThreadPool.QueueUserWorkItem(new Threading.WaitCallback(AddressOf DoSomething),nothing
)
End
Sub

private sub DoSomething(state as Object)
   
cursor.Current = cursors.WaitCursor
    threading.Thread.Sleep(2000)
    cursor.Current = cursors.Default
End Sub

Das kann z.B. der Fall sein, wenn im GUI auf eine Useraktion nicht sofort reagiert werden soll. Wenn die Anzeige von Details zu Einträgen in einer Liste z.B. lange dauert, dann sollen Details nicht unbedingt sofort geladen werden, wenn ein neuer Eintrag in der Liste angeklickt wurde, sondern erst nach einer Verzögerung. Damit wird das Blättern durch eine solche Liste flüssiger. Zum Einsatz käme da z.B. ein Timer, der die Anzeigeroutine verzögert aufruft.

No Comments