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得到的是根節點

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章