簡體   English   中英

C#(WinForms)中的自定義控件中的“動態”鼠標光標

[英]“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中實現這種“動態”游標的正確方法是什么?

  1. 我應該OnMouseMove重寫OnMouseMove

     protected override void OnMouseMove(MouseEventArgs e) { if(eY < ...) Cursor.Current = ...; else if(eY < ...) Cursor.Current = ...; else Cursor.Current = ...; base.OnMouseMove(e); } 
  2. 或者我應該回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM