Herausfinden welcher Ast aus TreeView angeklckt wurde



  • Hallo!

    Ich habe folgendes Problem:
    Ich habe ein TreeView ausgegeben und habe in der Message Schleife nur noch die hwnd des Gesammten TreeViews. Wenn man jetzt auf eine Verzweigung klickt, dann bekomm ich eine WM_NOTIFY, das funktioniert auch soweit:

    case WM_NOTIFY:
        switch(wParam){
            case Search_Tree:
                if ((UINT)((LPNMHDR)lParam)->code == (UINT)NM_DBLCLK){
                    //mach was
                    //klappt bei jedem Ast
                }
                break;
        }
        return 0;
    

    Leider weiß ich jetzt nicht wie ich an irgendeinen Anhalt komme welcher Ast angeklickt worden ist... Das mit der Message TVM_GETITEM versteh ich nicht und ich frag mich auch ob die das kann...

    Kann mir einer helfen und mir sagen wie ich jetzt an den angeklickten Ast komme?



  • Bei einer Auswahländerung wird eine WM_NOTIFY mit TVN_SELCHANGED verschickt. lParam kann dann auf eine NMTREEVIEW-Struktur gecastet werden, diese enthält den angeklickten Eintrag.

    Ansonsten bekommst Du mit TreeView_GetSelection jederzeit den aktuell gewählten Eintrag.



  • Ok danke erstmal, dass mit dem Makro TreeView_GetSelection hat mich auch bei der MSDN auf die dazugehörige Message TVM_GETNEXTITEM gebracht, das werd ich mal ausprobieren. Auf NextItem muss man auch erstmal kommen... Makro will ich persönlich nicht so gerne verwenden



  • So leider klappt da gar nix, weil mit dem TreeViewItem kann man nix machen, also hab ich laut Ratschlag in der MSDN noch GETITEM hinterhergeschickt, klappt leider nicht... 😢

    case WM_NOTIFY:
        switch(wParam){
            case Search_Tree:
                if ((UINT)((LPNMHDR)lParam)->code == (UINT)NM_DBLCLK){
    
                    HTREEITEM Item;
                    SendMessage(((LPNMHDR)lParam)->hwndFrom, TVM_GETNEXTITEM, TVGN_CARET, (LPARAM) (HTREEITEM)Item);
    
                    TVITEM tvi;
    
                    wchar_t Buffer1 [100];
    
                    tvi.hItem = Item;
                    tvi.mask = TVIF_TEXT;
                    tvi.pszText = Buffer1;
                    tvi.cchTextMax = 100;
    
                    SendMessage(((LPNMHDR)lParam)->hwndFrom, TVM_GETITEM, 0, (LPARAM) (LPTVITEM) &tvi);
    
                    MessageBox(hwnd, Buffer1, L"cap", MB_OK|MB_ICONWARNING);
    
                }
                break;
        }
        return 0;
    

    Dabei kommen nur kryptische Zeichen oder gar nichts raus



  • Makros haben manchmal auch den Vorteil, dass sie den Programmierer nicht mit überflüssigen Sachen belasten (z.B. Gedanken um Parameter und Rückgabewert). 😉



  • oha es funktioniert auch noch 😉

    Danke für die Hilfe...


Anmelden zum Antworten