ユーザーが 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