CListCtrl::HitTest で、マウスポインタがどのアイテム上に存在するかを判断したく、
LVHT_ONITEM を引数に渡してアイテム番号を取得したのですが…
デバッグしてみると、リストアイテム上にマウスカーソルが存在する状態で、ヘッダコントロールにカーソルを移動すると、ヘッダコントロール上でアイテム番号0 として返答されてしまいます。
リストアイテム上にマウスカーソルがない状態(リストの外)から、ヘッダコントロールにカーソルを移動した場合は、期待値どおり -1(対象アイテムなし) で返答されます。
とりあえずは、ヘッダコントロールの矩形(CRect)を取得して、マウスカーソルがその矩形内にある場合は、対象アイテムなし、と判断してみましたが、
何かほかに良い方法はありますでしょうか?
// マウスカーソル位置のリストアイテムを検索
CPoint ptCursorPos = (CPoint)GetMessagePos();
ScreenToClient(&ptCursorPos);
UINT uiFlag = LVHT_ONITEM;
int nNowOverItem = HitTest(ptCursorPos, &uiFlag);
BOOL bFuncExec = FALSE;// 処理実行フラグ
if (nNowOverItem != -1)//マウスカーソルがアイテム上にある…
{
// ヘッダコントロール上にマウスカーソルがあるかもしれないのでチェック
CRect rcHeader;
GetHeaderCtrl()->GetClientRect(&rcHeader);
if (ptCursorPos.y < rcHeader.bottom)
{
// マウスカーソルがヘッダコントロール上にあるので処理回避
bFuncExec = FALSE;
}
else
{
bFuncExec = TRUE;
}
}
else//マウスカーソルがアイテム上にない…
{
bFuncExec = FALSE;
}
CListCtrl::HitTestの第二引数は、条件を入力するためのものではなく、
結果を受け取るためのものです。
マウスカーソルがアイテム上にあるかどうかは、
(uiFlag & LVHT_ONITEM) != 0 で分岐しましょう
ツイート | ![]() |