Name eines markierten Items einer CTreeView Ansicht auslesen



  • hoi!

    Ich habe folgendes Problem:
    Ich hab eine Ansicht die von CTreeView abgeleitet ist (SDI) und ich möchte den Namen des Items auslesen, das gerade markiert ist, hab aber keine ahnung wie. MSDN hilft mir auch nicht weiter...

    btw: gibt es die möglichkeit dass ein Pop-Up-Menu kommt wenn man mit rechts auf ein Item klickt? wenn ja, wie realisiert man das?

    vielen dank im voraus

    mfg, NiHiL



  • Servus,

    meinst du den Inhalt des gewählten Items anzeigen?

    Dann gibs doch zwei Sachen die dir helfen:
    1. GetItemText()
    2. GetSelectedItem()

    Bsp.:

    void CDeinDlg::OnTvnSelchangedTreeData(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    	CString strItemText = m_ctrTreeData.GetItemText(m_ctrTreeData.GetSelectedItem());
    
    	*pResult = 0;
    }
    

    m_ctrTreeData ist eine MemberVar von deinem TreeControl.

    Ich hoffe ich konnte dir weiterhelfen.

    *winke*
    Hellsgore



  • danke erstmal für deine schnelle und hilfreiche antwort!

    ich hab ein wenig an dem code geändert:

    CString CLeftView::OnTvnSelchangedTreeData(NMHDR *pNMHDR, LRESULT *pResult)
    {
        LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
        CString strItemText = GetTreeCtrl().GetItemText(GetTreeCtrl().GetSelectedItem());
    
        *pResult = 0;
    
    	return strItemText;
    
    }
    

    ich bin mir aber nicht sicher ob das was ich gemacht habe schwachsinn ist oder nicht.

    wie rufe ich die funktion jetzt in einer anderen klasse auf??

    mfg, NiHiL



  • Servus,

    Weiss ich ja nicht ob die Schwachsinn ist *g*.

    Die Funktion schreibt dir jetzt bei jedem selektieren, eines Items in deinem Control, dessen Bezeichnung in die Variable.

    Nur eine Idee:
    Du rufst im Prinzip nicht diese Funktion auf, sondern übergibst der anderen Klasse den Zeiger des Controls. Damit kannste dann auf das selektierte Item zugreifen.

    Bsp.:

    void CDeinDlg::OnButtonMachFunktion()
    {
     CTreeCtrl *pTree = (CTreeCtrl*)GetDlgItem(IDS_DEINTREE);
     // ODER
     CTreeCtrl *pTree = (CTreeCtrl*)FromHandle(m_ctrDeineCtrlMemberVarvonTree.m_hWnd);
    
     CNeueKlasse *pNeu = new CNeueKlasse();
     pNeu->m_pZeigervonTree = pTree;
     pNeu->FrissDieKatzeundMachWas();
    
    }
    
    //EDIT: Ich schreibs noch dazu
    void CNeueKlasse::FrissDieKatzeundMachWas()
    {
     CString strTest = m_pZeigervonTree->GetItemText(m_pZeigervonTree->GetSelectedItem());
    }
    }
    

    In deiner Klasse CNeueKlasse haste du die Membervariable m_pZeigervonTree vom Typ CTreeCtrl*.

    Ich hoffe ich konnte dir weiterhelfen.

    *winke*
    Hellsgore



  • danke!

    ich hab aber noch eine frage, und zwar: was bringt sich das:

    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    

    ?? und welche pointer muss ich der funktion übergeben??

    mfg, NiHiL



  • ich habe jetzt folgendes gemacht:

    void CLeftView::SelectedName(NMHDR *pNMHDR, LRESULT *pResult)
    {
        LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
        m_SelectedName = GetTreeCtrl().GetItemText(GetTreeCtrl().GetSelectedItem());
    
        *pResult = 0;
    }
    

    m_SelectedName ist eine Membervar vom CString der Klasse CLeftView

    jetzt habe ich das problem dass GetTreeCtrl().GetItemText(GetTreeCtrl().GetSelectedItem()); keinen wert in m_SelectedName schreibt! wenn ich versuche die Funktion aus einer anderen Funktion aufzurufen ( pLeftView->SelectedName(NULL,NULL); ), dann geht es zwar zum kompilieren, stürzt mir aber ab wenn ich den Button drücke. ich hab es auch schon ohne die parameter NMHDR *pNMHDR und LRESULT *pResult probiert, aber das funktioniert genausowenig. muss ich die funktion irgendwo in der klasse CLeftView (die klasse meines trees) aufrufen? wenn ja wo?

    viele dank im voraus

    mfg, NiHiL



  • hat sich erledigt, hab nicht gewusst dass ich eine nachrichtenbehandlung für TVN_SELCHANGED einfügen muss.
    danke nochmal


Anmelden zum Antworten