[英]“Dynamic” mouse cursor in custom control in C# (WinForms)
我正在C#(Windows.Forms)中執行(自定義繪制)自定義控制。 鼠標光標形狀應取決於我的自定義控件當前在光標下的哪一部分。 (我稱它為“動態光標”:我的意思是,光標不僅取決於光標下方的Control,而且還取決於鼠標坐標。)
使用WinAPI時,我認為應該將WM_SETCURSOR
用作正確的方法:
//pseusocode
if(uMsg == WM_SETCURSOR) {
if((HWND)wParam == hwnd) {
POINT point;
GetCursorPos(&point);
ScreenToClient(hwnd, &point);
if(point.Y < ...) SetCursor(...);
else if(point.Y < ...) SetCursor(...);
else SetCursor(...);
return true;
}
else return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
因此,我希望在C#中,我會像這樣:
protected override void OnNeedToSetCursor(NeedToSetCursorEventArgs e) {
if(...) Cursor.Current = ...;
else if(...) Cursor.Current = ...;
else Cursor.Current = ...;
}
但是, Control
沒有此類事件或可重寫的方法。
因此,問題是:在WinForms中實現這種“動態”游標的正確方法是什么?
我應該OnMouseMove
重寫OnMouseMove
:
protected override void OnMouseMove(MouseEventArgs e) { if(eY < ...) Cursor.Current = ...; else if(eY < ...) Cursor.Current = ...; else Cursor.Current = ...; base.OnMouseMove(e); }
或者我應該回WndProc
覆蓋WndProc
:
protected override void WndProc(ref Message m) { if(m.Msg == 0x0020/*WM_SETCURSOR*/) { if(...) Cursor.Current = ...; else if(...) Cursor.Current = ...; else Cursor.Current = ...; m.Result = new IntPtr(-1); } else base.WndProc(ref m); }
PS:
請不要回答諸如“選擇自己”或“我更喜歡這種方式”之類的內容。 因為這不是個人喜好問題,所以這是正確性問題 。
如果兩種方法都正確,請說“兩種方法都正確”。 如果只有一種方法正確,請說明為什么另一種方法不正確。 如果這兩種方法都“有效”,但是其中一種方法有一些優點/缺點(例如:“ mouse-move way具有更大的性能開銷”,或者“ WM_MOUSEMOVE消息不是專用於此的,那么將使用mouse-move way set”)光標形狀為時已晚;即,當鼠標移動(125,19)->(125,20)->(125,21)時,我在(125,20)中將光標形狀設置為NS_SIZE,它將僅在(125,21)中更改)“),請告知。
PPS:我對該網站感到失望。 哪個白痴可以認為這個問題是基於觀點的? 他讀過“ PS”嗎? 他讀了正確的答案嗎?
正確的答案是:
在這種情況下,只能使用WM_SETCURSOR
(但不能使用OnMouseMove)
。
在OnMouseMove
使用Cursor.Current = ...
將導致持續的光標閃爍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.