Comment savoir quand l’utilisateur clique sur une zone de case activée dans un contrôle TreeView

Cet article explique comment savoir quand l’utilisateur clique sur une zone de case activée dans un contrôle TreeView.

Version d’origine du produit : Visual C++
Numéro de la base de connaissances d’origine : 261289

Résumé

Sur un contrôle TreeView avec le style TVS_CHECKBOXES , il n’y a aucune notification indiquant que l’état vérifié de l’élément a été modifié. Aucune notification n’indique également que l’état de l’élément a changé. Toutefois, vous pouvez déterminer que l’utilisateur a cliqué sur l’icône d’état de l’élément et agir sur ce point.

Comment TreeView bascule l’état de la zone case activée

Lorsque l’utilisateur clique sur la zone de case activée d’un élément TreeView, une NM_CLICK notification est envoyée à la fenêtre parente. Lorsqu’il se produit, le TVM_HITTEST message retourne TVHT_ONITEMSTATEICON. Le contrôle TreeView utilise cette même condition pour activer/désactiver l’état de la zone case activée. Malheureusement, le contrôle TreeView bascule l’état après l’envoi de la NM_CLICK notification.

Exemple de code à savoir quand les utilisateurs cliquent sur une zone de case activée

Vous pouvez publier un message défini par l’utilisateur dans la même fenêtre que celle qui traite la NM_CLICK notification et traiter ce message défini par l’utilisateur comme une notification indiquant que l’état vérifié a changé. L’exemple de code suivant illustre la façon dont il peut être accompli.

#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