MFC--手動呼叫CTreeCtrl的訊息響應函式
阿新 • • 發佈:2019-02-13
在製作過程中,想要程式碼實現樹形控制元件的一個動作,無奈用SendMessage無果,只能手動呼叫這個訊息響應函式:
void CWindowsExplorerDlg::OnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult) { //LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); //TODO: 在此新增控制元件通知處理程式程式碼 m_list.DeleteAllItems(); NM_TREEVIEW * pNMTreeView = (NM_TREEVIEW*)pNMHDR; TVITEM item = pNMTreeView->itemNew; if (item.hItem == m_hRoot) return; .......... }
首先,這個訊息響應函式完成的功能是滑鼠點選樹的一個節點,介面上的其他控制元件做出相應的動作。很明顯,這個函式看似形參十分怪,而且還對引數做了一些奇怪的操作,但是用到的東西只有一個,那就是相應節點的指標item.hItem,型別是HTREEITEM。而將NMHDR型別變換成NM_TREEVIEW型別,是因為NMHDR是NM_TREEVIEW的超類,實際上傳入的實參就是NM_TREEVIEW,但是被強制轉換為NMHDR,所以看不到一些變數,所以就要轉換回來,這樣就清楚明白該如何手動呼叫這個函數了。
LRESULT p; NM_TREEVIEW w; NMHDR hdr; TVITEM tvItem; tvItem.hItem = item; //item是已經獲得的對應節點的HTREEITEM指標 w.itemNew = tvItem; OnSelchangedTree((NMHDR *)&w, &p);
後來我發現,其實不用這麼麻煩,有item是已經獲得的對應節點的HTREEITEM指標,那麼可以使用這個函式將對應節點設定成選定點,會高亮,會展開父級。
m_tree.Select(item, TVGN_CARET);
TVGN_CARET 就像被滑鼠點中,會高亮,會展開,會響應訊息,用GetSelectedItem得到的是當前節點
TVGN_DROPHILITE 只會高亮節點,不會展開不會響應訊息,用GetSelectedItem得到的是根節點
TVGN_FIRSTVISIBLE 會高亮,會展開,但是不會響應訊息,用GetSelectedItem得到的是根節點