사용자가 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