Das entfernte Kontrollkästchen wird im Strukturansicht-Knoten wieder angezeigt, wenn die Leertaste gedrückt wird

Ich habe die akzeptierte Lösung verwendetvon dieser Frage zu entfernenKontrollkästchen von einemBaumansichtsknoten in meinemWM_INITDIALOG Handler.

Beim LadenBaum sieht gut aus. Nachdem ich den Knoten ausgewählt und auf die Stelle geklickt habe, woKontrollkästchen wäre, passiert nichts (Kontrollkästchen erscheint nicht), was das richtige Verhalten ist.

Wenn ich jedoch den Knoten auswähleund drücke Leertaste dasKontrollkästchen wird automatisch zum Knoten hinzugefügt.

Hier ist derWM_INITDIALOG Handler, der das Problem veranschaulicht:

case WM_INITDIALOG:
    {
        // get treeview handle

        HWND TreeView = GetDlgItem( hDlg, IDC_TREE1 );

        /************ enable checkboxes **************/

        DWORD dwStyle = GetWindowLong( TreeView , GWL_STYLE);
        dwStyle |= TVS_CHECKBOXES;
        SetWindowLongPtr( TreeView , GWL_STYLE, dwStyle );

        /************ add items and subitems **********/

        // add root item

        TVINSERTSTRUCT tvis = {0};

        tvis.item.mask = TVIF_TEXT;
        tvis.item.pszText = L"This is root item";
        tvis.hInsertAfter = TVI_LAST;
        tvis.hParent = TVI_ROOT;

        HTREEITEM hRootItem = reinterpret_cast<HTREEITEM>( SendMessage( TreeView ,
            TVM_INSERTITEM, 0, reinterpret_cast<LPARAM>( &tvis ) ) );

        // and here is an example of removing a checkbox 

        TVITEM tvi;
        tvi.hItem = hRootItem ;
        tvi.mask = TVIF_STATE;
        tvi.stateMask = TVIS_STATEIMAGEMASK;
        tvi.state = 0;
        TreeView_SetItem( TreeView, &tvi );

        // add firts subitem for the hTreeItem

        memset( &tvis, 0, sizeof(TVINSERTSTRUCT) );

        tvis.item.mask = TVIF_TEXT;
        tvis.item.pszText = L"This is first subitem";
        tvis.hInsertAfter = TVI_LAST;
        tvis.hParent = hRootItem;

        HTREEITEM hTreeSubItem1 = reinterpret_cast<HTREEITEM>( SendMessage( TreeView ,
            TVM_INSERTITEM, 0, reinterpret_cast<LPARAM>( &tvis ) ) );

        // now we insert second subitem for hRootItem

        memset( &tvis, 0, sizeof(TVINSERTSTRUCT) );

        tvis.item.mask = TVIF_TEXT | TVIF_STATE; // added extra flag
        tvis.item.pszText = L"This is second subitem";
        tvis.hInsertAfter = TVI_LAST;
        tvis.hParent = hRootItem;

        HTREEITEM hTreeSubItem2 = reinterpret_cast<HTREEITEM>( SendMessage( TreeView , 
            TVM_INSERTITEM, 0, reinterpret_cast<LPARAM>( &tvis ) ) );
    }
    return (INT_PTR)TRUE;  

Hier Interessantes Zitat aus MSDN:

Version 5.80. Zeigt ein Kontrollkästchen anauch wenn dem Artikel kein Bild zugeordnet ist.

Vielleicht ist das die Ursache meines Problems?

Ich habe versucht, damit umzugehenTVN_KEYDOWN und setze Items auf state oder wieder entferne dieKontrollkästchen hatte aber keinen erfolg.

EDIT # 2:

Ich habe den Baum, den Weg Mitglied untergeordnetJonathan Potter vorgeschlagen, und es hat funktioniert:

LRESULT CALLBACK TreeProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, 
    UINT_PTR uIdSubclass, DWORD_PTR dwRefData )
{
    switch (message)
    {
    case WM_KEYDOWN:
        {
            // reject spacebar if tree node doesn't have checkbox
            if( wParam == VK_SPACE ) 
            {
                HTREEITEM ht = TreeView_GetSelection( hwnd );

                TVITEM tvItem;

                // Prepare to receive the desired information.
                tvItem.mask = TVIF_HANDLE | TVIF_STATE;
                tvItem.hItem = (HTREEITEM)ht;
                tvItem.stateMask = TVIS_STATEIMAGEMASK;

                // Request the information.
                TreeView_GetItem( hwnd, &tvItem );

                // reject if it's not checked, or pass default value otherwise
                switch( tvItem.state >> 12 )
                {
                    case 0:
                        MessageBeep(0);
                        return FALSE;
                        break;
                    case 1:
                    case 2:
                    default:
                        return ::DefSubclassProc( hwnd, message, wParam, lParam );
                        break;
                }               
            }
        }
        break;
    case WM_NCDESTROY:
        ::RemoveWindowSubclass( hwnd, TreeProc, 0 );
        break;
    }
    return ::DefSubclassProc( hwnd, message, wParam, lParam);
}
ENDE DER BEARBEITUNGFRAGE:

Wie kann ich richtig entfernenKontrollkästchen von einemBaumknoten so erscheint es nie wieder ?

Danke.

Freundliche Grüße.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage