Gewusst wie, wenn der Benutzer auf ein Kontrollkästchen in einem TreeView-Steuerelement klickt
In diesem Artikel wird beschrieben, wie Sie wissen, wann der Benutzer auf ein Kontrollkästchen in einem TreeView-Steuerelement klickt.
Originalversion des Produkts: Visual C++
Ursprüngliche KB-Nummer: 261289
Zusammenfassung
Bei einem TreeView-Steuerelement mit der TVS_CHECKBOXES-Formatvorlage gibt es keine Benachrichtigung, dass der überprüfte 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 Status 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 Nachricht 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, der erkennt, wenn Benutzer auf ein Kontrollkästchen klicken
Sie können eine benutzerdefinierte Nachricht in demselben Fenster posten, in dem die NM_CLICK Benachrichtigung verarbeitet wird, und diese benutzerdefinierte Nachricht als Benachrichtigung behandeln, dass sich der überprüfte 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