1. 程式人生 > >MFC--手動呼叫CTreeCtrl的訊息響應函式

MFC--手動呼叫CTreeCtrl的訊息響應函式

在製作過程中,想要程式碼實現樹形控制元件的一個動作,無奈用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得到的是根節點