MFC中如何在TreeCtrl控件中获取鼠标左键消息时的有效点击位置
MFC中,当在TreeCtrl控件中添加鼠标左键消息时,就意味着,凡是在该控件中点击左键后即会响应鼠标左键的消息,可有时我们只想记下有效的鼠标左键点击的事件,如图所示:
只想在CheckBox中点击鼠标左键时,将已选中的Item的句柄存入到链表中,那么如何只将有效的鼠标左键的消息存入链表中呢?
下面是响应鼠标左键消息时从所有鼠标左键消息都响应到只响应有效的左键消息的三个版本:
当响应鼠标左键的消息时,第一个版本:
获取鼠标的点击位置(注意:此时获取的是针对于当前屏幕的鼠标点击位置,所以需要将其转换为针对于当前控件的坐标点),然后根据坐标点获取当前鼠标点击时的句柄;
第二个版本:
也是先获取鼠标的点击位置,::MapWindowPoints将其转换为针对于当前控件的位置,根据位置获取句柄,通过if(TVHT_ONITEMSTATEICON & ht.flags)确认数遍左键的响应位置是否在CheckBox中,如果在的话添加入链表,如果不在,则不添加;
第三个版本:
在第二个版本上添加了if (this->GetCheck(ht.hItem) == FALSE),是为了防止鼠标左键点击两次复选框时响应了两次事件,添加到链表时添加了两次,当第一次在CheckBox上点击时,此时程序中的默认是未选中,所以在false时可以添加入链表,当再次点击相同位置时,由于此时该CheckBox选项已经变为true了,所以不会添加入链表中。
void CMyTreeCtrl::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
/*LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
HTREEITEM hCheckItem=pNMTreeView->itemNew.hItem;*/
//-------------------------第一个版本--------------------------------
//CPoint point;
//GetCursorPos(&point);
//ScreenToClient(&point);//获取当前客户区的鼠标点击位置
//HTREEITEM hItem=this->HitTest(point);//获取客户区指定坐标点的句柄
//-------------------------第一个版本--------------------------------
//-------------------------第二个版本--------------------------------
//TVHITTESTINFO ht = {0};
//DWORD dwpos = GetMessagePos();
//ht.pt.x = GET_X_LPARAM(dwpos);
//ht.pt.y = GET_Y_LPARAM(dwpos);
//::MapWindowPoints(HWND_DESKTOP, pNMHDR->hwndFrom, &ht.pt, 1);
//TreeView_HitTest(pNMHDR->hwndFrom, &ht);
//if(TVHT_ONITEMSTATEICON & ht.flags)
//{
// CString t_strTest = this->GetItemText(ht.hItem);
// m_lst.push_back(ht.hItem);
//}
//-------------------------第二个版本--------------------------------
//-------------------------第三个版本--------------------------------
TVHITTESTINFO ht = {0};
DWORD dwpos = GetMessagePos();
ht.pt.x = GET_X_LPARAM(dwpos);
ht.pt.y = GET_Y_LPARAM(dwpos);
::MapWindowPoints(HWND_DESKTOP, pNMHDR->hwndFrom, &ht.pt, 1);
TreeView_HitTest(pNMHDR->hwndFrom, &ht);
if(TVHT_ONITEMSTATEICON & ht.flags)
{
if (this->GetCheck(ht.hItem) == FALSE)
{
CString t_strTest = this->GetItemText(ht.hItem);
m_lst.push_back(ht.hItem);
}
}
//-------------------------第三个版本--------------------------------
*pResult = 0;
}