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".
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 ...