 Каким образом CTreeView/MFC может узнать, на какой элемент дерева кликнули ?
    Каким образом CTreeView/MFC может узнать, на какой элемент дерева кликнули ?
    
  |  | Наши проекты: Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту | |
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.107] | 
|   | 
 | 
 Правила раздела Visual C++ / MFC / WTL (далее Раздела)
    Правила раздела Visual C++ / MFC / WTL (далее Раздела)
   FAQ Раздела
 FAQ Раздела   Обновления для FAQ Раздела
 Обновления для FAQ Раздела    Поиск по Разделу
 Поиск по Разделу   MSDN Library Online
 MSDN Library Online Каким образом CTreeView/MFC может узнать, на какой элемент дерева кликнули ?
    Каким образом CTreeView/MFC может узнать, на какой элемент дерева кликнули ?
    
  | 
         
         
          
           Сообщ.
           #1
          
          , 
          
         
         | |
|  |  Добрый вечер! Имеется экземпляр CTreeView. Необходимо, чтобы после клика на элементе дерева, выполнялось действие, связанное именно с этим элементом, т.е. мне необходимо получить его HTREEITEM. Код обработчика приведен ниже - он вызывается и вроде бы работает (SelectedItem извлекается), но проблема в том, что кликнули мы на одном элементе а SelectedItem - это не тот, на котором кликнули, а "предыдущий" текущий элемент. Видимо, на момент вызова моего обработчика текущий элемент еще не сменился на новый - кликнутый, а мне необходимо получить HTREEITEM именно кликнутого. Я знаю про вариант с TreeCtrl.HitTest, но меня здесь интересует, как обойтись без него. Ведь CtreeView уже знает на ком кликнули, осталось только его получить... В связи с этим прошу пояснить по вопросам: 1) Каким образом я могу узнать на каком элементе дерева был клик ? 2) В структуре есть поле NMHDR, а в нем - UINT idFrom - может ли он как-то помочь, как по нему получить контрол ? 3) Могу ли я в своем обработчике вызвать сначала обработчик самого CTreeView ? Если да, то как ? (банальное CTreeView::OnNMClick не работает...)   --- объявление (оставлены только необходимые поля) (*.h) --- class StorageTreeView : public CTreeView {     DECLARE_MESSAGE_MAP() public:     afx_msg void OnNMClick(NMHDR* pNMHDR, LRESULT* pResult); }; --- реализация обработчика клика (*.cpp) --- void StorageTreeView::OnNMClick(NMHDR* pNMHDR, LRESULT* pResult) { /* Структура NMHDR: typedef struct tagNMHDR {    HWND hwndFrom; // handle of control sending message    UINT idFrom;// identifier of control sending message    UINT code; // notification code; see below } NMHDR; */     TRACE(L"OnNMClick\n");     *pResult = 0;     // Получаем элемент дерева, на котором кликнули ...     CTreeCtrl& Tree = GetTreeCtrl();     HTREEITEM SelectedItem = Tree.GetSelectedItem();         ... } .... BEGIN_MESSAGE_MAP(StorageTreeView, CTreeView) ON_NOTIFY_REFLECT(NM_CLICK, &StorageTreeView::OnNMClick) END_MESSAGE_MAP() | 
| 
         
         
          
           Сообщ.
           #2
          
          , 
          
         
         | |
|  |  Lun2, уверен, что тут 0% форумчан на этом прогают. Тем не менее, уверен, что если ты вышлешь полный вариант своего "проблемного" проекта - многие заинтересуются. | 
| 
         
         
          
           Сообщ.
           #3
          
          , 
          
         
         | |
|  | Цитата Majestio @  Lun2, уверен, что тут 0% форумчан на этом прогают. Majestio, а на чем прогают с теми же целями - создание аналогичного по функционалу MFC пользовательского интерфейса в C++/VS Windows) ? | 
| 
         
         
          
           Сообщ.
           #4
          
          , 
          
         
         | |
|  |  Используйте событие TVN_SELCHANGED Его посылает система когда выбраный элемент изменился.   ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, &AppDlg::OnTvnSelchangedTree) void AppDlg::OnTvnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) {     *pResult = 0;     LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);     pNMTreeView->itemNew.hItem; // <- это ваш новый выбраный элемент в TreeView } Добавлено Цитата Lun2 @  Majestio, а на чем прогают с теми же целями - создание аналогичного по функционалу MFC пользовательского интерфейса в C++/VS Windows) ? QT/wxWidgets два основных кроссплатформенных фреймворка. QT - монстр. У него свои проблемы. wxWidget проще и на него проще портануть готовый MFC проект. Хотя если только на Windows - то MFC до сих пор рабочий вариант. На последних студиях даже пофиксили проблемы с HiRes Добавлено Цитата Majestio @  Lun2, уверен, что тут 0% форумчан на этом прогают. "Тырса! Перестаньте разбрасываться своими зубами!" (с)   | 
| 
         
         
          
           Сообщ.
           #5
          
          , 
          
         
         | |
|  | Цитата sharky72 @  Используйте событие TVN_SELCHANGED Его посылает система когда выбраный элемент изменился. sharky72, спасибо за подсказку! | 
| 
         
         
          
           Сообщ.
           #6
          
          , 
          
         
         | |
|  | Цитата Lun2 @  Цитата sharky72 @  Используйте событие TVN_SELCHANGED Его посылает система когда выбраный элемент изменился. sharky72, спасибо за подсказку! Всегда пожалуйста. И не слушайте всяких Majesto. MFC еще нас переживет   | 
| 
         
         
          
           Сообщ.
           #7
          
          , 
          
         
         | |
|  | Цитата sharky72 @   И не слушайте всяких Majesto. MFC еще нас переживет  Вот очень хотелось сказать что-то очень гадкое!!! Но не получается  Ну вот почему именно сёння мне так не везёт - началась полоса "доброты"  Вот, блять, спасибо тебе, sharky72 - во всём виноватый ты. У меня получилось! | 
| 
         
         
          
           Сообщ.
           #8
          
          , 
          
         
         | |
|  |  Это правильно. Будь добрым. Тебе идет   А гадостей всегда успеешь наговорить... Главное по делу. | 
| 
         
         
          
           Сообщ.
           #9
          
          , 
          
         
         | |
|  |