Tab Control mit Treeview

fish-guts

Erfahrenes Mitglied
Moin

Ich brauch mal Hilfe :(

Ich möchte anhand einer Treeview eine Tabcontrol im Dialog machen. Also Links eine Treevew, und je nach dem worauf man klickt erscheint rechts etwas anderes. Ich blick da nicht durch, wie ich das überhaupt anstellen soll. Wer kann helfen?

Danke Gruss FG


P.S. Hier noch etwas Code:

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;
} 
 
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));
SetDlgItemText(IDC_ROOT,str);
GetDlgItem(IDC_ROOT)->SetState(
}
*pResult = 0;
pNMHDR=NULL;
}
 
Moin

Das Problem ist, dass ich keine Ahnung habe, wie ich es hinbringen soll, dass ich quasi verschiedene Dialoge in einem Hab. Also z.B. folgendermassen:

Wenn ich auf "Stammdaten" (im Tree) klicke, sollen Box A, Button B, Edit C und Radio D zum vorschein kommen.

Wenn ich auf etwas anderes klicke soll was anderes kommen. Wie ein Tabcontrol, aber eben mit Tree.

Gruss FG
 
Man kann einfach beim Ändern der Selektion die entsprechenden Controls ein- und ausblenden ( mit meinControl.ShowWindow( SW_SHOW ) usw. ).

Tatsächliche Child-Dialoge im Dialog habe ich auch schon gemacht, aber das ist ewig her. Dazu kann Endurion wahrscheinlich mehr sagen.

Ansonsten schau dir mal CPropertyPage an. Vielleicht hilft dir das weiter.
 
Ich schon wieder.

Du kannst die zusammengehörenden Control-Gruppen in einem eigenen Dialog erstellen. Den Dialog mit den Eigenschaften WM_CHILD (Untergeordnet, sch***-*Übersetzer) und am besten ohne Rahmen versehen.

Jetzt brauchst du beim Umschalten nicht mehr alle Controls einzeln anzeigen/verstecken, sondern nur den jeweiligen Dialog.

Wenn der Sub-Dialog erstellt wird, als Parent natürlich deinen View angeben. Durch den Child-Stil sieht das dann so aus, als ob die Controls auf dem Dialog direkt im View liegen würden (und die funktionieren auch so).
 
Moin

Danke soweit habs icn verstanden. Um das aber umsetzen zu können, sollte ich noch folgendes wissen: Wie kriege ich raus, welchen CWnd* Wert mein Parent Window hat? ich kann ja ned einfach den IDD_Name nehmen, da dieser ja ein integer ist... Wie geht das?

Gruss FG
 
Moin

Ich glaube du hast mich falsch verstanden. *g*

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

Das ist der Konstruktor meines Child Windows. Und ich muss nun wissen, wie ich pParent definieren muss. Mit GetParent geht das ja nicht, weil er mir dann den Pointer auf das Hauptfenster der Applikation liefert...

Gruss FG
 
Hm? Das setzt du einfach einen Pointer auf deinen Dialog rein, der die Childdialoge enthalten soll. Wenn dein Dialog MeinDialog heisst, ist der Pointer &MeinDialog. Oder, einfacher noch: this! ;)
 
Moin

Yu, dass weiss ich auch schon :)

Aber woher weiss der Compiler, worauf der Pointer zeigt?

Code:
class CNewFileRoot : public CDialog // Child Dialog
{
public:
CNewFileRoot(CWnd* pParent = &m_Dialog);

Hab jetzt hier den Pointer "&m_Dialog" reingesetzt.

Mein Parent ist jetzt aba n anderer Dialog:

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

Hab jetzt hier versucht, mittel CWnd* m_Dialog; was zu basteln, und das Header im Header zu includen, was an sich ja schon ein verbrechen ist.

aba ned...

Wo muss ich den Pointer definieren und wie?

Gruss FG
 

Neue Beiträge

Zurück