我正在C# (Windows.Forms)中执行(自定义绘制的)自定义控件。鼠标光标形状应该取决于我的自定义控件的哪一部分当前在游标下。(让我称它为“动态游标”:我的意思是游标不仅取决于光标下面的控件,还取决于鼠标坐标。)
在使用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(MouseEventArgs e) { if(e.Y <.)Cursor.Current =.;否则如果(E.Y<.)Cursor.Current =.;Cursor.Current =.;base.OnMouseMove(e);}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.“吗?他读到正确的答案了吗?
发布于 2014-04-25 15:46:07
正确的答案是:
在这种情况下只能使用WM_SETCURSOR (但不能使用OnMouseMove) )。
在Cursor.Current = ...中使用OnMouseMove会导致持久的游标闪烁。
https://stackoverflow.com/questions/23288673
复制相似问题