Изменение и мерцание курсора ListView - PullRequest
4 голосов
/ 27 февраля 2009

Я пытаюсь изменить курсор, который появляется в стандартном ListView, когда курсор появляется над элементом. Однако я получаю эффект мерцания, когда мышь превращается в курсор пальца, а затем возвращается к тому, о чем я просил.

Я пытаюсь изолировать это мерцание / переход на курсор в виде руки, но не могу понять, где это происходит и как его остановить. Чтобы повторить это ...

1) Создайте форму с ListView на нем. 2) Добавить список изображений и некоторые изображения. Установите вид в режим большого значка. 3) Добавьте некоторые элементы в ListView.

Добавить событие MouseMove к ListView:

private void listView1_MouseMove(object sender, MouseEventArgs e)
{
    ListViewItem selected = this.listView1.GetItemAt(e.X, e.Y);
    if (selected == null)
    {
        base.Cursor = Cursors.Default;
    }
    else
    {
        base.Cursor = Cursors.No;
    }
}

Запустите приложение, наведя указатель мыши на элемент. Вы должны увидеть, как курсор мерцает между «Нет» (курсор без ввода) и указателем пальца, когда вы находитесь над элементом. Вопрос в том, как обеспечить, чтобы он просто отображал курсор «Нет» и не мерцал. (C # .NET).

Я попытался переопределить OnMouseMove и OnMouseHover для возврата, чтобы убедиться, что они ничего не устанавливают. Я также попытался переопределить свойство Cursor и сказать «только по умолчанию или нет курсоров», и это тоже не сработало.

Любая помощь приветствуется.

Ian

Ответы [ 2 ]

8 голосов
/ 28 марта 2009

Проблема в том, что C # ListView Control - это, по сути, оболочка для окон List View Control. Поэтому, когда мы устанавливаем курсор на Arrow, базовый элемент управления listview по умолчанию всегда устанавливается на Hand курсор, в то время как наш параметр в классе C # ListView хотел, чтобы он был Arrow. Вот почему мы получили это мерцание, потому что основной контроль возвращался обратно к Руке.

Вот код, который вам нужно добавить:

public const uint LVM_SETHOTCURSOR = 4158;

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

SendMessage(listView1.Handle, LVM_SETHOTCURSOR, IntPtr.Zero, Cursors.Arrow.Handle);

Очень важно, чтобы вы вызывали SendMessage из события onLoad вашей формы, потому что к тому времени базовый элемент управления ListView полностью инициализирован!

На самом деле все довольно просто, хорошего дня! :)

0 голосов
/ 28 февраля 2009

Не пробуя, курсоры обычно меняются в ответ на WM_ SETCURSOR, поэтому, возможно, вы конфликтуете с обработкой по умолчанию WM_ SETCURSOR ListView. Я попытался бы создать новый UserControl, производный от ListView, а затем перехватить WM_ SETCURSOR в WndProc и посмотреть, поможет ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...