Форма курсора мыши должна зависеть от того, какая часть моего пользовательского элемента управления в данный момент находится под курсором. (Позвольте мне назвать это «динамическим курсором»: я имею в виду, что курсор зависит не только от того, какой элемент управления находится под курсором, но и от координат мыши.)
При использовании 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);
}
Код: Выделить всё
protected override void OnNeedToSetCursor(NeedToSetCursorEventArgs e) {
if(...) Cursor.Current = ...;
else if(...) Cursor.Current = ...;
else Cursor.Current = ...;
}
Таким образом, возникает вопрос:
Как правильно реализовать такой «динамический» курсор в WinForms?
- Должен ли я просто переопределить OnMouseMove:
Код: Выделить всё
protected override void OnMouseMove(MouseEventArgs e) { if(e.Y < ...) Cursor.Current = ...; else if(e.Y < ...) Cursor.Current = ...; else Cursor.Current = ...; base.OnMouseMove(e); } - Или мне следует вернуться к переопределению 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); }
Пожалуйста, не отвечайте что-то вроде: «Выбирай сам» или «Мне больше нравится так».
Поскольку это не вопрос индивидуальных предпочтений, это вопрос правильности.
Если оба способа верны, скажите: «Оба способа верны». Если верен только один способ, объясните, почему другой способ неверен. Если оба метода «будут работать», но один из них имеет некоторые преимущества/недостатки (например: «способ перемещения мыши имеет большую нагрузку на производительность» или «Сообщение WM_MOUSEMOVE не предназначено для этого, таким образом, использование способа перемещения мыши установит форму курсора слишком поздно; т. в (125,20) оно изменится только в (125,21)"), скажите пожалуйста.
Подробнее здесь: https://stackoverflow.com/questions/232 ... p-winforms
Мобильная версия