ツリーコントロール上のチェックボックスをクリックした場合に、
下記関数がコールされるようにメッセージマップを割り当てております。
void CTestDlg::OnClick(NMHDR* pNMHDR, LRESULT* pResult)
{
NMTREEVIEW* pNMTree = (NMTREEVIEW*)pNMHDR;
TVHITTESTINFO stHitTest = {0};
// CListはCTreeCtrlを継承したサブクラス
CList* pList = (CList*)GetDlgItem(IDC_TREE_LIST);
// クリックされた位置の取得
stHitTest.pt = pNMTree->ptDrag;
HTREEITEM hCheckItem = pList->HitTest(&stHitTest);
// チェックボックスが設定された場合
if (stHitTest.flags & TVHT_ONITEMSTATEICON)
{
// hogehoge・・・・・・・・・・・・・・・・・①
}
*pResult = 0;
}
2つ以上のアイテムをツリーコントロールに追加し、チェックボックスをクリックする
と、
現在選択中のアイテムのチェックボックスをクリックした場合は、上記①に引っかかりま
すが、
非選択中のアイテムのチェックボックスをクリックした場合は、
「stHitTest.flags」が(TVHT_BELOW| TVHT_TORIGHT)の値になり、上記①に引っかかりま
せん。
この時、「stHitTest.pt」のx、yの値がとんでもない値になります。
(どのアイテムのチェックボックスをクリックしても、一律x:0x0012f660、y:
0x5abb940dになります。)
非選択中のアイテムのチェックボックスをクリックしても①に引っかかるようにしたいの
ですが、
上記関数のどこに問題がありますでしょうか?
ご教授願います。
OnClick で渡される NMHDR* を NMTREEVIEW* にキャストしてはなりません。
この場合、NMTREEVIEW にあって NMHDR にないメンバには何がはいっているかわかりませ
ん。
GetCursorPos でカーソル位置を取得する必要があるでしょう。
クライアント座標に変換するのをお忘れなく。
回答ありがとうございました。
GetCursorPosを使用してクライアント座標に変換することで解決できました。