.Net Cursor.Current和this.Cursor(在thisWinForm在哪里)之间有区别吗?我一直使用它this.Cursor,并很幸运,但是我最近开始使用CodeRush,只是将一些代码嵌入“ Wait Cursor”块中,而CodeRush使用了该Cursor.Current属性。我已经在Internet和工作中看到其他程序员对该Cursor.Current属性存在一些问题。我只是想知道两者之间是否有区别。提前致谢。
Cursor.Current
this.Cursor
this
我做了一点测试。我有两个winform。我单击form1上的按钮,将Cursor.Current属性设置为Cursors.WaitCursor,然后显示form2。光标在任何一种形式上都不会改变。它仍然是Cursors.Default(指针)光标。
Cursors.WaitCursor
Cursors.Default
如果我在form1上的按钮click事件中设置this.Cursor为Cursors.WaitCursor,并显示form2,则等待光标仅显示在form1上,而默认光标在form2上,这是预期的。因此,我仍然不知道该怎么Cursor.Current做。
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); } }