Cursor.Current和this.Cursor (其中this是WinForm)在.Net中有区别吗?我一直在使用this.Cursor,而且运气很好,但最近我开始使用CodeRush,并且只在“等待光标”块中嵌入了一些代码,而CodeRush使用了Cursor.Current属性。我在互联网上和工作中看到,其他程序员在Cursor.Current属性方面遇到了一些问题。这让我想知道这两者之间是否有区别。提前谢谢。
我做了个小测试。我有两个winforms。我单击form1上的一个按钮,将Cursor.Current属性设置为Cursors.WaitCursor,然后显示form2。光标在任一窗体上都不会改变。它仍然是Cursors.Default (指针)光标。
如果我在form1和show form2上的按钮单击事件中将this.Cursor设置为Cursors.WaitCursor,等待光标只在form1上显示,默认光标在form2上,这是预期的。所以,我仍然不知道Cursor.Current是做什么的。
发布于 2008-11-19 18:23:19
Windows向包含鼠标光标的窗口发送WM_SETCURSOR消息,使其有机会更改光标形状。像TextBox这样的控件利用了这一点,将光标更改为I-bar。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);
}
}发布于 2008-11-19 17:19:33
我相信Cursor.Current是当前使用的鼠标光标(不管它在屏幕上的哪个位置),而this.Cursor是鼠标经过你的窗口时要设置的光标。
发布于 2008-11-19 17:20:35
当鼠标位于this引用的窗口上时,将使用this.Cursor光标。Cursor.Current是当前鼠标光标,如果鼠标位于不同的窗口上,则可能与this.Cursor不同。
https://stackoverflow.com/questions/302663
复制相似问题