vc++ Tree Control使用總結

   目前軟件的數據曲線繪製模塊,需要用到TreeCtrl控件,在學習使用這個控件的過程中,再次感受到了自己的編程基本功、利用MSDN自學能力的不足,以及來自MFC做界面的不便,現在基礎還差,等再鞏固一段時間的windows編程以及MFC知識後,一定要學Duilib,系統的掌握一套自己的做界面的方法,不要總在界面上浪費這麼多時間。
需要利用TreeCtrl實現的功能:
1、創建 多個根節點,每個根節點有多個子節點;
2、每個節點前有checkBox選擇框,選中(取消)根節點後,此節點的所有子節點同步變化;
3、選中一個節點checkBox後,自動爲此節點的文本分配一種顏色,跟之前文本的顏色有明顯的區分,雙擊節點可以自定義修改顏色,此顏色作爲要繪製的曲線的顏色;
4、可以 全選和清空;
5、按部分字符串快速查找節點,如通過搜索“高度”字符串,可以快速定位到第一個文本中包含高度的節點,如“儀器高度”,高亮節點文本,再次點擊搜索按鈕,可以定位到下一個文本中含有高度的節點,如此循環,類似vs編譯器的查找功能;
6、全部遍歷;
7、可以動態修改節點文本。

 
爲了實現這些功能,一些重要的步驟:
一、設置控件屬性:Check Boxes:TRUE , Has Buttons:True , Has Lines:True , Lines At Root:True ,Edit Labels:True ;
二、初始化
   1、添加控件變量 CTreeCtrl m_treeCtrl;
   2、添加根節點HTREEITEM hRoot = m_treeCtrl.InsertItem(_T("根節點"));
      添加子節點HTREEITEM hChidl = m_treeCtrl.InsertItem(_T("子節點"),hRoot);
      注:由於根節點和子節點的個數都是固定的,可以預先定義根節點和子節點的HTREEITEM數組,這樣在修改顏色,節點文本,以及遍歷節點時都更加方便,當然如果需要         動態的添加刪除節點,就不能用這種方法。
   
三、添加TreeCtrl事件處理程序
   1、選中根節點的checkBox,所屬的子節點也同步全部選中。需要添加NM_CLICK的消息處理函數:
void CTreeCtrlClassDlg::OnNMClickTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: 在此添加控件通知處理程序代碼
	*pResult = 0;

	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

	CPoint p;

	GetCursorPos(&p);

	m_treeCtrl.ScreenToClient(&p);

	UINT nFlag;

	HTREEITEM h=m_treeCtrl.HitTest(p,&nFlag);

	if((h !=  NULL)&&(TVHT_ONITEMSTATEICON & nFlag))  

	{   
		if (m_treeCtrl.ItemHasChildren(h))
		{
			HTREEITEM hChild= m_treeCtrl.GetChildItem(h);
			while(NULL!=hChild)
			{
				m_treeCtrl.SetCheck(hChild,!m_treeCtrl.GetCheck(h));
				hChild= m_treeCtrl.GetNextSiblingItem(hChild);
			}		
	}

	
}
   2、程序運行時,可以修改節點標題,首先屬性Edit Labels設置True,然後添加TVN_ENDLABELEDIT消息處理函數:
<pre class="cpp" name="code">void CTreeCtrlClassDlg::OnTvnEndlabeleditTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
	// TODO: 在此添加控件通知處理程序代碼
	CString strText;
	m_treeCtrl.GetEditControl()->GetWindowText(strText);
	m_treeCtrl.SetItemText(pTVDispInfo->item.hItem,strText);
	*pResult = 0;
} 
   3、右鍵節點標題改變節點文本顏色,添加NM_RCLIK消息相應函數:
<pre class="cpp" name="code">void CTreeCtrlClassDlg::OnNMRclickTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: 在此添加控件通知處理程序代碼
	*pResult = 0;

	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

	CPoint p;

	GetCursorPos(&p);

	m_treeCtrl.ScreenToClient(&p);

	UINT nFlag;

	HTREEITEM h=m_treeCtrl.HitTest(p,&nFlag);

	if((h !=  NULL)&&(TVHT_ONITEMLABEL & nFlag)&&m_treeCtrl.GetCheck(h))  
	{
		CColorDialog dlg; 
		COLORREF curColor;
		//打開顏色對話框,獲取選定的顏色 
		if(dlg.DoModal()==IDOK) 
		{
			curColor=dlg.GetColor();
			m_treeCtrl.SetItemColor(h,curColor);
		}
	}
}
    注:TreeCtrl類本身並沒有SetItemColor改變單個節點文本顏色的函數,我是在網上找了個TreeCtrl的派生類,添加了這個功能函數,想要這個類的可以聯繫我。
四、遍歷節點和全選/清空節點
由於程序中預先定義了根節點和子節點的HTREEITEM數組,所以遍歷和全選時非常方便,一個for循環,檢查每個節點的getCheck就搞定了。



 

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