1、引言
HitTest為命中測試的意思。在使用MFC編寫程序的時候,在樹形視圖以及列表視圖中通常會涉及到需要獲得鼠標當前位置所對應的元素。這種通過光標坐標位置來獲得相應元素項的操作我們稱之為命中測試。
在樹形視圖中使用HTREEITEM類型變量來表示視圖中的元素項,而在列表視圖中可以直接使用整型變量的編號來表示列表視圖中對應的元素項。通過調用HitTest()方法,並為其傳遞一個CPoint位置變量即可獲得相應的元素項。
2、獲得鼠標光標位置
使用API函數::GetMessagePos()可以獲得當前光標的坐標信息,具體操作代碼如下:
DWORDdwPos = ::GetMessagePos(); //獲得包含坐標信息的DWORD類型值
CPointpt(LOWORD(dwPos), HIWORD(dwPos)); //將坐標值轉換為CPoint類型
ScreenToClient(&pt); //將屏幕坐標轉換為窗口客戶區坐標
::GetMessagePos()函數會返回一個4字節DWORD類型的值,該值中低二個字節包含了光標所在屏幕中x坐標值,高兩個字節包含了屏幕中y坐標值。通過LOWORD()和HIWORD()宏即可提取低二字節和高二字節值。因為樹形視圖和列表視圖控件中命中測試使用的是客戶區坐標,所以還需要使用ScreenToClient()函數進行轉換。
3、樹形視圖命中測試
在樹形視圖中可以直接調用HitTest()方法實現命中測試。HitTest()方法會返回一個HTREEITEM類型變量,用來表示當前光標位置處所對應的元素。實現代碼如下所示:
DWORDdwPos = ::GetMessagePos();
CPointpt(LOWORD(dwPos), HIWORD(dwPos));
ScreenToClient(&pt); //得到樹形視圖客戶區坐標
HTREEITEMhSelItem = GetTreeCtrl().HitTest(pt); //獲得當前坐標位置對應的樹形視圖元素
if(hSelItem != NULL)
{
//命中測試成功
}
如果HitTest()方法返回NULL,則表示當前光標位置坐標處沒有相對應的樹形視圖元素。
4、列表視圖命中測試
在列表視圖中也有對應的HitTest()方法,不同的是:列表視圖中HitTest()方法返回的是一個整型變量值用來表示列表視圖中對應的元素。實現代碼如下所示:
DWORDdwPos = ::GetMessagePos();
CPointpt(LOWORD(dwPos), HIWORD(dwPos));
ScreenToClient(&pt);
if(GetListCtrl().HitTest(pt) != -1)
{
//命中測試成功
}
在列表視圖中如果HitTest()方法返回-1,則表示當前光標位置坐標處沒有相對應的列表視圖元素。