Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.25;
Скачать: CL | DM;

Вниз

События мыши в ListView   Найти похожие ветки 

 
Ritter   (2005-10-14 23:28) [0]

Приветствую участников форума.

При использовании ListView столкнулся с такой проблемой: при нажатии на левую или правую кнопку мыши процедура, назначенная на событие OnMouseDown вызывается нормально, но OnMouseUp происходит, только если было движение мыши за время, пока была нажата кнопка и курсор переместился на 4 или более пикселей.
Кто-нибудь знает, как это вылечить?

Пробовал перемещать курсор функцией SetCursorPos – не помогает, если курсор возвращать в первоначальную точку. Интересно, что в случае со средней кнопкой проблема не проявляется.

И еще один вопрос: можно ли в LV увеличить частоту возникновения события OnMouseMove (или привязать ее к определенной дистанции перемещения)? Необходимо применять определенные действия к элементам LV, находящимся под курсором, а при имеющейся частоте, если двигать мышь быстро, некоторые элементы пропускаются.


 
Vladimir Kladov   (2005-10-15 16:25) [1]

что-то такое недавно было. Но частота тут не при чем. Что-то мне кажется сам listview так нехорошо себя ведет. А насчет пропуска событий - это вообще неверно, так делать не надо. система имеет право посылать столько WM_MOUSEMOVE, сколько успевает - это ее прерогатива. Правильно будет - выделить элементы, что-то еще нажать, чтобы с ними что-то сделалось.


 
Ritter   (2005-10-15 18:45) [2]

Что-то мне кажется сам listview так нехорошо себя ведет.

Похоже, так и есть. Вот что нашел в документации по ListView:

Default List View Message Processing

WM_LBUTTONDOWN
Processed in different ways depending on whether a click or drag operation is being initiated. To determine which operation is involved, the list view control enters a modal message loop until either the button is released or the mouse is moved

WM_RBUTTONDOWN
Processed the same way as the WM_LBUTTONDOWN message, except that the control sends an NM_RCLICK notification message (instead of NM_CLICK) and an LVN_BEGINRDRAG notification message (instead of LVN_BEGINDRAG). Note that the control processes the corresponding WM_RBUTTONUP message, and does not dispatch it. Applications thus cannot see this message, even by subclassing the control


Про WM_MBUTTONDOWN ничего не сказано – соответственно выполняется стандартная обработка. Про «мертвую зону» в 4 пиксела тоже ничего не сказано.

Может есть другой способ отловить момент, когда кнопка мыши была отпущена?

…система имеет право посылать столько WM_MOUSEMOVE, сколько успевает - это ее прерогатива. Правильно будет - выделить элементы, что-то еще нажать, чтобы с ними что-то сделалось…

В том то и дело, что мне нужно выделить элементы в OwnerDraw LV дополнительно к основному выделению курсором (Пример: выделение файлов правой кнопкой в большинстве файл-менеджеров). Сделал так: запоминаем последний выделенный элемент, при вызове OnMouseMove, если кнопка не отпущена – выделяем все элементы, начиная со следующего после того, который записан и заканчивая текущим. Естественно, пока это работает нормально только со средней кнопкой.



Страницы: 1 вся ветка

Текущий архив: 2006.06.25;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.042 c
3-1146574237
ZABor
2006-05-02 16:50
2006.06.25
Грид.столбец = таблица.столбец и таблица.столбец1


2-1149587403
Fiallo4ka
2006-06-06 13:50
2006.06.25
Базы данных Delphi


2-1149410113
Skype
2006-06-04 12:35
2006.06.25
определение кода нажатой клавиши


15-1149121986
dancer
2006-06-01 04:33
2006.06.25
PHP: выборка из массива


2-1149755108
Perf2k2
2006-06-08 12:25
2006.06.25
Вопрос по алгоритму