2017-01-03 6 views
0

WinApiを使用してツリービューコントロールを作成しました。私はチェックボックスでマウスクリックをキャプチャしたい。通知メッセージNM_CLICKには、クリックされたノードに関する情報を持たないNMHDRが含まれています。クリックされたノードは選択されたノードと異なる可能性があるため、ツリービューに項目を追加するときに、どのノードがチェックされているかチェックされていないかを見つける方法があります。私は、チェック/チェック解除をリアルタイムでキャプチャしたい。どのノードをチェック/チェック解除しないかを指定するにはどうすればよいですか?任意のヘルプやリンクをいただければ幸いです。 mr.abzadehクリックしたツリービューノードをキャプチャする方法

答えて

0

クライアントの相対的な座標で、ツリービュー項目を見つけるには、TVM_HITTESTメッセージ(またはTreeView_HitTestマクロを使用)を送信できます。

NM_CLICKメッセージが生成された時点でカーソル位置を取得するには、GetMessagePos APIを使用します。

これにより、コントロールのクライアント領域でのマウスクリックを監視できます。標準的なツリービューコントロール実装の結果として状態の変更に関心がある場合は、代わりにTVN_ITEMCHANGINGまたはTVN_ITEMCHANGEDの通知を処理できます。どちらもNMTVITEMCHANGE構造体を提供します。hItemは変更される項目を示し、lParamはアプリケーション固有のデータを示します。

+0

OPの質問には悪いとは効果的ではない - 「どのノードをチェック/チェックしないのかを指定するにはどうすればよいですか? – RbMm

+0

あなたは** TVN_ITEMCHANGINGと** TVN_ITEMCHANGED通知についての情報を**追加しました。**これを使って私自身の答えを書きました。これは編集履歴で見ることができます。これはちょっといいじゃないですか? – RbMm

+0

@RbMm:あなたがまだ理解していないので、この場所の仕組みは、[ツアー]に行き、[ヘルプ]をご覧ください。フィードバックからの提案を組み込むことは**正しいことです**。 – IInspectable

1

リアルタイムでチェック/アンカを取りたいと思っています。 どのノードをチェックする/しないを指定できますか? NMTVITEMCHANGEuStateNewuStateOldメンバーを探してください - - ツリービューは、チェックボックス(TVS_CHECKBOXESスタイル)を持っている場合、それは2枚の画像で状態イメージリストとして使用 - uncheckedcheckedこれが存在通知TVN_ITEMCHANGINGTVN_ITEMCHANGEDため

だから、はチェックボックスなしの場合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_ITEMCHANGINGTVN_ITEMCHANGEDは、Windows Vistaから始める可能です。 XPのサポートが必要な場合 - xnsのみオプションで@@nspectableを使用するsolution

+0

TVN_ITEMCHANGINGはVista以降で利用できます。そうでない場合は、OPはhittestingを使用する必要があります。 – AlwaysLearningNewStuff

+0

@AlwaysLearningNewStuffはい..、これが欠けています。私の間違い – RbMm

+0

間違いなく、言及するだけ重要なこと。私はあなたの答えをupvotedしています。 – AlwaysLearningNewStuff

関連する問題