首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# (WinForms)中自定义控件中的“动态”鼠标光标

C# (WinForms)中自定义控件中的“动态”鼠标光标
EN

Stack Overflow用户
提问于 2014-04-25 09:03:10
回答 1查看 886关注 0票数 0

我正在C# (Windows.Forms)中执行(自定义绘制的)自定义控件。鼠标光标形状应该取决于我的自定义控件的哪一部分当前在游标下。(让我称它为“动态游标”:我的意思是游标不仅取决于光标下面的控件,还取决于鼠标坐标。)

在使用WinAPI时,我认为应该使用WM_SETCURSOR作为一种适当的方式:

代码语言:javascript
复制
//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#,我希望我能做这样的事情:

代码语言:javascript
复制
protected override void OnNeedToSetCursor(NeedToSetCursorEventArgs e) {
    if(...) Cursor.Current = ...;
    else if(...) Cursor.Current = ...;
    else Cursor.Current = ...;
}

但是,在Control中不存在这样的事件或可重写的方法。

因此,问题是:在WinForms中实现这种“动态”游标的正确方法是什么?

  1. 我是否应该重写OnMouseMove: 保护覆盖无效OnMouseMove(MouseEventArgs e) { if(e.Y <.)Cursor.Current =.;否则如果(E.Y<.)Cursor.Current =.;Cursor.Current =.;base.OnMouseMove(e);}
  2. 或者我应该回过头来重写WndProc: 保护覆盖无效WndProc(参考消息m) { if(m.Msg == 0x0020/*WM_SETCURSOR*/) {if(.)Cursor.Current =.;否则如果(.)Cursor.Current =.;else Cursor.Current =.;m.Result =新IntPtr(-1);}IntPtr base.WndProc(ref m);}

P.S.:

请不要回答这样的问题:“选择自己”或“我更喜欢这样”。,因为这不是个人偏好的问题,而是正确性的问题。

如果两种方法都是正确的,请说“两种方法都是正确的”。如果只有一种方法是正确的,请解释为什么其他方法是不正确的。如果这两种方法“都能工作”,但其中一种方法有一些优点/缺点(例如:“鼠标移动方式具有更大的性能开销”,或者"WM_MOUSEMOVE消息不是为此专用的,因此使用鼠标移动方式将设置光标形状太晚;即当鼠标移动(125,19)-> (125,20) ->(125,21),而我在(125,20)中将光标形状设置为NS_SIZE时,它只会在(125,21)中更改“),请告诉我。

P.P.S.:我对这个网站很失望。哪个白痴会认为这个问题是基于意见的?他读过"P.S.“吗?他读到正确的答案了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-25 15:46:07

正确的答案是:

在这种情况下只能使用WM_SETCURSOR (但不能使用OnMouseMove) )。

Cursor.Current = ...中使用OnMouseMove会导致持久的游标闪烁。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23288673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档