//這是當CTREECTRL控件點擊時NM_CLICK的處理函數
void CDriverSelCtrl::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult) { CPoint curPoint; UINT nFlags; HTREEITEM hItem; GetCursorPos(&curPoint); //當前點坐標 ScreenToClient(&curPoint); //屏幕坐標轉換為TREE內坐標 hItem = HitTest(curPoint, &nFlags); //坐標是否有ITEM if (hItem && (TVHT_ONITEM & nFlags)) //判斷是否有HTREEITEM { this->SelectItem(hItem);//在這里處理點擊后的結果 }
// TODO: 在此添加控件通知處理程序代碼 *pResult = 0; }
在這里需要指出 HitTest 函數不但可以檢測出是否在item上 也可以檢測出 位於 item項的 哪個位置請看 MSDN的說明
Value | Meaning |
---|---|
|
Above the client area. |
|
Below the client area. |
|
In the client area, but below the last item. |
|
On the bitmap or label associated with an item. |
|
On the button associated with an item. |
|
On the bitmap associated with an item. |
|
In the indentation associated with an item. |
|
On the label (string) associated with an item. |
|
In the area to the right of an item. |
|
On the state icon for a tree-view item that is in a user-defined state. |
|
To the left of the client area. |
|
To the right of the client area. |
由此可以更加靈活的使用的CTREECTL控件了
例如下面 例子:
void CDriverSelCtrl::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult) { CPoint point; UINT uFlag; BOOL bCheck; GetCursorPos(&point); CTreeCtrl::ScreenToClient(&point); HTREEITEM hTree = CTreeCtrl::HitTest(point, &uFlag); if (hTree && (TVHT_ONITEMSTATEICON & uFlag)) { CTreeCtrl::SelectItem(hTree); bCheck = CTreeCtrl::GetCheck(hTree); } // TODO: 在此添加控件通知處理程序代碼 *pResult = 0; }
下面是關於 選項改變時的函數
//這是當控件的選擇發生變化時的處理函數 void CDriverSelCtrl::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); pNMTreeView->itemNew //選中HTREEITEM pNMTreeView->itemOld //上次選中HTREEITEM // TODO: 在此添加控件通知處理程序代碼 *pResult = 0; }