この記事では、ユーザーが TreeView コントロールのチェック ボックスをクリックしたときに知る方法について説明します。
元の製品バージョン: Visual C++
元の KB 番号: 261289
まとめ
TVS_CHECKBOXES スタイルの TreeView コントロールでは、項目のチェックされた状態が変更されたことを示す通知はありません。 また、アイテムの状態が変更されたことを示す通知もありません。 ただし、ユーザーがアイテムの状態アイコンをクリックし、それに基づいて操作したと判断できます。
TreeView でチェック ボックスの状態を切り替える方法
ユーザーが TreeView 項目のチェック ボックスをクリックすると、 NM_CLICK
通知が親ウィンドウに送信されます。 発生すると、 TVM_HITTEST
メッセージは TVHT_ONITEMSTATEICON
を返します。 TreeView コントロールは、この同じ条件を使用して、チェック ボックスの状態を切り替えます。 残念ながら、TreeView コントロールは、 NM_CLICK
通知が送信された後の状態を切り替えます。
ユーザーがチェック ボックスをクリックしたときに知るサンプル コード
ユーザー定義メッセージを、 NM_CLICK
通知を処理しているのと同じウィンドウに投稿し、このユーザー定義メッセージを、チェックされた状態が変更されたことを示す通知として扱うことができます。 次のサンプル コードは、その実現方法を示しています。
#define UM_CHECKSTATECHANGE (WM_USER + 100)
case WM_NOTIFY:
{
LPNMHDR lpnmh = (LPNMHDR) lParam;
TVHITTESTINFO ht = {0};
if(lpnmh->code == NM_CLICK) && (lpnmh->idFrom == IDC_MYTREE))
{
DWORD dwpos = GetMessagePos();
// include <windowsx.h> and <windows.h> header files
ht.pt.x = GET_X_LPARAM(dwpos);
ht.pt.y = GET_Y_LPARAM(dwpos);
MapWindowPoints(HWND_DESKTOP, lpnmh->hwndFrom, &ht.pt, 1);
TreeView_HitTest(lpnmh->hwndFrom, &ht);
if(TVHT_ONITEMSTATEICON & ht.flags)
{
PostMessage(hWnd, UM_CHECKSTATECHANGE, 0, (LPARAM)ht.hItem);
}
}
}
break;
case UM_CHECKSTATECHANGE:
{
HTREEITEM hItemChanged = (HTREEITEM)lParam;
/*
Retrieve the new checked state of the item and handle the notification.
*/
}
break