Feststellen ob die TreeCtrl expanidert ist



  • Hallo

    ich möchte festellen, ob der benutzer den Baum(TreeCtrl) weite geöffnet hat, sprich, in einen Ordner gegenagen ist.

    Wie mach ich das?!



  • Itemstate aller parents auf TVIS_EXPANDED abtesten



  • wie?! 😕 😞



  • Für jeden Item kannst du den State abfragen (TVM_GETITEMSTATE/GetItemState). Das TVIS_EXPANDED - bit zeigt an, ob der jeweilige item expandiert ist.

    Eigentlich müßtest Du also nur den Order-Item abtesten. Kann aber sein, daß zwar der Ordner expandiert, aber der Parent-ordner zusamengeklappt ist.

    beim expandieren bekommst Du außerdem TVN_ITEMEXPANDING / TVN_ITEMEXPANDED Notifications. vielleicht reicht Dir das ja auch.



  • kann mir jmd sagen, wo mein fehler liegt?!

    BEGIN_MESSAGE_MAP(CDlgBarExplorer, CDialog)
    	//{{AFX_MSG_MAP(CDlgBarExplorer)
    	ON_NOTIFY(TVN_SELCHANGED, IDC_EXPLORER_TREE, OnSelchangedExplorerTree)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // Behandlungsroutinen für Nachrichten CDlgBarExplorer 
    
    BOOL CDlgBarExplorer::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
    
    	TCHAR  szWorkDir[MAX_PATH];
    	_getcwd(szWorkDir, 256);
    
    	if(!m_ctrlTree.m_hWnd)
    	{
    		if (m_ctrlTree.SubclassDlgItem(IDC_EXPLORER_TREE, this))
    		{			
    			m_ctrlTree.DisplayTree(NULL, FALSE);
    
    			m_ctrlTree.SetSelPath(szWorkDir);
    		}
    	}
    
    	InitListDir(szWorkDir);
    
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zurückgeben
    }
    
    void CDlgBarExplorer::InitListDir(CString strPathName)
    {
    	LV_COLUMN column;
    
    	column.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
    	column.fmt = LVCFMT_LEFT;
    	column.cx = 100;
    	column.pszText = "Name";
    	column.iSubItem = 0;
    	m_ctrlList.InsertColumn(0, &column);
    	column.cx = 50;
    	column.pszText = "Datum";
    	column.iSubItem = 1;
    	m_ctrlList.InsertColumn(1, &column);
    }
    
    void CDlgBarExplorer::ChangeListDir(CString strPathName)
    {
    	int iItem, iActualItem;
    	char buf[256];
    	LV_ITEM item;
    	HANDLE handle;
    	WIN32_FIND_DATA fd;
    
    	iItem = 0;
    	item.iImage = 0;
    
    	CString strSearchSpec = strPathName + "*.*";
    
    	handle = ::FindFirstFile((LPCTSTR)strSearchSpec, &fd);
    
    	do
    	{
    		if(fd.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)
    		{
    			CString strFilename = (LPSTR)&fd.cFileName;
    			if((strFilename != ".") && (strFilename !=".."))
    			{
    				item.mask = LVIF_TEXT | LVIF_IMAGE;
    				item.iSubItem = 0;
    				item.iItem = iItem++;
    				item.pszText = (LPSTR)&fd.cFileName;
    				iActualItem = m_ctrlList.InsertItem(&item);
    				CTime cTime(*(&fd.ftCreationTime));
    				CString strTime = cTime.Format("%d.%m.%y");
    				sprintf(buf,"%s",strTime);
    				item.pszText = buf;
    				item.mask = LVIF_TEXT;
    				item.iItem = iActualItem;
    				item.iSubItem = 1;
    				m_ctrlList.SetItem(&item);
    			}
    		}
    	}
    	while(::FindNextFile(handle,&fd));
    	::FindClose(handle);
    }
    
    void CDlgBarExplorer::OnSelchangedExplorerTree(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    
    	ChangeListDir(m_ctrlTree.GetFullPath(pNMTreeView->itemNew.hItem));
    
    	UpdateData( FALSE );
    	*pResult = 0;
    }
    

    er öffnet die liste der dateien in der Listbox entweder sporatisch oder zu 90% zeigt er sie gar nicht erst an



  • was versuchst du eigentlich zu erreichen?
    Ähnliches Verhalten wie beim Explorer?



  • ich habe oben eine TRee Ctrl, was mit die festplatte wieder gibt. und wenn ich oben im Tree CTrl nen ordner ausgewählt habe, zeigt er mit den inhalt in der Listbox an.

    so zumindest sollte es funzen


Anmelden zum Antworten