paar CTreeCtrl Probleme



  • Hallo, ich hab ein MDI Fenster mit einem Tree drin und paar Problemen
    1. Problem
    ich bekomm es nicht hin, dass es beim klick auf die Linke Maustaste was massiert. Habe es schon mit OnSelchanged und OnLButtonDown und paar anderen versucht. Es kommt auch kein Fehler, das Programm startet reagiert aber nicht auf die Linke Maustaste.

    BEGIN_MESSAGE_MAP(MyExplorer, CGuiControlBar)
    	ON_WM_LBUTTONDOWN()
    	ON_NOTIFY_REFLECT(NM_RCLICK, OnRClick)
    	ON_WM_CONTEXTMENU()
    	...
    END_MESSAGE_MAP()
    

    auf die rechte läuft es.

    2. Problem
    bei dem rechten Mausklick geht das Menü auf, es wird aber nicht das angeklickte Item ausgewählt sondern immer 2 Items tiefer also das dritte, wenn man den letzen und vorletzten anklickt, passiert nicht, woran liegt es, und wie kann ich es lösen)

    void MyExplorer::OnRClick(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	// Send WM_CONTEXTMENU to self
    	SendMessage(WM_CONTEXTMENU, (WPARAM) m_hWnd, GetMessagePos());
    	// Mark message as handled and suppress default handling
    	*pResult = 1;
    }
    
    void MyExplorer::OnContextMenu(CWnd* pWnd, CPoint ptMousePos) 
    {
    	// if Shift-F10
    	if (ptMousePos.x == -1 && ptMousePos.y == -1)
    		ptMousePos = (CPoint) GetMessagePos();
    
    	ScreenToClient(&ptMousePos);
    
    	UINT uFlags;
    	HTREEITEM htItem = m_TreeMyExplorer.HitTest( ptMousePos, &uFlags );
    
    	if( htItem == NULL )
    		return;
    
    	CString szItem = m_TreeMyExplorer.GetItemText(htItem); 
    	AfxMessageBox(szItem);
    ...
    }
    

    3. Problem
    ich kann bei mit den Text (Label) editieren, mache ich mit EditLabel, aber ich kann ich nach dem ich <Enter> gedrückt habe den neuen Namen vergeben?
    PreTranslateMessage ist drin und reagiert auch auf VK_RETURN, aber ich weiß nicht wie den neuen Namen auslesen soll?



  • braucht ihr mehr informationen?
    ich komm echt nicht weiter



  • Probier mal so was in der Art zum Testen:

    void C...Dlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    
    	HTREEITEM ht = m_TreeCtrl.GetSelectedItem();
    	//m_TreeCtrl.InsertItem("Element",0,0,ht,TVI_LAST);
    
    	TVITEM curItem;
    	curItem.mask= TVIF_HANDLE;
    	curItem.hItem= ht;
    	m_TreeCtrl.GetItem(&curItem);
    
    	curItem.mask= TVIF_STATE;
    	curItem.state= TVIS_EXPANDPARTIAL;
    	curItem.stateMask= TVIS_EXPANDPARTIAL;
    	m_TreeCtrl.SetItem(&curItem);
    
    	*pResult = 0;
    }
    


  • Die TreeItems gehen auf und zu, aber ich will beim Click mit der link Maustaste was öffnen, je nach dem welches Item angeklickt wurde.



  • ist das ein Dialog oder Frame?



  • Frame



  • Zu Problem Nr.2:

    So klappts zumindest bei mir ...

    void MyTreeView::OnRButtonDown(UINT nFlags, CPoint point)
    {
        TVHITTESTINFO hti;
        HWND hTree;
    
        CTreeView::OnRButtonDown(nFlags, point);
    
        point = (CPoint) GetMessagePos();
        ScreenToClient( &point );
       hti.pt.x = point.x;
       hti.pt.y = point.y;
    
       hTree = this->m_hWnd;
       HTREEITEM hItem = TreeView_HitTest( hTree, &hti );
    }
    

    funktioniert auch mit Dual-Monitor 😉


  • Mod

    Mr.Yellow schrieb:

    void MyTreeView::OnRButtonDown(UINT nFlags, CPoint point)
    {
        TVHITTESTINFO hti;
        HWND hTree;
    
        CTreeView::OnRButtonDown(nFlags, point);
    
    [i][b]    point = (CPoint) GetMessagePos();
        ScreenToClient( &point );
       hti.pt.x = point.x;
       hti.pt.y = point.y;
       
       hTree = this->m_hWnd;
       HTREEITEM hItem = TreeView_HitTest( hTree, &hti );[/b][/i]}
    

    Das ist Quark. Alles was Du hier in kursiv und fett siehst hat keine Wirkung!
    Das kannst Du greade mal vergessen. Genaugenommen kannst Du den gazen Handler vergessen, denn er tut nichts.


Anmelden zum Antworten