ListView и группы под Windows 7
От: Stanislav V. Zudin Россия  
Дата: 30.01.11 09:02
Оценка:
Привет.
В семерке выделение группы в ListView control'е вызывает выделение всех элементов группы. Возможно ли запретить такое поведение? В XP выделение групп ни на что не влияет, что вполне устраивает.
_____________________
С уважением,
Stanislav V. Zudin
Re: ListView и группы под Windows 7
От: x64 Россия http://x64blog.name
Дата: 31.01.11 02:16
Оценка:
SVZ>В семерке выделение группы в ListView control'е вызывает выделение всех элементов группы. Возможно ли запретить такое поведение?

Я сам не пробовал, но думаю, для начала стоит убрать стиль LVGS_COLLAPSIBLE у групп. Это можно сделать вызовом ListView_SetGroupState(). Далее можно попробовать ловить LVN_ITEMCHANGING и смотреть, пытается ли кто-то в данный момент выделить элементы нажатием на группу. Но это как-то криво, по-моему, вряд ли будет работать стабильно. Более интересный вариант такой: ловить клик мыши по заголовку группы в обработчике OnMouseDown(), звать ListView_HitTest() и проверять попадание в группу, если да, то возвращать из обработчика 0, указывая таким образом, что нажатие мы обработали и ничего более делать (тем более, вызывать оригинальный обработчик самого ListView) не требуется. Такие дела.
JID: x64j@jabber.ru
Re[2]: ListView и группы под Windows 7
От: Stanislav V. Zudin Россия  
Дата: 31.01.11 10:53
Оценка:
Здравствуйте, x64, Вы писали:

SVZ>>В семерке выделение группы в ListView control'е вызывает выделение всех элементов группы. Возможно ли запретить такое поведение?


x64>Я сам не пробовал, но думаю, для начала стоит убрать стиль LVGS_COLLAPSIBLE у групп. Это можно сделать вызовом ListView_SetGroupState(). Далее можно попробовать ловить LVN_ITEMCHANGING и смотреть, пытается ли кто-то в данный момент выделить элементы нажатием на группу. Но это как-то криво, по-моему, вряд ли будет работать стабильно. Более интересный вариант такой: ловить клик мыши по заголовку группы в обработчике OnMouseDown(), звать ListView_HitTest() и проверять попадание в группу, если да, то возвращать из обработчика 0, указывая таким образом, что нажатие мы обработали и ничего более делать (тем более, вызывать оригинальный обработчик самого ListView) не требуется. Такие дела.


Увы, не все так гладко.
HitTest поможет в случае мыша, но не сработает, если выделение происходит с помощью клавиатуры.
В LVN_ITEMCHANGED невозможно определить, что выделена именно группа — флаг выделенности у группы выставляется, даже если руками выделить все элементы группы.
Пробовал вариант с проверкой — есть ли у одного из выделенных элементов флаг LVIS_FOCUSED. Оно работает и для мыша, и для клавы, но мля, если выделять с нажатым <CTRL>, то этот флаг не ставится.

В общем, придется списывать в фичи.
Как один из вариантов решения — вводить задержку на обработку смены выделения. При смене выделения перезапускать таймер, а по таймеру реагировать на выделение. Тогда можно будет быстро проскакивать выделение группы.
Пока другого варианта не вижу. Разве что вручную эмулировать группы.
_____________________
С уважением,
Stanislav V. Zudin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.