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); }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)