Каким образом CTreeView/MFC может узнать, на какой элемент дерева кликнули ?
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.106] |
|
|
Правила раздела Visual C++ / MFC / WTL (далее Раздела)
FAQ Раздела
Обновления для FAQ Раздела
Поиск по Разделу
MSDN Library Online
Каким образом 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
,
|
|
|
|