首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cursor.Current与this.Cursor

Cursor.Current与this.Cursor
EN

Stack Overflow用户
提问于 2008-11-20 01:17:49
回答 7查看 61.3K关注 0票数 57

Cursor.Currentthis.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是做什么的。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 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,然后执行一些需要一段时间的操作时,就不会发生这种情况。例如,尝试以下代码:

代码语言:javascript
复制
private void button1_Click(object sender, EventArgs e) {
  this.UseWaitCursor = true;
  System.Threading.Thread.Sleep(3000);
  this.UseWaitCursor = false;
}

光标永远不会改变。要将其转化为形状,您还需要使用Cursor.Current。下面是一个小助手类,让它变得简单:

代码语言:javascript
复制
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);
}

并像这样使用它:

代码语言:javascript
复制
private void button1_Click(object sender, EventArgs e) {
  using (new HourGlass()) {
    System.Threading.Thread.Sleep(3000);
  }
}
票数 90
EN

Stack Overflow用户

发布于 2008-11-19 17:19:33

我相信Cursor.Current是当前使用的鼠标光标(不管它在屏幕上的哪个位置),而this.Cursor是鼠标经过你的窗口时要设置的光标。

票数 11
EN

Stack Overflow用户

发布于 2008-11-19 17:20:35

当鼠标位于this引用的窗口上时,将使用this.Cursor光标。Cursor.Current是当前鼠标光标,如果鼠标位于不同的窗口上,则可能与this.Cursor不同。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/302663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档