Checkbox im CTreeView



  • Hallo Leute,

    ich habe da immernoch ein Problem, wie ich in einem CTreeView auf die Checkboxes reagieren kann.

    Wenn ich auf OnClick reagiere, nimmt er mir ja jeden Klick.

    Ich möcht, das wenn der User auf ein Übergeordnete Checkbox klickt, alle Child Aktiviert oder nicht Aktiviert sind.

    HAt da mir jemand ein Beispiel ??

    Gruß
    andy_mann



  • Ruf in OnClick die Funktion HitTestauf, und prüfe, ob das Flag TVHT_ONITEMSTATEICON in der Struktur TVHITTESTINFO gesetzt ist. Dann weißt du, dass in die Checkbox geklickt wurde, und du kannst den Status des angeklickten Eintrages abfragen und dessen Childs entsprechend anpassen.



  • void CMyTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
    {
    UINT uFlags=0;
    HTREEITEM hItem = HitTest(point,&uFlags);

    if (uFlags & TVHT_ONITEM) CDOCloseDlg::instance->onTreeItem(hItem);
    }



  • Vielen Dank,

    Er reagiert mir jetzt aber trotzdem immer noch ein Klick im Tree.

    Ich weis nicht genau wohin mit

    // TVHT_ONITEMSTATEICON in der Struktur TVHITTESTINFO

    void CAuswahlDialog::OnNMClickListe2(NMHDR *pNMHDR, LRESULT *pResult)
    {
             DWORD dw = GetMessagePos();                   
    	CPoint point(GET_X_LPARAM(dw), GET_Y_LPARAM(dw)); 
    	m_TreeListe.ScreenToClient(&point);
    
    	UINT uFlags=0; 
    	hPermanent = m_TreeListe.HitTest(point,&uFlags); 
    
    	if((hPermanent != NULL) && (TVHT_ONITEM & uFlags))
    	{ 
                      // Macht was.....
    		AfxMessageBox("Hallo");
    	}
    *pResult = 0;
    }
    

    Gruß
    andy_mann



  • CTreeCtrl hat noch eine andere HitTest-Funktion:

    HTREEITEM HitTest( TVHITTESTINFO* pHitTestInfo);

    Aber mit deiner HitTest-Funktion müsste es auch gehen:

    Probier' mal
    [cpp]
    if((hPermanent != NULL) && (uFlags & (TVHT_ONITEM | TVHT_ONITEMSTATEICON)))[/cpp]



  • MMMhhhhhh,

    danke Dir, aber leider kein Unterschied.
    Er springt immer in die IF anweisung, egal wo ich drauf klicke....

    Gruß
    andy_mann



  • naja, evtl sind die koordinaten nicht so ganz optimal

    machmal in deine treectrl klasse nen onLDown

    bei mir gehts so nämlich ganz gut



  • Sorry mein Fehler!

    Der Abschnitt

    uFlags & (TVHT_ONITEM | TVHT_ONITEMSTATEICON)
    

    fragt, nur ab, ob eines der beiden Flags gesetzt ist,
    wir sind aber an beiden interessiert, also:

    UINT checkflags = TVHT_ONITEM | TVHT_ONITEMSTATEICON;
    
    if((hPermanent != NULL) && ((TVHT_ONITEM & checkflags) == checkflags))
    ...
    


  • Vielen Dank....

    Gruß
    andy_mann



  • Hallo,

    jetzt habe ich aber noch einmal eine Frage,

    wie oben beschrieben funkt das ganz ziemlich gut.

    Jetzt habe ich alledings unter einem Item immer die selbe Struktur.

    Item1
    |_Alles
    |_Gruppen
    Item2
    |_Alles
    |_Gruppen

    Jetzt muß ich natürlich wissen, ob er auf alles Item1 oder Item2 gedrückt hat.

    Mit meiner Funktion krige ich nur immer beide...

    // In der .h
    
    std::vector<HTREEITEM> m_hItem;
    std::vector<HTREEITEM> m_hItemAlles;
    std::vector<HTREEITEM> m_hItemGruppe;
    
    void CStatistik::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    
    	DWORD dw = GetMessagePos();                   // retrieve mouse cursor position when msg was sent
    	CPoint p(GET_X_LPARAM(dw), GET_Y_LPARAM(dw)); // ..and put into point structure
    	m_Tree.ScreenToClient(&p);                    // make coords local to tree client area
    
    	UINT htFlags = 0;
    	HTREEITEM it = m_Tree.HitTest(p, &htFlags);   // See where the click was on
    
    	if (it != NULL && ( htFlags & TVHT_ONITEMSTATEICON))
    	{  
    		for(unsigned i = 0; i < m_hItem.size(); i++)
    		{
    			if(m_Tree.GetItemText(it) == m_Tree.GetItemText(m_hItem[i]))
    			{
                                   // macht was.....
    			}
    			if(m_Tree.GetItemText(it) == m_Tree.GetItemText(m_hItemAlles[i]))
    			{
                                   // macht was.....
    			}
    			if(m_Tree.GetItemText(it) == m_Tree.GetItemText(m_hItemGruppe[i]))
    			{
                                   // macht was.....
    			}
    		}
    	}
    
    	*pResult = 0;
    }
    

    Kann mir da jemand weiter Helfen ??
    Ich weiß zwar warum er immer auf beide reagiert, finde aber keine Lösung.

    Gruß
    andy_mann



  • Ich glaub das hier könnte dir weiterhelfen:
    http://www.cherea.de/bitbucket/checktree/checktree.html



  • Hallo,

    vielen Dank, für eure Tips, die Seite kannte ich schon, habe auch ein paar Sachen daraus nehmen können.

    Habs zwar nicht ganz so hin bekommen wie ich wollte, funktionieren tut es aber.

    Gruß
    andy_mann


Anmelden zum Antworten