是的,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