是的,WinForms控件仍然使用Windows 98/2000附带的旧式手形光标。它缺少Aero光标所包含的抗锯齿效果。这是因为.NET Framework包含自己的硬编码游标,而不是系统默认值。我认为这是因为早期版本的.NET针对Windows 95这样的操作系统,它并没有捆绑在这个游标上,而是没有通过考古来证明它。
幸运的是,很容易强制它使用正确的。您只需告诉操作系统您希望它使用默认的手形光标,然后无论用户运行程序的Windows版本如何,即使它们将鼠标光标从默认值更改为默认值主题。
这样做的最简单的方法是继承现有的控制,覆盖WndProc
function拦截WM_SETCURSOR
message,并告诉它使用的系统IDC_HAND
光标。你只需要一点P/Invoke魔法。
下面的代码是如何可能看起来使用LinkLabel
控制的例子:
public class LinkLabelEx : LinkLabel
{
private const int WM_SETCURSOR = 0x0020;
private const int IDC_HAND = 32649;
[DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true)]
private static extern IntPtr LoadCursor(IntPtr hInstance, int lpCursorName);
[DllImport("user32.dll", CharSet=CharSet.Auto)]
private static extern IntPtr SetCursor(IntPtr hCursor);
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_SETCURSOR)
{
// Set the cursor to use the system hand cursor
SetCursor(LoadCursor(IntPtr.Zero, IDC_HAND));
// Indicate that the message has been handled
m.Result = IntPtr.Zero;
return;
}
base.WndProc(ref m);
}
}
嗯。我感到震惊。吓坏了。困惑。松了一口气。那么,我应该在我的应用程序中对每个控件进行分类,以便我想要一个反锯齿的光标?这是不是有点矫枉过正? - 顺便说一句,感谢代码,它修复了它! :) – 2011-05-16 12:26:08
@βӔḺṪẶⱫŌŔ:不可以。其他所有光标都完美无缺。 Windows应用程序需要显示一个手形光标非常罕见。关于唯一一次使用的是“LinkLabel”。因此,您只需创建一次自定义替换'LinkLabel'控件,然后在应用程序的任何位置使用它。 – 2011-05-16 12:27:35
这就是我的意思。但我也有一个PictureBox(客户端的标志),点击它们将它们带到他们的网站,所以我也会显示手形光标以及 – 2011-05-16 12:32:26