VS2010/MFC編程(常用控件:樹形控件Tree Control控件創(chuàng)建h和實例)
前面一節(jié)講了樹形控件Tree Control的簡介、通知消息以及相關數據結構,本節(jié)繼續(xù)講下半部分,包括樹形控件的創(chuàng)建、CTreeCtrl類的主要成員函數和應用實例。
樹形控件的創(chuàng)建
MFC為樹形控件提供了CTreeCtrl類,它封裝了樹形控件的所有操作。
樹形控件的創(chuàng)建也是有兩種方式,一種是在對話框模板中直接拖入Tree Control控件創(chuàng)建,另一種就是通過CTreeCtrl類的Create成員函數創(chuàng)建。下面主要講后者。
CTreeCtrl類的Create成員函數的原型如下:
virtual BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);
此函數的原型與前面講到的所有控件類的Create函數都類似。dwStyle指定樹形控件風格的組合,rect指定樹形控件窗口的位置和大小,pParentWnd為指向樹形控件父窗口的指針,nID指定樹形控件的ID。下面還是主要講講樹形控件的主要風格以及含義。
- TVS_DISABLEDRAGDROP:禁止樹形控件發(fā)送TVN_BEGINDRAG通知消息,即不支持拖動操作
- TVS_EDITLABELS:用戶可以編輯節(jié)點的標簽文本
- TVS_HASBUTTONS:顯示帶有"+"或"-"的小方框來表示某項能否被展開或已展開
- TVS_HASLINES:在父節(jié)點與子節(jié)點間連線以更清晰地顯示樹的結構
- TVS_LINESATROOT:在根節(jié)點處連線
- TVS_SHOWSELALWAYS:即使控件失去輸入焦點,仍顯示出項的選擇狀態(tài)
同樣,動態(tài)創(chuàng)建樹形控件時,除了能夠指定上述風格的組合外,一般還要指定WS_CHILD和WS_VISIBLE風格。
在對話框模板中直接拖入Tree Control創(chuàng)建樹形控件時,可以在樹形控件的屬性頁中設置其風格,與上面的風格是對應的,例如,屬性Has Lines對應的就是TVS_HASLINES風格。
CTreeCtrl類的主要成員函數
CImageList* SetImageList(CImageList * pImageList,int nImageListType);
如果樹節(jié)點需要顯示圖標時,則必須先創(chuàng)建一個CImageList類的對象,并為其添加多個圖像組成一個圖像序列,然后調用SetImageList函數為樹形控件設置圖像序列,在用InsertItem插入節(jié)點時傳入所需圖像在圖像序列中的索引即可。后面的例子中會演示。參數pImageList為指向圖像序列類CImageList的對象的指針,若為NULL則刪除樹形控件的所有圖像。參數nImageListType指定圖像序列的類型,可以是TVSIL_NORMAL(普通圖像序列)或TVSIL_STATE(狀態(tài)圖像序列,用圖像表示節(jié)點的狀態(tài))。
UINT GetCount( ) const;
獲取樹形控件中節(jié)點的數量。
DWORD_PTR GetItemData(HTREEITEM hItem) const;
獲取樹形控件中某個指定節(jié)點的附加32位數據。參數hItem為指定的樹節(jié)點的句柄。
BOOL SetItemData(HTREEITEM hItem,DWORD_PTR dwData);
為樹形控件中某個指定節(jié)點設置附加的32位數據。參數hItem同上,dwData為要設置的32位數據。
CString GetItemText(HTREEITEM hItem) const;
獲取樹形控件中某個指定節(jié)點的標簽文本。參數hItem同上。返回值是包含標簽文本的字符串。
BOOL SetItemText(HTREEITEM hItem,LPCTSTR lpszItem);
為樹形控件中某個指定節(jié)點設置標簽文本。參數hItem同上,lpszItem為包含標簽文本的字符串的指針。
HTREEITEM GetNextSiblingItem(HTREEITEM hItem) const;
獲取樹形控件中某個指定節(jié)點的下一個兄弟節(jié)點。參數hItem同上。返回值是下一個兄弟節(jié)點的句柄。
HTREEITEM GetPrevSiblingItem(HTREEITEM hItem) const;
獲取樹形控件中某個指定節(jié)點的上一個兄弟節(jié)點。參數hItem同上。返回值是上一個兄弟節(jié)點的句柄。
HTREEITEM GetParentItem(HTREEITEM hItem) const;
獲取樹形控件中某個指定節(jié)點的父節(jié)點。參數hItem同上。返回值是父節(jié)點的句柄。
HTREEITEM GetRootItem( ) const;
獲取樹形控件根節(jié)點的句柄。
HTREEITEM GetSelectedItem( ) const;
獲取樹形控件當前選中節(jié)點的句柄。
BOOL DeleteAllItems( );
刪除樹形控件中的所有節(jié)點。刪除成功則返回TRUE,否則返回FALSE。
BOOL DeleteItem(HTREEITEM hItem);
刪除樹形控件中的某個節(jié)點。參數hItem為要刪除的節(jié)點的句柄。刪除成功則返回TRUE,否則返回FALSE。
HTREEITEM InsertItem(LPCTSTR lpszItem,int nImage,int nSelectedImage,HTREEITEM hParent = TVI_ROOT,HTREEITEM hInsertAfter = TVI_LAST);
在樹形控件中插入一個新節(jié)點。參數lpszItem為新節(jié)點的標簽文本字符串的指針,參數nImage為新節(jié)點的圖標在樹形控件圖像序列中的索引,參數nSelectedImage為新節(jié)點被選中時的圖標在圖像序列中的索引,參數hParent為插入節(jié)點的父節(jié)點的句柄,參數hInsertAfter為新節(jié)點的前一個節(jié)點的句柄,即新節(jié)點將被插入到hInsertAfter節(jié)點之后。
BOOL SelectItem(HTREEITEM hItem);
選中指定的樹節(jié)點。參數hItem為要選擇的節(jié)點的句柄。若成功則返回TRUE,否則返回FALSE。
樹形控件的應用實例
最后還是給大家寫一個簡單的實例,說明CListCtrl類的幾個成員函數及樹形控件通知消息等的使用方法。
此實例實現的功能:在一個樹形控件中顯示網站的簡單結構分層,共有三層,分別為網站、各個分類和文章。用鼠標左鍵單擊改變選中節(jié)點后,將選中節(jié)點的文本顯示到編輯框中。另外,還要實現一個常見的效果,就是鼠標劃過除根節(jié)點外的某個樹節(jié)點時,顯示相應的Tip提示信息。下面是具體實現步驟:
1. 創(chuàng)建一個基于對話框的MFC工程,名稱設置為“Example31”。
2. 在自動生成的對話框模板IDD_EXAMPLE31_DIALOG中,刪除“TODO: Place dialog controls here.”靜態(tài)文本框、“OK”按鈕和“Cancel”按鈕。添加一個Tree Control控件,ID設置為IDC_WEB_TREE,屬性Has Buttons、Has Lines和Lines At Root都設為True,為了在鼠標劃過某個節(jié)點時顯示提示信息還需要將Info Tip屬性設為True。再添加一個靜態(tài)文本框和一個編輯框,靜態(tài)文本框的Caption屬性設為“您選擇的節(jié)點:”,編輯框的ID設為IDC_ITEM_SEL_EDIT,Read Only屬性設為True。此時的對話框模板如下圖:
3. 導入需要為樹形控件的節(jié)點添加的圖標。在這里找了三個32x32的Icon圖標,保存到工程的res目錄下。然后在Resource View資源視圖中,右鍵點擊Icon節(jié)點,在右鍵菜單中選擇“Add Resource...”,彈出“Add Resource”對話框,再從左邊“Resource type”列表中選擇“Icon”,點擊右邊的“Import...”按鈕,就可以選擇三個圖標文件進行導入了。導入成功后,分別修改它們ID為IDI_WEB_ICON、IDI_CATALOG_ICON和IDI_ARTICLE_ICON。
4. 為樹形控件IDC_WEB_TREE添加CTreeCtrl類型的控件變量m_webTree。并在Example31Dlg.h文件中為CExample31Dlg類添加成員對象:CImageList m_imageList;。
5. 在對話框初始化時,我們在樹形控件中添加網站的樹形結構,那么需要修改CExample31Dlg::OnInitDialog()函數為:
BOOL CExample31Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
......略
// TODO: Add extra initialization here
HICON hIcon[3]; // 圖標句柄數組
HTREEITEM hRoot; // 樹的根節(jié)點的句柄
HTREEITEM hCataItem; // 可表示任一分類節(jié)點的句柄
HTREEITEM hArtItem; // 可表示任一文章節(jié)點的句柄
// 加載三個圖標,并將它們的句柄保存到數組
hIcon[0] = theApp.LoadIcon(IDI_WEB_ICON);
hIcon[1] = theApp.LoadIcon(IDI_CATALOG_ICON);
hIcon[2] = theApp.LoadIcon(IDI_ARTICLE_ICON);
// 創(chuàng)建圖像序列CImageList對象
m_imageList.Create(32, 32, ILC_COLOR32, 3, 3);
// 將三個圖標添加到圖像序列
for (int i=0; i<3; i++)
{
m_imageList.Add(hIcon[i]);
}
// 為樹形控件設置圖像序列
m_webTree.SetImageList(&m_imageList, TVSIL_NORMAL);
// 插入根節(jié)點
hRoot = m_webTree.InsertItem(_T("雞啄米"), 0, 0);
// 在根節(jié)點下插入子節(jié)點
hCataItem = m_webTree.InsertItem(_T("IT互聯網"), 1, 1, hRoot, TVI_LAST);
// 為“IT互聯網”節(jié)點添加附加的編號數據,在鼠標劃過該節(jié)點時顯示
m_webTree.SetItemData(hCataItem, 1);
// 在“IT互聯網”節(jié)點下插入子節(jié)點
hArtItem = m_webTree.InsertItem(_T("百度文章1"), 2, 2, hCataItem, TVI_LAST);
// 為“百度文章1”節(jié)點添加附加的編號數據,在鼠標劃過該節(jié)點時顯示
m_webTree.SetItemData(hArtItem, 2);
// 在“IT互聯網”節(jié)點下插入另一子節(jié)點
hArtItem = m_webTree.InsertItem(_T("谷歌文章2"), 2, 2, hCataItem, TVI_LAST);
// 為“谷歌文章2”節(jié)點添加附加的編號數據,在鼠標劃過該節(jié)點時顯示
m_webTree.SetItemData(hArtItem, 3);
// 在根節(jié)點下插入第二個子節(jié)點
hCataItem = m_webTree.InsertItem(_T("數碼生活"), 1, 1, hRoot, TVI_LAST);
// 為“數碼生活”節(jié)點添加附加的編號數據,在鼠標劃過該節(jié)點時顯示
m_webTree.SetItemData(hCataItem, 4);
// 在“數碼生活”節(jié)點下插入子節(jié)點
hArtItem = m_webTree.InsertItem(_T("智能手機文章1"), 2, 2, hCataItem, TVI_LAST);
// 為“智能手機文章1”節(jié)點添加附加的編號數據,在鼠標劃過該節(jié)點時顯示
m_webTree.SetItemData(hArtItem, 5);
// 在“數碼生活”節(jié)點下插入另一子節(jié)點
hArtItem = m_webTree.InsertItem(_T("平板電腦文章2"), 2, 2, hCataItem, TVI_LAST);
// 為“平板電腦文章2”節(jié)點添加附加的編號數據,在鼠標劃過該節(jié)點時顯示
m_webTree.SetItemData(hArtItem, 6);
// 在根節(jié)點下插入第三個子節(jié)點
hCataItem = m_webTree.InsertItem(_T("軟件開發(fā)"), 1, 1, hRoot, TVI_LAST);
// 為“軟件開發(fā)”節(jié)點添加附加的編號數據,在鼠標劃過該節(jié)點時顯示
m_webTree.SetItemData(hCataItem, 7);
// 在“軟件開發(fā)”節(jié)點下插入子節(jié)點
hArtItem = m_webTree.InsertItem(_T("C++編程入門系列1"), 2, 2, hCataItem, TVI_LAST);
// 為“C++編程入門系列1”節(jié)點添加附加的編號數據,在鼠標劃過該節(jié)點時顯示
m_webTree.SetItemData(hArtItem, 8);
// 在“軟件開發(fā)”節(jié)點下插入另一子節(jié)點
hArtItem = m_webTree.InsertItem(_T("VS2010/MFC編程入門2"), 2, 2, hCataItem, TVI_LAST);
// 為“VS2010/MFC編程入門2”節(jié)點添加附加的編號數據,在鼠標劃過該節(jié)點時顯示
m_webTree.SetItemData(hArtItem, 9);
// 在根節(jié)點下插入第四個子節(jié)點
hCataItem = m_webTree.InsertItem(_T("娛樂休閑"), 1, 1, hRoot, TVI_LAST);
// 為“娛樂休閑”節(jié)點添加附加的編號數據,在鼠標劃過該節(jié)點時顯示
m_webTree.SetItemData(hCataItem, 10);
// 在“娛樂休閑”節(jié)點下插入子節(jié)點
hArtItem = m_webTree.InsertItem(_T("瑪雅文明文章1"), 2, 2, hCataItem, TVI_LAST);
// 為“瑪雅文明文章1”節(jié)點添加附加的編號數據,在鼠標劃過該節(jié)點時顯示
m_webTree.SetItemData(hArtItem, 11);
// 在“娛樂休閑”節(jié)點下插入另一子節(jié)點
hArtItem = m_webTree.InsertItem(_T("IT笑話2"), 2, 2, hCataItem, TVI_LAST);
// 為“IT笑話2”節(jié)點添加附加的編號數據,在鼠標劃過該節(jié)點時顯示
m_webTree.SetItemData(hArtItem, 12);
return TRUE; // return TRUE unless you set the focus to a control
}
6. 我們希望在選中節(jié)點改變時,將最新的選擇項實時顯示到編輯框中,那么可以響應TVN_SELCHANGED通知消息。為樹形控件IDC_WEB_TREE的通知消息TVN_SELCHANGED添加消息處理函數CExample31Dlg::OnTvnSelchangedWebTree,并修改函數體如下:
void CExample31Dlg::OnTvnSelchangedWebTree(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
CString strText; // 樹節(jié)點的標簽文本字符串
// 獲取當前選中節(jié)點的句柄
HTREEITEM hItem = m_webTree.GetSelectedItem();
// 獲取選中節(jié)點的標簽文本字符串
strText = m_webTree.GetItemText(hItem);
// 將字符串顯示到編輯框中
SetDlgItemText(IDC_ITEM_SEL_EDIT, strText);
}
7. 還有一個功能需要實現,那就是鼠標劃過除根節(jié)點外的某個樹節(jié)點時,顯示相應的Tip提示信息,本實例中提示信息為節(jié)點的編號。這需要響應TVN_GETINFOTIP通知消息。為樹形控件IDC_WEB_TREE的通知消息TVN_GETINFOTIP添加消息處理函數CExample31Dlg::OnTvnGetInfoTipWebTree,并修改函數體如下:
void CExample31Dlg::OnTvnGetInfoTipWebTree(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMTVGETINFOTIP>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
NMTVGETINFOTIP* pTVTipInfo = (NMTVGETINFOTIP*)pNMHDR; // 將傳入的pNMHDR轉換為NMTVGETINFOTIP指針類型
HTREEITEM hRoot = m_webTree.GetRootItem(); // 獲取樹的根節(jié)點
CString strText; // 每個樹節(jié)點的提示信息
if (pTVTipInfo->hItem == hRoot)
{
// 如果鼠標劃過的節(jié)點是根節(jié)點,則提示信息為空
strText = _T("");
}
else
{
// 如果鼠標劃過的節(jié)點不是根節(jié)點,則將該節(jié)點的附加32位數據格式化為字符串
strText.Format(_T("%d"), pTVTipInfo->lParam);
}
// 將strText字符串拷貝到pTVTipInfo結構體變量的pszText成員中,這樣就能顯示內容為strText的提示信息
wcscpy(pTVTipInfo->pszText, strText);
}
8. 運行程序,彈出結果對話框。效果如下圖:
樹形控件的知識就講到這里了,相比之前的控件可能稍有復雜。不過用的多了,就會覺得得心應手了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持我們。
上一篇:C++ 賦值構造函數注意點介紹
欄 目:C語言
本文標題:VS2010/MFC編程(常用控件:樹形控件Tree Control控件創(chuàng)建h和實例)
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/1875.html
您可能感興趣的文章
- 01-10深入理解C/C++混合編程
- 01-10深入sizeof的使用詳解
- 01-10在vs2010中,輸出當前文件路徑與源文件當前行號的解決方法
- 01-10C語言編程時常犯十八個錯誤小結
- 01-10linux c多線程編程實例代碼
- 01-10c語言socket多線程編程限制客戶端連接數
- 01-10C語言socket編程開發(fā)應用示例
- 01-10三種獲取網頁源碼的方法(使用MFC/Socket實現)
- 01-10c語言網絡編程-標準步驟(改進版)
- 01-10c語言網絡編程-標準步驟(比較簡單)


閱讀排行
本欄相關
- 04-02c語言函數調用后清空內存 c語言調用
- 04-02func函數+在C語言 func函數在c語言中
- 04-02c語言的正則匹配函數 c語言正則表達
- 04-02c語言用函數寫分段 用c語言表示分段
- 04-02c語言中對數函數的表達式 c語言中對
- 04-02c語言編寫函數冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數 round c語言
- 04-02c語言分段函數怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數 c語言中怎
- 04-02c語言調用函數求fibo C語言調用函數求
隨機閱讀
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-11ajax實現頁面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05dedecms(織夢)副欄目數量限制代碼修改
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實例總結
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10使用C語言求解撲克牌的順子及n個骰子


