Como saber quando o usuário clica em uma caixa de marcar em um controle TreeView

Este artigo descreve como saber quando o usuário clica em uma caixa de marcar em um controle TreeView.

Versão original do produto: Visual C++
Número de KB original: 261289

Resumo

Em um controle TreeView com o estilo TVS_CHECKBOXES , não há notificação de que o estado verificado do item foi alterado. Também não há nenhuma notificação que indique que o estado do item tenha sido alterado. No entanto, você pode determinar que o usuário clicou no ícone de estado do item e agirá sobre isso.

Como o TreeView alterna o estado da caixa marcar

Quando o usuário clica na caixa marcar de um item do TreeView, uma NM_CLICK notificação é enviada para a janela pai. Quando ocorre, a TVM_HITTEST mensagem retorna TVHT_ONITEMSTATEICON. O controle TreeView usa essa mesma condição para alternar o estado da caixa marcar. Infelizmente, o controle TreeView alterna o estado depois que a NM_CLICK notificação é enviada.

Código de exemplo para saber quando os usuários clicam em uma caixa de marcar

Você pode postar uma mensagem definida pelo usuário na mesma janela que está processando a NM_CLICK notificação e tratar essa mensagem definida pelo usuário como uma notificação de que o estado verificado foi alterado. O código de exemplo a seguir ilustra como ele pode ser realizado.

#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