TreeViewコントロール 選択されたアイテムの文字列を取得するには

Posted on Fri 28 August 2009 in Windows

まず、親ウィンドウでWM_NOTIFYを捕まえる。
WM_NOTIFYでTreeViewのイベントが送られてくるのでこれを処理する。
このときLPARAMにはNMTREEVIEW構造体のアドレスが入っている。

 LPNMTREEVIEW lpnmtview = (LPNMTREEVIEW)lp;
if(lpnmtview->hdr.idFrom != IDC_CONFIG_TREE) return;
switch(lpnmtview->hdr.code){
  case NM_CLICK: //ツリーアイテムクリック時
    break;
  case TVN_SELCHANGED: //ツリーアイテム選択変更時
    break;
}

このように
lpnmtview->hdr.idFromにツリービューのIDが、
lpnmtview->hdr.codeのイベントのIDが入っている。

クリックイベント時にはまだ、アイテムは選択されていないので、
NM_CLICKを捕まえて、選択アイテムを取得するというやり方では上手くいかない。

なので、TVN_SELCHANGED時に、選択アイテムを取得するという方法で行います。
このとき、送られてくる、NMTREEVIEW構造体に選択されているTVITEMが入ってるが、
このTVITEMのラベル名は正しく格納されていないので自分で取得する必要がある。

コード例は以下のようになる。

 LPNMTREEVIEW lpnmtview = (LPNMTREEVIEW)lp;
if(lpnmtview->hdr.idFrom != IDC_CONFIG_TREE) return;
switch(lpnmtview->hdr.code){
  case TVN_SELCHANGED: //ツリーアイテム選択変更時
  {
    HTREEITEM hItem = lpnmtview->itemNew.hItem;
    char pszText[256];
    TVITEM ti;
    ti.mask = TVIF_TEXT;
    ti.hItem = hItem;
    ti.pszText = pszText;
    ti.cchTextMax = 256;
    if(TreeView_GetItem(hTree, &ti)){
      //ここで、pszTextに選択アイテムのラベルが入っている。
    }
  }
  break;
}