На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Каким образом CTreeView/MFC может узнать, на какой элемент дерева кликнули ?
    Добрый вечер!
    Имеется экземпляр CTreeView. Необходимо, чтобы после клика на элементе дерева,
    выполнялось действие, связанное именно с этим элементом, т.е. мне необходимо получить его HTREEITEM.
    Код обработчика приведен ниже - он вызывается и вроде бы работает (SelectedItem извлекается),
    но проблема в том, что кликнули мы на одном элементе а SelectedItem - это не тот, на котором кликнули,
    а "предыдущий" текущий элемент.
    Видимо, на момент вызова моего обработчика текущий элемент еще не сменился на новый - кликнутый, а мне необходимо получить HTREEITEM именно кликнутого.
    Я знаю про вариант с TreeCtrl.HitTest, но меня здесь интересует, как обойтись без него.
    Ведь CtreeView уже знает на ком кликнули, осталось только его получить...

    В связи с этим прошу пояснить по вопросам:
    1) Каким образом я могу узнать на каком элементе дерева был клик ?

    2) В структуре есть поле NMHDR, а в нем - UINT idFrom - может ли он как-то помочь, как по нему получить контрол ?

    3) Могу ли я в своем обработчике вызвать сначала обработчик самого CTreeView ? Если да, то как ?
    (банальное CTreeView::OnNMClick не работает...)


    ExpandedWrap disabled
      --- объявление (оставлены только необходимые поля) (*.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()
      Lun2, уверен, что тут 0% форумчан на этом прогают.
      Тем не менее, уверен, что если ты вышлешь полный вариант своего "проблемного" проекта - многие заинтересуются.
        Цитата Majestio @
        Lun2, уверен, что тут 0% форумчан на этом прогают.


        Majestio, а на чем прогают с теми же целями - создание аналогичного по функционалу MFC пользовательского интерфейса в C++/VS Windows) ?
          Используйте событие TVN_SELCHANGED
          Его посылает система когда выбраный элемент изменился.

          ExpandedWrap disabled
            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% форумчан на этом прогают.

          "Тырса! Перестаньте разбрасываться своими зубами!" (с) :)
          Сообщение отредактировано: sharky72 -
            Цитата sharky72 @
            Используйте событие TVN_SELCHANGED
            Его посылает система когда выбраный элемент изменился.


            sharky72, спасибо за подсказку!
              Цитата Lun2 @
              Цитата sharky72 @
              Используйте событие TVN_SELCHANGED
              Его посылает система когда выбраный элемент изменился.


              sharky72, спасибо за подсказку!

              Всегда пожалуйста. И не слушайте всяких Majesto. MFC еще нас переживет ;)
                Цитата sharky72 @
                И не слушайте всяких Majesto. MFC еще нас переживет

                Вот очень хотелось сказать что-то очень гадкое!!! Но не получается :(
                Ну вот почему именно сёння мне так не везёт - началась полоса "доброты" :( Вот, блять, спасибо тебе, sharky72 - во всём виноватый ты. У меня получилось!
                  Это правильно. Будь добрым. Тебе идет ;)
                  А гадостей всегда успеешь наговорить... Главное по делу.
                    Тэкс!!! >:(
                    Прикреплённая картинка
                    Прикреплённая картинка


                    Это ты вон там написал что-то хорошее?!
                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0678 ]   [ 17 queries used ]   [ Generated: 31.10.25, 03:49 GMT ]