vs2010中CTreeView中准确响应鼠标左键单击的方法:
/********************************************************************************************
*函数: OnNMClick
*作用: 通过类向导添加的 NM_CLICK 消息的响应函数,响应鼠标单击消息
*参数: pNMHDR -- VS2010 添加,发送此通告的 Tree 控件的父句柄
pResult -- VS2010 添加,标记消息的已处理状态,不用修改
*返回值: 无
********************************************************************************************/
void CViewTree::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: Add your control notification handler code here
/************************** 通过识别控件中鼠标位置获取当前选择项 ***********************************/
// 获取当前选择的项
CTreeCtrl* pTreeCtrl = this;
CPoint ptCurSel(0,0);
TVHITTESTINFO HitTestInfo;
// 通过鼠标在客户区中的位置
GetCursorPos(&ptCurSel);
pTreeCtrl->ScreenToClient(&ptCurSel);
// 获取当前选择的是哪一项
HitTestInfo.pt = ptCurSel;
HTREEITEM hSelect = pTreeCtrl->HitTest(&HitTestInfo);
if(hSelect != NULL)
{
CString strItem = pTreeCtrl->GetItemText(hSelect);
::AfxMessageBox( strItem);
}
// 设置该项为选中状态
pTreeCtrl->SelectItem(hSelect);
/*********************************** END *********************************************/
/****************************以下方法获取的是上一次处于选中状态的项 ***************************
//首先将点击的对象选中
CTreeCtrl* pTreeCtrl = this;
HTREEITEM hSelect = pTreeCtrl->GetSelectedItem();
HTREEITEM hLight = pTreeCtrl->GetDropHilightItem();
if((hLight != NULL) && (hSelect != hLight)) ;
//hSelect = hLight;
if(hSelect == NULL)
return;
pTreeCtrl->SelectItem(hSelect);
//编辑当前选中对象名称
pTreeCtrl->EditLabel(hSelect);
if( NULL != hSelect )
{
CString strItem = pTreeCtrl->GetItemText(hSelect);
if(strItem == _T("控制器"))
{
pTreeCtrl->SetItemText(hSelect, _T("改变了控制器名称"));
}
pTreeCtrl->SetItemText(hSelect, strItem);
::AfxMessageBox( strItem);
}
*************************************END ********************************/
*pResult = 0;
}