Gewusst wie, wenn der Benutzer in einem TreeView-Steuerelement auf ein Kontrollkästchen klickt

In diesem Artikel wird beschrieben, wie Sie wissen, wann der Benutzer in einem TreeView-Steuerelement auf ein Kontrollkästchen klickt.

Ursprüngliche Produktversion: Visual C++
Ursprüngliche KB-Nummer: 261289

Zusammenfassung

In einem TreeView-Steuerelement mit der TVS_CHECKBOXES-Formatvorlage gibt es keine Benachrichtigung, dass der aktivierte Zustand des Elements geändert wurde. Es gibt auch keine Benachrichtigung, die angibt, dass sich der Status des Elements geändert hat. Sie können jedoch feststellen, dass der Benutzer auf das Statussymbol des Elements geklickt hat, und darauf reagieren.

So schaltet TreeView den Zustand des Kontrollkästchens um

Wenn der Benutzer auf das Kontrollkästchen eines TreeView-Elements klickt, wird eine NM_CLICK Benachrichtigung an das übergeordnete Fenster gesendet. Wenn sie auftritt, gibt die TVM_HITTEST Meldung zurück TVHT_ONITEMSTATEICON. Das TreeView-Steuerelement verwendet dieselbe Bedingung, um den Zustand des Kontrollkästchens umzuschalten. Leider schaltet das TreeView-Steuerelement den Zustand um, nachdem die NM_CLICK Benachrichtigung gesendet wurde.

Beispielcode, um zu wissen, wann Benutzer auf ein Kontrollkästchen klicken

Sie können eine benutzerdefinierte Nachricht im selben Fenster posten, in dem die NM_CLICK Benachrichtigung verarbeitet wird, und diese benutzerdefinierte Nachricht als Benachrichtigung behandeln, dass sich der aktivierte Zustand geändert hat. Der folgende Beispielcode veranschaulicht, wie dies erreicht werden kann.

#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