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