Czy zauważycie że "Application.UseWaitCursor = true;" nie działa tak jak by się tego oczekiwało - nie zmienia kursora na kursor oczekiwania (klepsydra, hourglass , kółko oczekiwania itp...)
Zawsze można spróbować inaczej:
Form form = Form.ActiveForm; Cursor myPreviousCursor = form.Cursor; form.Cursor = Cursors.WaitCursor; // dlugotrwala czynnosc form.Cursor = myPreviousCursor;
Lub
Cursor previousCursor = Cursor.Current; Cursor.Current = Cursors.WaitCursor; // dlugotrwala czynnosc Cursor.Current = previousCursor;
Ogólnie pod tym adresem: http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/18b8b65e-03cd-4a4f-9b7e-4e44ea5ac5df można znaleźć ciekawą wymianę zdań na ten temat. Można m.in. znaleźć następujący (ciekawy) kod:
using System;
using System.Windows.Forms;
public class HourGlass : IDisposable {
public HourGlass() {
Enabled = true;
}
public void Dispose() {
Enabled = false;
}
public static bool Enabled {
get { return Application.UseWaitCursor; }
set {
if (value == Application.UseWaitCursor) return;
Application.UseWaitCursor = value;
Form f = Form.ActiveForm;
if (f != null && f.Handle != null) // Send WM_SETCURSOR
SendMessage(f.Handle, 0x20, f.Handle, (IntPtr)1);
}
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
} Używać można ten kod bezpośrednio poprzez ustawianie HourGlass.Enabled lub w sposób podobny do poniższego:
private void button1_Click(object sender, EventArgs e) {
using (new HourGlass()) {
// Do something that takes time...
System.Threading.Thread.Sleep(2000);
}
} Oczywiście można spróbować pomieszać powyższe metody i np. z klasy HourGlass usunąć importowaną funkcję z biblioteki "user32.dll".









Maciej_Zbrzezny on delicious.com
Application.UseWaitCursor = true
OdpowiedzUsuńpotem użyj Application.DoEvents() aby wymiana komunikatów zaszła, to i klepsyderka się pokaże
Przyznaję się, akurat tego nie wiedziałem ;)
OdpowiedzUsuńJak widać możliwości jest wiele ...