次の方法で共有


ユーザーが TreeView コントロールのチェック ボックスをクリックしたときに確認する方法

この記事では、ユーザーが 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