gpt4 book ai didi

c# - 改进 LinkLabel - 使用系统手形光标和更改链接颜色

转载 作者:行者123 更新时间:2023-11-30 22:56:46 25 4
gpt4 key购买 nike

LinkLabel 控件有一些烦人的问题:

  • 默认情况下,它不使用任何系统颜色(即 Color.Blue 而不是 LinkColor 属性的 SystemColors.HotTrack)
  • 它使用旧的、丑陋的、有别名的手形光标

我找到了以下答案 here声称可以解决光标问题:

using System.Runtime.InteropServices;

namespace System.Windows.Forms {
public class LinkLabelEx : LinkLabel {
private const int IDC_HAND = 32649;

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr LoadCursor(IntPtr hInstance, int lpCursorName);

private static readonly Cursor SystemHandCursor = new Cursor(LoadCursor(IntPtr.Zero, IDC_HAND));

protected override void OnMouseMove(MouseEventArgs e) {
base.OnMouseMove(e);

// If the base class decided to show the ugly hand cursor
if(OverrideCursor == Cursors.Hand) {
// Show the system hand cursor instead
OverrideCursor = SystemHandCursor;
}
}
}
}

但是,这个解决方案并不完美。例如,旧的、丑陋的光标在悬停在其上时会在显示正确的光标之前闪烁一帧。

我还阅读了 ComCtl32.dll 中的原生 SysLink 控件,它没有问题,但我找不到一个好的解决方案来使用它在 C#/WinForms 中。但是,无论如何我更喜欢纯 .NET 解决方案。

如何通过解决上述问题使LinkLabel控件更好?

最佳答案

关于颜色,控件具有允许您更改链接颜色的属性:LinkColorActiveLinkColorVisitedLinkColor禁用链接颜色

这些属性的默认值来自 Internet Explorer 设置,这些设置存储在 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Settings 注册表项中。

要使用不同的颜色,您可以根据自己的喜好设置这些属性。例如,您可以将 LinkColor 设置为 SystemColors.HotTrack 或按照 w3org 的建议进行操作对于颜色,使用 #0000EE 作为默认链接颜色,#551A8B 用于访问链接,#FF0000 用于事件链接。

关于闪烁,这是因为您共享的代码是在基类更改光标后在鼠标移动时设置光标。因此,有可能在设置新游标之前使基类游标闪烁。要解决这个问题,需要处理WM_SETCURSOR,必要时将光标设置为系统手形光标。

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class MyLinkLabel : LinkLabel
{
public MyLinkLabel()
{
this.LinkColor = Color.FromArgb(0x00, 0x66, 0xCC);
this.VisitedLinkColor = Color.FromArgb(0x80, 0x00, 0x80);
this.ActiveLinkColor = Color.FromArgb(0xFF, 0x00, 0x00);
}
const int IDC_HAND = 32649;
const int WM_SETCURSOR = 0x0020;
const int HTCLIENT = 1;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr LoadCursor(IntPtr hInstance, int lpCursorName);
[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern IntPtr SetCursor(HandleRef hcursor);

static readonly Cursor SystemHandCursor =
new Cursor(LoadCursor(IntPtr.Zero, IDC_HAND));
protected override void WndProc(ref Message msg)
{
if (msg.Msg == WM_SETCURSOR)
WmSetCursor(ref msg);
else
base.WndProc(ref msg);
}
void WmSetCursor(ref Message m)
{
if (m.WParam == (IsHandleCreated ? Handle : IntPtr.Zero) &&
(unchecked((int)(long)m.LParam) & 0xffff) == HTCLIENT)
{
if (OverrideCursor != null)
{
if (OverrideCursor == Cursors.Hand)
SetCursor(new HandleRef(SystemHandCursor, SystemHandCursor.Handle));
else
SetCursor(new HandleRef(OverrideCursor, OverrideCursor.Handle));
}
else
{
SetCursor(new HandleRef(Cursor, Cursor.Handle));
}
}
else
{
DefWndProc(ref m);
}
}
}

关于c# - 改进 LinkLabel - 使用系统手形光标和更改链接颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54160682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com