«Динамический» курсор мыши в пользовательском элементе управления в C# (WinForms)C#

Место общения программистов C#
Ответить
Anonymous
 «Динамический» курсор мыши в пользовательском элементе управления в C# (WinForms)

Сообщение Anonymous »

Я делаю (нарисованный по индивидуальному заказу) пользовательский элемент управления на 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:

    Код: Выделить всё

     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);
    }
    
P.S.:
Пожалуйста, не отвечайте что-то вроде: «Выбирай сам» или «Мне больше нравится так».
Поскольку это не вопрос индивидуальных предпочтений, это вопрос правильности.
Если оба способа верны, скажите: «Оба способа верны». Если верен только один способ, объясните, почему другой способ неверен. Если оба метода «будут работать», но один из них имеет некоторые преимущества/недостатки (например: «способ перемещения мыши имеет большую нагрузку на производительность» или «Сообщение WM_MOUSEMOVE не предназначено для этого, таким образом, использование способа перемещения мыши установит форму курсора слишком поздно; т. в (125,20) оно изменится только в (125,21)"), скажите пожалуйста.

Подробнее здесь: https://stackoverflow.com/questions/232 ... p-winforms
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»