Cómo saber cuándo el usuario hace clic en una casilla de verificación en un control TreeView

En este artículo se describe cómo saber cuándo el usuario hace clic en una casilla de verificación en un control TreeView.

Versión original del producto: Visual C++
Número de KB original: 261289

Resumen

En un control TreeView con el estilo TVS_CHECKBOXES , no hay ninguna notificación de que se haya cambiado el estado comprobado del elemento. Tampoco hay ninguna notificación que indique que el estado del elemento ha cambiado. Sin embargo, puede determinar que el usuario ha hecho clic en el icono de estado del elemento y actuar sobre ello.

Cómo TreeView alterna el estado de la casilla

Cuando el usuario hace clic en la casilla de verificación de un elemento TreeView, se envía una NM_CLICK notificación a la ventana primaria. Cuando se produce, el TVM_HITTEST mensaje devuelve TVHT_ONITEMSTATEICON. El control TreeView usa esta misma condición para alternar el estado de la casilla. Desafortunadamente, el control TreeView alterna el estado después de enviar la NM_CLICK notificación.

Código de ejemplo para saber cuándo los usuarios hacen clic en una casilla

Puede publicar un mensaje definido por el usuario en la misma ventana que procesa la NM_CLICK notificación y tratar este mensaje definido por el usuario como una notificación de que el estado comprobado ha cambiado. En el código de ejemplo siguiente se muestra cómo se puede realizar.

#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