リストのHitTestで、アイテム0とヘッダコントロールを判断するには?


イカ  2006-03-14 04:15:39  No: 60932

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


REE  2006-03-14 23:29:35  No: 60933

CListCtrl::HitTestの第二引数は、条件を入力するためのものではなく、
結果を受け取るためのものです。
マウスカーソルがアイテム上にあるかどうかは、
(uiFlag & LVHT_ONITEM) != 0 で分岐しましょう


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加