Для изменения выбора необходимо обработать уведомление LVN_ITEMCHANGED:
NMLISTVIEW & nm = *(NMLISTVIEW *) pnmh;
if ( (nm.uNewState ^ nm.uOldState) & LVIS_SELECTED)
{
// nm.iItem was selected or deselected
if (!m_internalUIChange)
{
// see below
}
}
Первое «если» проверяет, изменилось ли «выбранное» состояние. Обратите внимание, что при выборе другого элемента в списке он по-прежнему срабатывает дважды: один раз для отмены выбора старого элемента и один раз для выбора нового элемента. Это необходимо, однако, для получения "полного отмены выбора".
Это уведомление срабатывает очень часто - даже при программном изменении элемента управления. Если ваш обработчик должен реагировать только на пользовательские события, вам потребуется по крайней мере флаг, который вы устанавливаете для этих операций (для этого я использую класс вместе с RAII-Lock, поэтому я не забываю его сбросить)