SORU
19 Kasım 2008, ÇARŞAMBA


İmleç.Bu vs mevcut.İmleç

Cursor.Current this.Cursor arasında fark this WinForm olduğu) var .Net? Ben hep kullanılan this.Cursor ve çok iyi şanslar ama ben son zamanlarda başladım kullanarak CodeRush ve sadece gömülü bir koddaki "Bekleme İmleç" blok ve CodeRush kullanılan Cursor.Current özelliği. Diğer programcılar Cursor.Current özelliği ile bazı sorunlar var İnternet ve gördüm. Sadece eğer iki farkı var mı diye soracaktım" Şimdiden teşekkürler.

Küçük bir test yaptım. İki win var. Ben form1, Cursors.WaitCursor Cursor.Current özelliğini ayarlayın ve sonra form2 Göster düğmesini tıklayın. İmleç form üzerine değiştirmez. Cursors.Default (işaretçi) imleç kalır.

Form1 düğmesini tıklatarak olayı Cursors.WaitCursor 12 *ve form2, bekle imleci göster form1 yalnızca gösterir ve varsayılan imleç beklenen form2. Yani, ben hala Cursor.Current ne yaptığını bilmiyoruz.

CEVAP
19 Kasım 2008, ÇARŞAMBA


Windows WM_SETCURSOR ileti imleç fare içeren pencere, imlecin şeklini değiştirmek için bir fırsat vererek gönderir. TextBox gibi bir kontrol avantajı, bir bar içine imleci değiştirme alır. Denetim.İmleç özelliği şekil kullanılacağını belirler.

İmleç.Geçerli özellik değişiklikleri şeklinde doğrudan, WM_SETCURSOR bir karşılık beklemeden. Çoğu durumda, bu şekli uzun süre hayatta kalmak için olası değildir. Kullanıcı hareketleri en kısa sürede fare, WM_SETCURSOR Kontrol etmek için geri değiştirir.İmleç.

UseWaitCursor özelliği eklendi .Daha kolay bir kum saati görüntülemek için yapmak için NET 2.0. Ne yazık ki, pek de işe yaramıyor. WM_SETCURSOR ileti bir süre alır true özelliğini ayarlayın ve bir şeyler yap o zaman, böyle bir şey olmayacak şekil ve değiştirmek gerekir. Örneğin: bu kodu deneyin

private void button1_Click(object sender, EventArgs e) {
  this.UseWaitCursor = true;
  System.Threading.Thread.Sleep(3000);
  this.UseWaitCursor = false;
}

İmleci asla değişmez. Şeklinde vurmak için, İmleç kullanmanız gerekir.De geçerli. İşte bunu kolaylaştırmak için küçük bir Yardımcı Sınıf:

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 != IntPtr.Zero)   // 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);
}

Ve aşağıdaki gibi kullanabilirsiniz:

private void button1_Click(object sender, EventArgs e) {
  using (new HourGlass()) {
    System.Threading.Thread.Sleep(3000);
  }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kassem G

    Kassem G

    25 EKİM 2006
  • picster

    picster

    20 NİSAN 2006