Come sapere quando l'utente fa clic su una casella di controllo in un controllo TreeView

Questo articolo descrive come sapere quando l'utente fa clic su una casella di controllo in un controllo TreeView.

Versione originale del prodotto: Visual C++
Numero KB originale: 261289

Riepilogo

In un controllo TreeView con lo stile TVS_CHECKBOXES non viene visualizzata alcuna notifica che indica che lo stato selezionato dell'elemento è stato modificato. Non è inoltre disponibile alcuna notifica che indica che lo stato dell'elemento è stato modificato. Tuttavia, è possibile determinare che l'utente ha fatto clic sull'icona di stato dell'elemento e agire su questo.

Come TreeView attiva o disattiva lo stato della casella di controllo

Quando l'utente fa clic sulla casella di controllo di un elemento TreeView, viene inviata una NM_CLICK notifica alla finestra padre. Quando si verifica, il TVM_HITTEST messaggio restituisce TVHT_ONITEMSTATEICON. Il controllo TreeView usa questa stessa condizione per attivare o disattivare lo stato della casella di controllo. Sfortunatamente, il controllo TreeView attiva o disattiva lo stato dopo l'invio della NM_CLICK notifica.

Codice di esempio per sapere quando gli utenti fa clic su una casella di controllo

È possibile pubblicare un messaggio definito dall'utente nella stessa finestra che sta elaborando la NM_CLICK notifica e considerare questo messaggio definito dall'utente come una notifica che indica che lo stato selezionato è stato modificato. Il codice di esempio seguente illustra come può essere realizzato.

#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