VC++ CTreeCtrl 使用NM_CLICK和TVN_SELCHANGED

时间:2023-03-09 00:23:57
VC++  CTreeCtrl 使用NM_CLICK和TVN_SELCHANGED
//这是当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 = ;
}

在这里需要指出 HitTest 函数不但可以检测出是否在item上 也可以检测出 位于 item项的 哪个位置请看 MSDN的说明

Value Meaning
TVHT_ABOVE

Above the client area.

TVHT_BELOW

Below the client area.

TVHT_NOWHERE

In the client area, but below the last item.

TVHT_ONITEM

On the bitmap or label associated with an item.

TVHT_ONITEMBUTTON

On the button associated with an item.

TVHT_ONITEMICON

On the bitmap associated with an item.

TVHT_ONITEMINDENT

In the indentation associated with an item.

TVHT_ONITEMLABEL

On the label (string) associated with an item.

TVHT_ONITEMRIGHT

In the area to the right of an item.

TVHT_ONITEMSTATEICON

On the state icon for a tree-view item that is in a user-defined state.

TVHT_TOLEFT

To the left of the client area.

TVHT_TORIGHT

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 = ;
}

下面是关于 选项改变时的函数

//这是当控件的选择发生变化时的处理函数
void CDriverSelCtrl::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
{ LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
pNMTreeView->itemNew //选中HTREEITEM
pNMTreeView->itemOld //上次选中HTREEITEM
// TODO: 在此添加控件通知处理程序代码
*pResult = ;
}