目前軟件的數據曲線繪製模塊,需要用到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就搞定了。