一尘不染

游标电流与此游标

c#

.Net
Cursor.Currentthis.Cursor(在thisWinForm在哪里)之间有区别吗?我一直使用它this.Cursor,并很幸运,但是我最近开始使用CodeRush,只是将一些代码嵌入“
Wait
Cursor”块中,而CodeRush使用了该Cursor.Current属性。我已经在Internet和工作中看到其他程序员对该Cursor.Current属性存在一些问题。我只是想知道两者之间是否有区别。提前致谢。

我做了一点测试。我有两个winform。我单击form1上的按钮,将Cursor.Current属性设置为Cursors.WaitCursor,然后显示form2。光标在任何一种形式上都不会改变。它仍然是Cursors.Default(指针)光标。

如果我在form1上的按钮click事件中设置this.CursorCursors.WaitCursor,并显示form2,则等待光标仅显示在form1上,而默认光标在form2上,这是预期的。因此,我仍然不知道该怎么Cursor.Current做。


阅读 228

收藏
2020-05-19

共1个答案

一尘不染

Windows向包含鼠标光标的窗口发送WM_SETCURSOR消息,使其有机会更改光标形状。诸如TextBox之类的控件利用了这一点,将光标更改为I型栏。Control.Cursor属性确定将使用哪种形状。

Cursor.Current属性直接更改形状,而无需等待WM_SETCURSOR响应。在大多数情况下,这种形状不太可能长期生存。用户一旦移动鼠标,WM_SETCURSOR就会将其更改回Control.Cursor。

在.NET
2.0中添加了UseWaitCursor属性,以使其更易于显示沙漏。不幸的是,它不能很好地工作。它需要WM_SETCURSOR消息来更改形状,并且将属性设置为true并花一些时间才能完成。请尝试以下代码,例如:

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

光标永远不会改变。要将其变形,您还需要使用Cursor.Current。这是一个简单的帮助程序类:

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);
}

并像这样使用它:

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