好的,您知道在 Windows Vista 和 Windows 7 MS 中如何更改手形光标(当您将鼠标悬停在超链接上时显示的那个),并向其添加更多细节以使其具有抗锯齿效果并且边缘美观平滑?
那么,为什么在 Windows 窗体应用程序中不是这样呢?
我厌倦了看着一个看起来像穴居人画的蹩脚手形光标。
有没有办法以编程方式告诉它显示系统中实际安装的那个?我查看了 Windows 目录中的 Cursors 文件夹,旧的手形光标甚至不存在!那么为什么 WinForms 还在使用旧的呢?我如何“升级”它?
最佳答案
是的,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);
}
}
关于c# - Windows 窗体应用程序中的非抗锯齿手形光标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6016995/