C ++ / MFC: обработка нескольких заголовков CListCtrl для событий HDN_ITEMCLICK - PullRequest
0 голосов
/ 08 апреля 2010

Я кодирую приложение MFC, в котором у меня есть диалоговое окно с несколькими CListCtrls в представлении отчета. Я хочу, чтобы один из них был сортируемым. Поэтому я обработал событие HDM_ITEMCLICK, и все работает просто отлично. За исключением того, что если я нажимаю на заголовки другого CListCtrl, он сортирует OTHER CListCtrl, который выглядит довольно глупо.

Это, очевидно, связано с тем, что заголовки имеют идентификатор 0, что делает запись в карте сообщений такой:

ON_NOTIFY(HDN_ITEMCLICK, 0, &Ccreationprogramme::OnHdnItemclickList5)

Но поскольку все заголовки имеют нулевой идентификатор, очевидно, каждый заголовок моего диалога отправляет сообщение.

Есть ли простой способ обойти эту проблему?

РЕДАКТИРОВАТЬ: Может быть, я не ясно, но я проверил значения внутри структуры NMHDR. Указатель HwndFrom отличается в зависимости от того, по какому заголовку щелкают, что мне мало помогает, поскольку его значение, очевидно, отличается в каждой среде выполнения. Значение idFrom равно 0, по причинам, которые я объяснил выше, потому что это идентификатор каждого заголовка. Спасибо

EDIT2: значения указателя hwnd также не соответствуют CListCtrl, возможно, потому, что он полностью исходит из другого объекта.

Ответы [ 3 ]

3 голосов
/ 08 апреля 2010

Проверьте значения структуры NMHDR.
http://msdn.microsoft.com/en-us/library/bb775514%28VS.85%29.aspx

2 голосов
/ 08 апреля 2010

LPARAM, передаваемый вашему обработчику сообщений, фактически является указателем на структуру NMHEADER, которая содержит структуру NMHDR, которая, в свою очередь, содержит HWND и идентификатор элемента управления, отправившего сообщение. Вы можете сравнить его с элементами управления списком HWND s, чтобы определить, какой элемент заголовка окна был выбран.

В качестве альтернативы вы можете получить класс из CListCtrl и отразить сообщения HDN_ITEMCLICK обратно в элемент управления списком. Таким образом, каждый объект управления списком обрабатывает уведомления своего собственного заголовка.

1 голос
/ 08 апреля 2010

Хорошо, я нашел решение, хотя и нахожу его немного грязным, но оно работает, поэтому я опубликую его для дальнейшего использования.

Вы можете получить Заголовок через функцию-член GetHeaderCtrl CListCtrl. Затем вы можете получить его обработчик через m_hWnd. Итак, все, что вам нужно сделать, это проверить, является ли этот обработчик тем же, что и в структуре NMHDR, поэтому код выглядит так:

void Ccreationprogramme::OnHdnItemclickList5(NMHDR *pNMHDR, LRESULT *pResult)
{  
  if (pNMHDR->hwndFrom == LC_gen_schedules.GetHeaderCtrl()->mhWnd)
  {
    // Code goes here
  }
    *pResult = 0;
}

Спасибо всем за помощь

...