TVN_SELCHANGING не получен

#c #winapi #atl #wtl

#c #winapi #atl #wtl

Вопрос:

У меня есть приложение WTL81. CMainFrame имеет дочерний CPaneContainer, который имеет дочернее окно CTreeViewCtrl. Проблема в том, что CTreeViewCtrl не получает сообщение TVN_SELCHANGING.

Я «подсмотрел» CTreeViewCtrl и его родительский элемент (CPaneContainer), но код уведомления не получен.

CMainFrame реализован из общедоступного CFrameWindowImpl<CMainFrame>

CPaneContainer реализован следующим образом

 class PaneContainerReflectNotif : public CPaneContainer 
{
    BEGIN_MSG_MAP(PaneContainerReflectNotif)
        CHAIN_MSG_MAP(CPaneContainer)
        REFLECT_NOTIFICATIONS()
    END_MSG_MAP()
};
  

Дерево реализовано следующим образом

 class MyTreeView : 
    public CWindowImpl<CatalogTreeView, CTreeViewCtrl>,
    public CCustomDraw<CatalogTreeView>,
    public CTheme

   ...

BEGIN_MSG_MAP_EX(MyTreeView )
    MSG_WM_CREATE(OnCreate)
    MSG_WM_DESTROY(OnDestroy)
    REFLECTED_NOTIFY_CODE_HANDLER_EX(NM_DBLCLK, OnDblClick)
    REFLECTED_NOTIFY_CODE_HANDLER_EX(TVN_ITEMEXPANDING, OnItemExpanding)
    REFLECTED_NOTIFY_CODE_HANDLER_EX(TVN_SELCHANGING, OnSelChanged)
  

OnDblClick — работает нормально
OnItemExpanding — работает нормально
OnSelChanged — не работает

есть идеи о том, в чем может быть проблема?

Комментарии:

1. Вы вообще не видите TVN_SELCHANGING? Значит, ничего не выбирается?

2. Элементы выбираются нормально, просто я не получаю уведомления о TVN_SELCHANGING.

3. Используйте инструмент Spy , чтобы посмотреть, что происходит.

4. Я подсмотрел как дерево, так и родительский элемент. Он получает уведомления (NM_CUSTOMDRAW, NM_KILLFOCUS, TVN_ITEMCHANGEING и т.д.), Но не TVN_SELCHANGING …

5. Попробуйте добавить REFLECT_NOTIFICATIONS() в карту сообщений вашего главного окна.

Ответ №1:

Решена. Моя проблема заключалась в том, что просмотр дерева был множественным, и такое дерево не отправляет уведомления о TVN_SELCHANGING

Ответ №2:

Вы не упомянули, зачем вам нужен TVN_SELCHANGING. Событие запускается при изменении узлов дерева и выборе другого узла дерева.

В качестве альтернативы вы можете попробовать TVN_SELCHANGED или hitTest( ). Я предоставляю ссылку на MFC .. http://msdn.microsoft.com/en-us/library/x0w7ft34.aspx

Комментарии:

1. TVN_SELCHANGING запускается, когда выбор собирается измениться с одного элемента на другой. Это то, что мне нужно. TVN_SELCHANGED также не запускается, но я не думаю, что это помогает