Tab Control mit Treeview

Moin

Wie kann ich ein spezifisches Fenster schliessen?

Ich habs folgendermassen versucht:

CWnd* pWin = GetWindow(GW_CHILD);
pWind->DestroyWindow();

Nun schliesst der aber meine Treeview List. Wie kann ich das in einer neuen Funktion verhindern?

Also, resp. ich will, dass mein Child Window geschlossen wird. Hat jemand einen Rat, ob es einen CWnd Befehl gibt, der mir das gewünschte Chuld zurückgibt?

Gruss FG
 
Benutze das GetDlgItem-Member vom Parent mit der ID des gewünschten Fensters. Da bekommst du ein CWnd* auf das Fenster, welches du dann mit DestroyWindow schliessen kannst.
 
Moin

Ne so gehts nicht.

Ich muss wissen, wie ich mein CWnd* krieg, ohne dass ich vorher weiss, welchesw Child dass offen ist.

sind so verschiedene Dialog, die je nach Click in der Treeview aufgerufen werden sollen.

Und jedesmal, wenn ich woanders im Tree klick, soll das Child zerstört werden und das neue aufgerufen werden.

Wie kann ich also einen Pointer auf mein Child setzen, ohne dass ich genau definieren muss, welches Child angesprochen werden muss?

Gruss FG
 
Moin

In Klartext brauch ich was, womit folgendes funktioniert:

Code:
void CNewFile::OnSelchangedFileList(NMHDR* pNMHDR, LRESULT* pResult) 
{
 CTreeCtrl* pCtrl = (CTreeCtrl*) GetDlgItem(IDC_FILE_LIST);
 ASSERT(pCtrl != NULL);
 HTREEITEM hCurSel = pCtrl->GetNextItem(TVI_ROOT, TVGN_CARET);
 if (hCurSel == NULL)
   MessageBox(_T("There is no selected item"));
 else
 {
  CString str;
  str.Format(_T("%s"),
  (LPCTSTR) pCtrl->GetItemText(hCurSel));
  if(str == "Stammdaten")
  {
   CNewFileRoot* pChildDialog = new CNewFileRoot();
   pChildDialog->Create( CNewFileRoot::IDD );
   pChildDialog->SetParent(this);
   pChildDialog->SetWindowPos( 0, 121, 0, 0,0, SWP_NOZORDER | SWP_NOSIZE );
   pChildDialog->ShowWindow( SW_SHOW );
  }
  else if(str == "Zusatzdaten")
  {
   CNewFileRootAddition* pRootDialog = new CNewFileRootAddition();
   pRootDialog->Create( CNewFileRootAddition::IDD );
   pRootDialog->SetParent(this);
   pRootDialog->SetWindowPos( 0, 121, 0, 0,0, SWP_NOZORDER | SWP_NOSIZE );
   pRootDialog->ShowWindow( SW_SHOW );
  }
 }
 *pResult = 0;
 pNMHDR=NULL;
}
Wenn ich auf Stammdaten klicke, soll der Dialog "CNEWFILEROOT" erscheinen, wenn ich auf "Zusatzdaten" klicke, soll er mir das Child, welches gerade angezeigt wird, zurückgeben, damit ich dieses Zerstören kann. Wie mach ich das?

Gruss FG
 
Ich nehme mal stark an, dass deine Childs alle zumindest von CDialog oder CWnd abgeleitet sind. Du merkst dir beim Erstellen einfach nur einen CDialog oder CWnd Pointer, und rufst DestroyWindow damit auf:

Du hast als Member da, wo du's brauchen kannst einen CDialog* m_pCurrentChildDlg;
Beim Erstellen eines der beiden setzt du dann m_pCurrentChildDlg entweder auf pChildDialog oder pRootDialog. Wenn du dann das alte verwerfen willst, rufst du einfach m_pCurrentchildDlg->DestroyWindow auf.
 
Moin

Danke, darauf bin ich echt icht gekommen.

Habs nun im Header wie folgt definiert:
Code:
 CWnd* m_pCurrentChildDlg;

Und dann jeweils beim Aufruf so:

Code:
   CNewFileRoot* pChildDialog = new CNewFileRoot();
   m_pCurrentChildDlg=pChildDialog;

Nun kriege ich einen Debug Assertion Error. Was hab ich falsch gemacht?

Danke im Voraus.

Gruss FG
 
Wo bekommst du den die Assertation genau?
Prüfe for dem Schliessen von m_pCurrentChildDlg, ob das tatsächlich schon existiert. Kann sein, dass du beim ersten Wechsel einen Dialog schliessen willst, den es noch gar nicht gibt.
Vor allem, setze m_pcurrentChildDlg im Constructor auf NULL. Und prüfe dann vor DestroyWindow, ob m_pCurrentChildDlg ungleich NULL ist.
Wenn das die Assertation ist, sollte die dadurch weg sein.
 
Moin

Die Prüfung hab ich schon drin. Habs aber noch ergänzt... jetzt kriege ich aber n Reading Error, von wegen Speicher x verweist auf speicher an adresse y....

An was was das liegen?

Hier noch der Code als ganzes:

Code:
void CNewFile::OnSelchangedFileList(NMHDR* pNMHDR, LRESULT* pResult) 
{
 CTreeCtrl* pCtrl = (CTreeCtrl*) GetDlgItem(IDC_FILE_LIST);
 ASSERT(pCtrl != NULL);
 HTREEITEM hCurSel = pCtrl->GetNextItem(TVI_ROOT, TVGN_CARET);
 if (hCurSel == NULL)
   MessageBox(_T("Fehler"));
 else
 {
  CString str;
  str.Format(_T("%s"),
  (LPCTSTR) pCtrl->GetItemText(hCurSel));
  if(str == "Stammdaten")
  {
   if(m_pCurrentChildDlg)
   {
	m_pCurrentChildDlg->DestroyWindow();
   }
   CNewFileRoot* pChildDialog = new CNewFileRoot();
   ASSERT(m_pCurrentChildDlg!=NULL);
   m_pCurrentChildDlg=pChildDialog;
   pChildDialog->Create( CNewFileRoot::IDD );
   pChildDialog->SetParent(this);
   pChildDialog->SetWindowPos( 0, 121, 0, 0,0, SWP_NOZORDER | SWP_NOSIZE );
   pChildDialog->ShowWindow( SW_SHOW );
  }
  else if(str == "Zusatzdaten")
  {
   if(m_pCurrentChildDlg)
   {
	m_pCurrentChildDlg->DestroyWindow();
   }
   CNewFileRootAddition* pRootDialog = new CNewFileRootAddition();
   ASSERT(m_pCurrentChildDlg!=NULL);
   m_pCurrentChildDlg=pRootDialog;
   pRootDialog->Create( CNewFileRootAddition::IDD );
   pRootDialog->SetParent(this);
   pRootDialog->SetWindowPos( 0, 121, 0, 0,0, SWP_NOZORDER | SWP_NOSIZE );
   pRootDialog->ShowWindow( SW_SHOW );
  }
 }
 *pResult = 0;
 pNMHDR=NULL;
}
 
Hast du den m_pCurrentChildDlg im Constructor auf NULL gesetzt?
Im OnInitDialog bereits einen Child-Dialog direkt eingesetzt?

Das String-Text vom TreeItem holen, das klappt so? Das sieht echt schräg aus. Da geht doch direkt str = pTree->GetItemText( hItem );
 
Moin

Habs jetzt doch noch geschafft :)

Habs nun im initdialog gleich definiert, damit er das ding auch kennen kann, und nicht auf NULL gesetzt wird

Code:
BOOL CNewFile::OnInitDialog() 
{
 CNewFileRoot* pChildDialog = new CNewFileRoot();
 m_pCurrentChildDlg=pChildDialog;
 CTreeCtrl* pCtrl = (CTreeCtrl*) GetDlgItem(IDC_FILE_LIST);
 ASSERT(pCtrl != NULL);
 TV_INSERTSTRUCT tvinsert;
 tvinsert.hParent=NULL;
 tvinsert.hInsertAfter=TVI_LAST;
 tvinsert.item.mask=TVIF_TEXT;
 tvinsert.item.hItem=NULL;
 tvinsert.item.pszText="Stammdaten";
 HTREEITEM hRoot = pCtrl->InsertItem(&tvinsert);
 HTREEITEM hPlus = pCtrl->InsertItem(TVIF_TEXT,
 _T("Zusatzdaten"), 0, 0, 0, 0, 0, hRoot, NULL);
 tvinsert.item.pszText="Kunde" ;
 HTREEITEM hClient = pCtrl->InsertItem(&tvinsert);
 HTREEITEM hClientPlus = pCtrl->InsertItem(TVIF_TEXT,
 _T("Kunde Zusatzdaten"), 0, 0, 0, 0, 0, hClient, NULL);
 return FALSE;
 pChildDialog->Create( CNewFileRoot::IDD );
 pChildDialog->SetParent(this);
 pChildDialog->SetWindowPos( 0, 121, 0, 0,0, SWP_NOZORDER | SWP_NOSIZE );
 pChildDialog->ShowWindow( SW_SHOW );
}

void CNewFile::OnSelchangedFileList(NMHDR* pNMHDR, LRESULT* pResult) 
{
 CTreeCtrl* pCtrl = (CTreeCtrl*) GetDlgItem(IDC_FILE_LIST);
 ASSERT(pCtrl != NULL);
 HTREEITEM hCurSel = pCtrl->GetNextItem(TVI_ROOT, TVGN_CARET);
 if (hCurSel == NULL)
   MessageBox(_T("Fehler"));
 else
 {
  CString str;
  str = pCtrl->GetItemText( hCurSel );
  if(str == "Stammdaten")
  {
   m_pCurrentChildDlg->DestroyWindow();
   CNewFileRoot* pChildDialog = new CNewFileRoot();
   m_pCurrentChildDlg=pChildDialog;
   pChildDialog->Create( CNewFileRoot::IDD );
   pChildDialog->SetParent(this);
   pChildDialog->SetWindowPos( 0, 121, 0, 0,0, SWP_NOZORDER | SWP_NOSIZE );
   pChildDialog->ShowWindow( SW_SHOW );
  }
  else if(str == "Zusatzdaten")
  {
   if(m_pCurrentChildDlg)
   {
	m_pCurrentChildDlg->DestroyWindow();
   }
   CNewFileRootAddition* pRootDialog = new CNewFileRootAddition();
   m_pCurrentChildDlg=pRootDialog;
   pRootDialog->Create( CNewFileRootAddition::IDD );
   pRootDialog->SetParent(this);
   pRootDialog->SetWindowPos( 0, 121, 0, 0,0, SWP_NOZORDER | SWP_NOSIZE );
   pRootDialog->ShowWindow( SW_SHOW );
  }
 }
 *pResult = 0;
 pNMHDR=NULL;
}

Vielen Dank für die Hilfe Endurion :)))

Gruss FG
 

Neue Beiträge

Zurück