MFC 树形控件的使用
1、樹形控件的屬性
TVS_EDITLABELS:允許用戶進行節點文本的編輯
TVS_HASBUTTONS:節點左側添加一個按鈕
TVS_HASLINES:父節點與子結點出現連線
TVS_LINESATROOT:子節點與根節點之間出現連線
TVS_NOTOOLTIPS:結點無動態提示
TVS_SINGLEEXPAND:節點的選中(未選中)t7展開(合攏)同步
MFC中以兩種形式封裝樹形控件,一種是樹形控件CTreeCtrl,另一種是樹形視圖控件CTreeView。對于一般的要求,比如在對話框中,使用CTreeCtrl比較方便。在使用樹形視圖控件時,只需要利用成員函數取得其引用,就可以像樹形控件一樣方便的使用:
CTreeCtrl&?GetTreeCtrl(?)?const;
調用InsertItem函數能夠將節點插入樹形控件中,并返回插入的項的HTREEITEM。樹形控件的插入工作往往是在對話框的OnInitDialog函數中進行,而對于樹形視圖控件,則是在OnInitUpdate函數中進行。
樹形控件中的節點數據可以是文本,也可以是圖像。節點中使用的圖像是和樹形控件的圖像列表相對應的。在樹形控件中使用圖像列表是通過使用SetImageList函數來完成。
樹形控件能產生通告消息,如:
TVN_BEGINDRAG開始拖拽
TVN_ITEMEXPANDED節點被展開或收縮
其消息映射使用WM_NOTIFI,如:
WM_NOTIFI(TVN_BEGINDRAG,IDC_TREECTRL,OnBeginDrag);
2、樹形控件TVN_BEGINRDRAG消息的響應
與樹形控件有關的、常用的結構是TVITEM、TVINSERTSTRUCT?、NMTREEVIEW(NM_TREEVIEW?)。前兩個是用于插入節點時使用,而NMTREEVIEW是與樹形控件的通告消息相關的結構。
當用鼠標左鍵拖拽樹形控件時,控件會發出TVN_BEGINDRAG通告消息;當用鼠標右鍵拖拽時,則會發出TVN_BEGINRDRAG通告消息。拖拽樹形控件時需要使用到IImageList::BeginDrag函數:
IImageList::BeginDrag?creates?a?temporary?image?list?that?is?used?for?dragging.?In?response?to?subsequent?WM_MOUSEMOVE?messages,?you?can?move?the?drag?image?by?using?IImageList::DragMove.?To?end?the?drag?operation,?you?can?use?IImageList::EndDrag.?
通常使用CTreeCtrl::CreateDragImage函數創建一個被拖拽節點的圖像并返回一個CImageList指針(注意被拖拽的數據節點必須包含圖像,否則返回的CImageList指針為空),然后利用該指針來調用CImageList::BeginDrag函數。除此之外還需要調用CImageList::DragEnter函數鎖定、更新窗口,并在指定的位置顯示被拖拽的圖像:
static?BOOL?PASCAL?DragEnter(
???CWnd*?pWndLock,
???CPoint?point?
);
If?pWndLock?is?NULL,?this?function?draws?the?image?in?the?display?context?associated?with?the?desktop?window,?and?coordinates?are?relative?to?the?upper?left?corner?of?the?screen.
注意BeginDrag函數只是在拖拽開始時創建要拖拽的圖像,而DragEnter函數則顯示該圖像。
最后調用CWnd::SetCapture函數使后續所有的鼠標輸入都發送到當前的CWnd對象而不管鼠標的位置(因為CImageList::DragEnter函數的第一個參數為NULL時表示在與桌面窗口相關的窗口,可以說就是當前程序的框架窗口,但不包括其他應用程序的窗口上顯示被拖拽的圖像。因此要使得被拖拽的圖像在所有的窗口上而不僅僅是應用程序的框架窗口上顯示,就需要調用CWnd::SetCapture函數。一旦調用了SetCapture函數,則在當前應用程序的非框架窗口,包括系統菜單上的鼠標按鍵動作均被發送到當前CWnd?對象,直到調用ReleaseCapture為止)。
然后就是在鼠標移動的消息響應函數中調用CImageList::DragMove函數移動被拖拽的圖像,使之與鼠標的移動位置同步。最后是調用CImageList::DragShowNolock函數隱藏或顯示拖拽的圖像,但它并不是必須的,也可以不調用,因此之前已經調用過CImageList::DragEnter函數顯示拖拽的圖像了。當傳遞true值顯示拖拽的圖像時,DragShowNolock在這個過程中不像DragEnter函數一樣鎖定窗口。
值得注意的是,在拖拽節點過程中可以使用CTreeCtrl::HitTest函數判斷鼠標滑動過程中所經過的點是否位于樹形控件的某一個節點之上,如果是,則返回該樹形節點的HTREEITEM。此時可以使用CTreeCtrl::SelectDropTarget函數或CTreeCtrl::SelectItem函數來高亮顯示該節點。
3、樹形控件的成員函數
InsertItem函數插入一個節點,并返回新插入的節點的HTREEITEM。
ItemHasChildren函數根據給定的HTREEITEM判斷該節點是否存在子節點。
GetChildItem函數根據給定的HTREEITEM獲取該節點下子節點的HTREEITEM,如果沒有子節點,則返回NULL。
GetNextSiblingItem函數根據給定的HTREEITEM獲取該節點的下一個同級節點。
EnsureVisible函數在必要的時候滾動視圖列表控件使得其至少部分可見。需要注意的是,在使用TVE_COLLAPSE調用Expand收縮樹形控件后不能再調用該函數,否則收縮操作將無效。
總結
以上是生活随笔為你收集整理的MFC 树形控件的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 竞价推广和信息流推广是什么?区别在哪里?
- 下一篇: html 投票系统,投票系统 html页