vtreev

dwStyle中可以使用以下一些樹形控件的專用風格:

TVS_HASLINES 在父/子結點之間繪製連線

TVS_LINESATROOT 在根/子結點之間繪製連線

TVS_HASBUTTONS 在每一個結點前添加一個按鈕,用於表示當前結點是否已被展開

TVS_EDITLABELS 結點的顯示字符可以被編輯

TVS_SHOWSELALWAYS 在失去焦點時也顯示當前選中的結點

TVS_DISABLEDRAGDROP 不允許Drag/Drop

TVS_NOTOOLTIPS 不使用ToolTip顯示結點的顯示字符

在樹形控件中每一個結點都有一個句柄(HTREEITEM),同時添加結點時必須提供的參數是該結點的父結點句柄,利用

HTREEITEM InsertItem( LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST );

可以添加一個結點,pszItem爲顯示的字符,hParent代表父結點的句柄,當前添加的結點會排在hInsertAfter表示的結點的後面,返回值爲當前創建的結點的句柄

 

dwStyle中可以使用以下一些樹形控件的專用風格:

TVS_HASLINES 在父/子結點之間繪製連線

TVS_LINESATROOT 在根/子結點之間繪製連線

TVS_HASBUTTONS 在每一個結點前添加一個按鈕,用於表示當前結點是否已被展開
////////////////////////////////
void CClientDlg::OnNMRClickUserTree(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: Add your control notification handler code here
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; 
POINT point;
GetCursorPos(&point);   
//把顯示器座標轉換爲客戶區座標,一定要是tree控件的句柄.主要用來測試用戶有沒有選中某項.
     ::ScreenToClient(pNMTreeView->hdr.hwndFrom,&point);
UINT   uFlags;   
uFlags=TVHT_ONITEM;   
HTREEITEM   hItem   =   m_UserTree.HitTest(point,   &uFlags);

CMenu menu;

int nID;
//就像上圖一樣,我只想當用戶選中walking時纔會有效,選中在線用戶也沒有用.m_hRoot在我的程序裏就是保存在線用戶的樹.
if   ((hItem   !=   NULL)   &&   (TVHT_ONITEM   &   uFlags)&&(hItem!=m_hRoot))   
{         
m_UserTree.Select(hItem,   TVGN_CARET);   
menu.LoadMenu(IDR_FILE_TRANSFER);
//控制彈出菜單的位置,要用到和上面相反的函數.
::ClientToScreen(pNMTreeView->hdr.hwndFrom,&point);
CMenu* pContextMenu = menu.GetSubMenu(0);
nID = pContextMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RETURNCMD,
point.x, point.y,this);
}   
//下面就是你具體要做的事了,根據菜單項來具體安排.
        switch (nID)
        {
          ......
          }

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