2017-01-03 5 views
0

Я создал элементы управления деревом с помощью WinApi. Я хочу зафиксировать щелчок мышью на флажках. Уведомляющее сообщение NM_CLICK содержит NMHDR, который не имеет информации об щелчке узла. так как щелкнутый узел может отличаться от выбранного узла, должен быть способ найти, какой узел был проверен или снят, может быть HTREEITEM или lParam Inserted при добавлении элементов в древовидное представление. Я хочу захватить проверку/снятие отметки в реальном времени. Как я могу указать, какой узел проверяется/не установлен? любая помощь или ссылка оценили. mr.abzadehКак захватить, какой узел дерева отображается нажатием

ответ

0

Вы можете отправить сообщение TVM_HITTEST (или используйте TreeView_HitTest макрос), чтобы найти элемент представления дерева, учитывая клиент-относительные координаты.

Чтобы получить позицию курсора в то время, когда было создано сообщение NM_CLICK, используйте API GetMessagePos.

Это позволяет вам контролировать любой щелчок мышью в клиентской области элемента управления. Если вы заинтересованы в изменениях состояния в результате реализации стандартного управления представлением дерева, вы можете обрабатывать уведомления или TVN_ITEMCHANGED. Оба поставляют структуру NMTVITEMCHANGE, где hItem идентифицирует изменяемый элемент, а lParam несет данные, специфичные для приложения.

+0

downvote как плохое и неэффективное решение для вопроса OP - «Как я могу указать, какой узел проверяется или не установлен?» – RbMm

+0

вы добавляете информацию об уведомлениях 'TVN_ITEMCHANGING' и' TVN_ITEMCHANGED' ** уже после ** Я написал собственный ответ с этим - что видно из истории изменений. это как минимум не приятно :) – RbMm

+0

@RbMm: Поскольку вы не совсем поняли, как это место работает, пожалуйста, примите [тур] и посетите [помощь].Включение предложений из обратной связи ** - это правильная вещь. – IInspectable

1

Я хочу захватить проверку/снятие отметки в реальном времени. Как можно указать , какой узел проверяется/не установлен?

для этого существует уведомления TVN_ITEMCHANGING и TVN_ITEMCHANGED - искать uStateNew и uStateOld членов NMTVITEMCHANGE - когда древовидные есть флажки (TVS_CHECKBOXES стиля) он используется в качестве государственного списка изображений с 2-мя изображений - unchecked и checked.

так state & TVIS_STATEIMAGEMASK будет 0 при отсутствии флажка INDEXTOSTATEIMAGEMASK(1) для бесконтрольно и INDEXTOSTATEIMAGEMASK(2) для проверил. на основе этой информации мы можем и захватить щелчок мышью на флажках

с помощью TVN_ITEMCHANGING вы также можете предотвратить изменение при возврате TRUE для этого уведомления. если вам нужно только уведомить - использовать TVN_ITEMCHANGED

case WM_NOTIFY: 
     { 
      union { 
       LPARAM lp; 
       NMTVITEMCHANGE *pnm; 
       NMHDR* phdr; 
      }; 
      lp = lParam; 

      switch (phdr->code) 
      { 
      case TVN_ITEMCHANGING: 
       { 
        UINT CheckStateOld = pnm->uStateOld & TVIS_STATEIMAGEMASK; 
        UINT CheckStateNew = pnm->uStateNew & TVIS_STATEIMAGEMASK; 

        if (CheckStateNew != CheckStateOld) 
        { 
         PCSTR szstate = "??"; 
         switch (CheckStateNew) 
         { 
         case INDEXTOSTATEIMAGEMASK(1): 
          szstate = "uncheck"; 
          break; 
         case INDEXTOSTATEIMAGEMASK(2): 
          szstate = "check"; 
          break; 
         } 
         DbgPrint("%p>%s\n", pnm->lParam, szstate); 
        } 
       } 
       return FALSE; 
      } 
     } 

также прочитать How to Work With State Image Indexes

// Image 1 in the tree-view check box image list is the unchecked box. 
    // Image 2 is the checked box. 

    tvItem.state = INDEXTOSTATEIMAGEMASK((fCheck ? 2 : 1)); 

уведомления TVN_ITEMCHANGING и TVN_ITEMCHANGED доступна начинается с Windows Vista. если вам нужна поддержка XP тоже - на xp только опция use @IInspectable solution

+0

Важно отметить, что TVN_ITEMCHANGING доступен с Vista, иначе OP должен использовать hittesting. – AlwaysLearningNewStuff

+0

@AlwaysLearningNewStuff да .., я пропустил это. моя ошибка – RbMm

+0

Не ошибка, просто что-то важное. Я поддержал ваш ответ. – AlwaysLearningNewStuff

Смежные вопросы