czwartek, 16 lipca 2009

"Application.UseWaitCursor = true" nie działa? [PL]

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

2 komentarze:

  1. Application.UseWaitCursor = true
    potem użyj Application.DoEvents() aby wymiana komunikatów zaszła, to i klepsyderka się pokaże

    OdpowiedzUsuń
  2. Przyznaję się, akurat tego nie wiedziałem ;)
    Jak widać możliwości jest wiele ...

    OdpowiedzUsuń

Posty powiązane / Related posts