天天看點

樹形控件的重命名問題

樹控件在很多時候都可以用得到,本來覺得網上應該有很多資料,可以找個例子幾行行代碼就可以解決了的,

但是google了一下,關鍵字“樹形控件 重命名”搜到的網頁都不是我想要的,找了兩個左右有用的網頁看了一下,感覺都沒有完全說清楚,

我決定先把必要的東西加上,然後邊調邊試,總算成功了,不說廢話,看下面

首先加上樹形控件的兩個通知消息:TVN_BEGINLABELEDIT,TVN_ENDLABELEDIT,在響應函數中添加這兩個消息的響應函數

void CFileView::OnTvnBeginLabelEditTree(NMHDR* pNMHDR, LRESULT* pResult)
{
   LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);

}
           
void CFileView::OnTvnBeginLabelEditTree(NMHDR* pNMHDR, LRESULT* pResult)
{
   LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
  TV_ITEM* ptvItem = &pTVDispInfo->item;

// 擷取修改後的名稱
CString LabelStr = ptvItem->pszText;

// 對新輸入的名稱作一些限制
if(LabelStr == "")
{
   return;
}

// 設定新名稱
HTREEITEM curItem = ptvItem->hitem;
if(curItem)
{
//treeCtrl 是CTreeCtrl的一個對象 
   treeCtrl.SetItemText(curItem, LabelStr);
}
}
           
添加一個“重命名”的菜單或者按鈕,在其響應函數中加上下面幾句代碼,就可以實作重命名了
void CFileView::OnTreeRename()
{
    HTREEITEM hSltItem = treeCtrl.GetFirstSelectedItem();
   if(hSltItem)
{
   CEdit* pLabelEdit = treeCtrl.EditLabel(hSltItem);
   ASSERT(pLabelEdit != NULL);
}
}
           
還需要注意一點,需要将樹控件的樹形設定能夠編輯,就是要有TVS_EDITLABELS這個屬性