Tab Control mit Treeview

Die Childdialoge werden doch wohl vom übergeordneten Dialog erzeugt, oder? Also kann dieser in der entsprechden Methode einfach
this verwenden, was der Pointer auf ihn selbst ist.
 
zum Bleistift. Oder:

CNewFileRoot Root( this );

Deine ChildDialoge kannst du allerdings nicht mit DoModal einsetzen, Modale Dialoge sind da nicht geeignet. Verwende dafür CreateDialog. Wenn du einen anderen Child-Dialog einsetzt, musst du dann den alten zerstören (DestroyWindow, Close tut's auch).

Zu deinem Beispiel grade eben noch:
Nach DoModal ist der Dialog weg, das SetParent sollte also wenn, dann vor dem DoModal-Aufruf stehen.
 
Muss ich dann auch das Hauptfenster zerstören? Und wo finde ich die genaue Sytax für CreateDialog? Ist das in der CWnd Klasse? Ich kenne eben nur DoModal :(
 
Zuletzt bearbeitet:
Moin

Entweder bin ich blöd oder stoned, aber ich peil das nicht. Am besten ich geb euch schnell den ganzen Code:

PHP:
class CNewFile : public CDialog
{
public:
 CNewFile(CWnd* pParent = NULL); 
 //{{AFX_DATA(CNewFile)
 enum { IDD = IDD_NEWFILE };
 CButton m_RootData;
 CTreeCtrl m_TreeCtrl;
 //}}AFX_DATA

Das war das Fenster mit der View. Es wird durch das Hauptfenster des Applikation Erzeugt.

Nun Das Child, was ich irgendwie Rechts neben der Treeview in diesen ersten Dialog reinpflanzen will:

PHP:
class CNewFileRoot : public CDialog
{
public:
 CNewFileRoot(CWnd* pParent = NULL);

Und ich habe nun keine Ahnung, wie ich pParent anders als "NULL" definieren kann.

Gruss FG
 
Folgendes:


Code:
class CNewFile : public CDialog
{
// Construction
public:
CNewFile(CWnd* pParent = NULL); // standard constructor
//{{AFX_DATA(CNewFile)
enum { IDD = IDD_NEWFILE };
CButton m_RootData;
CTreeCtrl m_TreeCtrl;
//}}AFX_DATA
 
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CNewFile)
protected:
virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected: 
// Generated message map functions
//{{AFX_MSG(CNewFile)
virtual BOOL OnInitDialog();
afx_msg void OnSelchangedFileList(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
Das ist ein Dialog mit Treeview, den ich öffne. Links hat er eine Treeview, Rechts gar nichts. Rechts will ich nun einen zweiten Dialog implementieren. Das Header File für den zweiten Dialog sieht folgendermassen aus:

Code:
class CNewFileRoot : public CDialog // Das ist ein Chil Window
{
// Construction
public:
CNewFileRoot(CWnd* pParent = NULL); // standard constructor
 
// Dialog Data
//{{AFX_DATA(CNewFileRoot)
enum { IDD = IDD_NEWFILEROOT };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA
 
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CNewFileRoot)
protected:
virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected: 
// Generated message map functions
//{{AFX_MSG(CNewFileRoot)
virtual BOOL OnInitDialog();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

So. Wie zu sehen ist, wird der Aufbau des Dialoges mit CNewFileRoot(CWnd* pParent = NULL); beschrieben. In diesem Falle ist die Haupt Applikation das Parent, das nützt mir aber nichts. Ich möchte, dass ich das hier im ersten Dialog einbauen kann. Dazu muss ich aber wissen, wie ich statt "pParent=NULL" einen Pointer definieren kann, der mir mein erstes Fenster als Parent deklariert.

Hiermit setze ich das Treezeug:

Code:
BOOL CNewFile::OnInitDialog() 
{
 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("Zusatzdaten"), 0, 0, 0, 0, 0, hClient, NULL);

 return FALSE;
 
}
Der Ansatz ist der, dass ich über die Tree zwischen einzelnen Child springen will. Aber dazu muss ich zuerst mal den zweiten Dialog einpflanzen können.

Gruss FG
 
Zuletzt bearbeitet:
An der Stelle, wo du in deinem Code auf das selchanged reagierst, setzt du das Folgende ein:

CNewFileRoot* pChildDialog = new CNewFileRoot();
pChildDialog->Create( CNewFileRoot::IDD, GetParent() );
pChildDialog->SetWindowPos( 0, 300, 0, 0,0, SWP_NOZORDER | SWP_NOSIZE );

eventuell muss noch ein

pChildDialog->ShowWindow( SW_SHOW ) da hin.


Jetzt sollte da der Child-Dialog eingesetzt und sichtbar sein. Für ein richtiges Wechseln musst du dir natürlich den gerade eingesetzten Dialog merken, und falls vorher schon einer da war, dieses entfernen (pChildDialog->DestroyWindow, delete pChildDialog). Das delete solltest du auf jeden Fall auch beim Beenden des Programmes aufrufen.


Zum Verständnis:

CNewFileRoot(CWnd* pParent = NULL);

definiert den Constructor von CNewFileRoot mit einem CWnd*-Parameter. Das = NULL bedeutet nicht, dass der Wert immer eingesetzt wird. Das wird er nur, wenn du nicht selbst einen Wert angibst. Du kannst also da durchaus selbst einen Wert übergeben.
 
Moin


Das ist sehr schön, danke. vielmals. Wie bringe es ich jetzt aber noch hin, dass mir der Dialog CNewFileRoot auch in den richtigen Dialog reingepflanz wird? Weil jetzt wird ins hauptfenster des Programms gesteckt...

Habs mit SetParent(this) versucht, ging aber nicht.

Gruss FG
 
Moin

Hat sich erledigt. :)

Vielen Vielen Dank :)

Ich habs nun so gemacht:

Code:
 pChildDialog->Create( CNewFileRoot::IDD );
 pChildDialog->SetParent(this);
 pChildDialog->SetWindowPos( 0, 300, 0, 0,0, SWP_NOZORDER | SWP_NOSIZE );
 pChildDialog->ShowWindow( SW_SHOW );

Das funktioniert. Vielen Dank :D
 

Neue Beiträge

Zurück