Bill Heitler Ответов: 2

Как я могу обнаружить кнопку в шапке в разделе clistctrl


У меня есть диалог (CMeasureLC) с CMFCListCtrl в нем. Я хочу, чтобы пользователь мог редактировать текст в строке заголовка (только в крайнем левом столбце) в ответ на щелчок по ячейке заголовка. Я знаю, как редактировать текст, как только я обнаруживаю щелчок в ячейке, но первая задача - обнаружить щелчок- и я застрял.

Что я уже пробовал:

Я попытался обнаружить его, сопоставив в диалоговом окне. Я использовал ClassWizard для отображения LVN_COLUMNCLICK в диалоговом окне таким образом:
В .ч
afx_msg void OnColumnclickDataList(NMHDR* pNMHDR, LRESULT* pResult);

а в файле .cpp (IDC_DATA_LIST - это идентификатор CListCtrl)
	ON_NOTIFY(LVN_COLUMNCLICK, IDC_DATA_LIST, &CMeasureLC::OnColumnclickDataList)
...
void CMeasureLC::OnColumnclickDataList(NMHDR* pNMHDR, LRESULT* pResult)
{
	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
	// TODO: Add your control notification handler code here
	*pResult = 0;
}

Однако это вообще не вызывается, когда я щелкаю в строке заголовка.
На самом деле, единственное отображение, которое я могу получить для работы в диалоге, - это
ON_NOTIFY(NM_CLICK, IDC_DATA_LIST, &CMeasureLC::OnClickDataList)

который реагирует, когда я нажимаю на ячейку в теле элемента управления списком.
Я также попытался подклассировать элемент управления списком и обработать там отраженное сообщение:
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, &CEditListCtrl::OnLvnColumnclick)

но и это не называется.
Любая помощь была бы очень признательна - я очень запутался в том, куда отправляются уведомления и как их обнаружить.

2 Ответов

Рейтинг:
6

Bill Heitler

Спасибо, Ричард. Таково было и мое понимание документации, но она не работала в моем коде, и я не мог понять, почему. Но после кучи экспериментов я думаю, что разобрался с этим.
Было две проблемы.

Первый:
Чтобы обнаружить щелчки мыши в заголовке, элемент управления списком, по-видимому, должен иметь стиль LVS_NOSORTHEADER, установленный FALSE. Мне не нужна сортировка, поэтому я установил ее в TRUE в разделе свойств диалогового редактора, что казалось разумным, но это, похоже, вообще останавливает щелчок мыши, генерирующий сообщение LVN_COLUMNCLICK.

Как только я установил свойство FALSE, я смог забрать сообщение в Родительском диалоговом окне в соответствии с документацией, с обработчиком, как и в моем исходном сообщении о проблеме.

Однако это работает только с CListCtrl, а не с CMFCListCtrl. Я предпочел последнее, потому что оно генерирует более приятный цвет по умолчанию для заголовка (по крайней мере, в моей системе).

Второй:
Изучение исходного кода CMFCListCtrl в afxlistctrl.cpp показал, что он ловит LVN_COLUMNCLICK в обработчике NotifyRefect, который затем вызывает виртуальный код сортировки

ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, &CMFCListCtrl::OnColumnClick)
.
Часть отражения означает, что сообщение не распространяется на родительский диалог, поэтому я его там не взял. Я смог обойти это, создав подкласс CMFCListCtrl и обработав сообщение в своей версии элемента управления. Это реагирует на щелчки мыши в заголовке, и тогда я мог бы активировать механизм изменения его текста, что было моей первоначальной целью. Причина, по которой это не сработало в моей первой попытке подклассов, заключалась в проблеме стилей, описанной в первом разделе выше.


Рейтинг:
0

Richard MacCutchan

Согласно документации (Код уведомления LVN_COLUMNCLICK (Commctrl.ч) - Win32-приложений, Майкрософт документы[^]) это должно быть получено при нажатии на заголовок столбца.