Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > CListCtrl отлов установки/снятия выделения строки


Автор: triclosan 12.10.2008, 12:21
На форме имеется кнопка для удаления выделенной строки. Пытаюсь добиться следующего - обычное состояние кнопки disabled, после выделения строки - enabled, а после удаления строки или снятия выделения (фокус переносится на другой контрол окна или остается в CListCtrl, но выделение строки снимается) - снова в исходное disabled состояние. 

С "заинейблиньем" кнопки проблем нет - ловлю сообщение ON_CLICK на контроле, проверяю есть ли выделенные строки, если да - активирую кнопку.

А вот с "дисейблиньем" проблема, не пойму как дезактивировать кнопку, при переходе в другой контрол. Хотел ловить сообщение WM_KILLFOCUS, но это не подходит поскольку удаляющая кнопка также становится неактивной при потере фокуса контролом CListCtrl. То есть идея такая - надо дисейблить кнопку удаления строки при потере фокуса контролом всегда, кроме случая, когда надо нажать на эту кнопку smile. Как такое можно реализовать.  

Автор: voov 14.10.2008, 12:03
В обработчике ON_CLICK если есть выделение строки, то активируешь кнопку, иначе - деактивируешь.

Автор: triclosan 14.10.2008, 14:13
у меня так и сделано сейчас. Но если кликнуть на другой контрол (не грид и не кнопка), то в этом случае выделении строки пропадает но кнопка будет оставаться активной. Имеется ввиду ON_CLICK CListCtrl'а?

Автор: voov 14.10.2008, 16:07
да, я имел ввиду именно ON_CLICK CListCtrl'а.

Цитата(triclosan @  14.10.2008,  14:13 Найти цитируемый пост)
Но если кликнуть на другой контрол (не грид и не кнопка), то в этом случае выделении строки пропадает но кнопка будет оставаться активной

Выделеный елемент листконтрола можно изменить лишь кликнув по нему или програмно. Если програмно снимаешь выделение, то также нужно дизеблить кнопку. Как я понял выделением ты управляешь только кликая по контролу. Если выделение не показывается, проверь свойство листконтрола Always show selection.

И еще нужно деактивировать кнопку по нажатию на нее (в обработчике, после удаления строки).

Автор: triclosan 17.10.2008, 00:19
если я клацаю мышкой на ином контроле, то ранее выделенная строчка CListCtrl теряет флаг selected? 

Автор: voov 17.10.2008, 10:03
Цитата(triclosan @  17.10.2008,  00:19 Найти цитируемый пост)
если я клацаю мышкой на ином контроле, то ранее выделенная строчка CListCtrl теряет флаг selected? 

нет

Цитата(voov @  14.10.2008,  16:07 Найти цитируемый пост)
Если выделение не показывается, проверь свойство листконтрола Always show selection.


Автор: triclosan 17.10.2008, 15:45
угу, я потому и спрашиваю, т.к. установил свойство LVS_SHOWSELALWAYS, но выделение пропадает.

Кстати  у меня еще установлен стиль Ovner Data это может как-то влиять?

Автор: voov 17.10.2008, 16:31
Цитата(triclosan @  17.10.2008,  15:45 Найти цитируемый пост)
Кстати  у меня еще установлен стиль Ovner Data это может как-то влиять?

это не должно.

Цитата(triclosan @  17.10.2008,  15:45 Найти цитируемый пост)
установил свойство LVS_SHOWSELALWAYS, но выделение пропадает

проверь заходит ли при этом в твой обработчик ON_CLICK.

Автор: triclosan 17.10.2008, 17:29
Цитата(voov @  17.10.2008,  16:31 Найти цитируемый пост)
проверь заходит ли при этом в твой обработчик ON_CLICK. 

имеется ввиду выделение строки при клацанье в другом месте. 

Автор: Earnest 20.10.2008, 15:15
Добавь еще обрабочик на NM_KILLFOCUS

Автор: triclosan 21.10.2008, 11:32
Цитата(Earnest @  20.10.2008,  15:15 Найти цитируемый пост)
Добавь еще обрабочик на NM_KILLFOCUS 

WM_KILLFOCUS выходит только для работы с клавиатурой?


Автор: voov 21.10.2008, 13:18
нет, не только. это потеря фокуса ввода. может быть вызвана и действиями мыши.

Автор: Earnest 21.10.2008, 16:37
NM_KILLFOCUS != WM_KILLFOCUS
Первое - это уведомление, посылаемое родителю контрола через WM_NOTIFY, а второе - сообщение, посылаемое теряющему фокус контролу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)