Ansatz Probleme - 4fach geteiltes fenster


  • Mod

    Fehler 1:
    Nicht in CMainFRame::PreCreateWindow sondern in CMainFrame OnCreate oder OnCreateClient!

    Fehler 2:
    Warum machst Du aus allem jetzt Splitter?
    Du hast doch geschrieben das das pobere und untere Fenster fest steht und das mittlere ein Splitter sein soll.
    Und das ist ein einziges CSplitter in dem die entsprechenden Views als Panes angezeigt werden. Warum hast Du drei?

    Fehler 3:
    Das Middle Window ist doch ein Spiltter und nicht wieder ein Frame!



  • Nun mal kurz fuer dumme

    ich brauch also 3 fenster

    oben ein normales
    unten ein normales
    und in der mitte ein splitter fenster

    daher nun die frage:

    wie erstelle ich diese, und wie positionier ich diese?


  • Mod

    Du leitest die entsprechenden Fenster oben und unten von CWnd oder CView ab, was Dir besser passt.
    In OnCreate/OnCreateClient kannst Du alles erzeugen.
    In OnSize positionierst Du die Fenster an die entsprechende Stelle.



  • Aaaaaaaaaaaaaah, jetzt hatts klick gemacht,
    Ich erstell den splitter zwar ueber das ganze fenster, aber in OnSize stauche ich es auf die mitte {=

    hab das nu so:

    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    {
    	BOOL bolReturn = TRUE;
    
    	m_wndTopWindow.Create(NULL, _T(""), WS_CHILD|WS_VISIBLE, CRect(0, 0, 0, 0), this, 1, NULL);
    	m_wndBottomWindow.Create(NULL, _T(""), WS_CHILD|WS_VISIBLE, CRect(0, 0, 0, 0), this, 1, NULL);
    
    	SIZE size;
    	size.cx = 250;
    	size.cy = 0;
    
    	m_wndSplitterLeft.CreateStatic(this, 1, 2);
    	m_wndSplitterLeft.CreateView(0, 0, RUNTIME_CLASS(CLeft1View), size, pContext);
    	m_wndSplitterMiddle.CreateStatic(&m_wndSplitterLeft, 1, 2, WS_CHILD|WS_VISIBLE|WS_BORDER, m_wndSplitterLeft.IdFromRowCol(0, 1));
    
    	m_wndSplitterMiddle.CreateView(0, 0, RUNTIME_CLASS(CLeft2View), size, pContext);
    	m_wndSplitterRight.CreateStatic(&m_wndSplitterMiddle, 1, 2, WS_CHILD|WS_VISIBLE|WS_BORDER, m_wndSplitterMiddle.IdFromRowCol(0, 1));
    
    	m_wndSplitterRight.CreateView(0, 0, RUNTIME_CLASS(CRight1View), size, pContext);
    	m_wndSplitterRight.CreateView(0, 1, RUNTIME_CLASS(CRight2View), CSize(0, 0), pContext);
    
    	/*m_wndSplitter.CreateStatic(this, 1, 4);
    	m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeft1View), CSize(250, 0), pContext);
    	m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CLeft2View), CSize(250, 0), pContext);
    	m_wndSplitter.CreateView(0, 3, RUNTIME_CLASS(CRight1View), CSize(250, 0), pContext);
    	m_wndSplitter.CreateView(0, 4, RUNTIME_CLASS(CRight2View), CSize(0, 0), pContext);*/
    
    	return CFrameWnd::OnCreateClient(lpcs, pContext);
    }
    
    void CMainFrame::OnSize(UINT nType, int cx, int cy)
    {
    	CFrameWnd::OnSize(nType, cx, cy);
    
    	m_wndTopWindow.MoveWindow(0, 0, cx, 100);
    	m_wndBottomWindow.MoveWindow(0, cy-100, cx, 82);
    	m_wndSplitterLeft.MoveWindow(0, 100, cx, cy-200);
    }
    

    wie du aber siehst habe ich noch drei splitter die die mitte in 4 teile teilen,
    du sagtest ich brauche nur einen splitter, das habe ich versucht, siehe das aus kommentierte
    das problem ist, das funktioniert so nicht,
    ich dachte auch das ein splitter immer nur 2 reihen und 2 spalten haben kann

    //dazu edit
    einfache CWnd fenster oben und unten hinzufuegen klappt wunderbar, aber noch geile waere wenn ich oben und unten ein dialog hinzufuegen koennte, das hab ich bisher noch nicht hinbekommen


  • Mod

    Bitte erkläre mir für was Du drei Spliter benötigst. Ichhabe es doch mehrfach geschrieben.
    Du benötigst EIN EINZIGES Splitter Window mit 1 Zeile und 4 Spalten.



  • Das hatte ich gelesen und versucht, wie du meinen letzten Beitrag evtl. entnehmen kannst.
    Allerdings habe ich Idiot vorhin erst gemerkt das ich Tippfehler drin hatte, daher funktionierte das nicht -> wie blöd!

    Nun geht alles vorzüglich.

    Ich bedanke mich bei dir für deine Geduld!


  • Mod

    Dann kann ich ja erleichtert aufatmen... 🤡



  • Noch nicht ganz, aber evtl. ist diese Frage schneller beantwortet, da ich mittlerweile schon mehr verstanden habe von den Splittern.

    Nur so als kleine Rand-Information, diese Konstrukte sind nicht für mich und ich weiß nicht wofür diese gebraucht werden.

    Dieses habe ich nun erfolgreich erstellt:

    |-----------------------|
    |                       |
    |-----|-----|-----|-----|
    |     |     |     |     |
    |     |     |     |     |
    |     |     |     |     |
    |     |     |     |     |
    |     |     |     |     |
    |-----|-----|-----|-----|
    |                       |
    |-----------------------|
    

    Oben und unten zwei statische CWnd Fenster, und in der Mitte ein Splitter mit 4 Reihen.

    Nun soll ich ein weiteres machen welches so aussieht:

    |-----------------------|
    |                       |
    |-----------|-----------|
    |           |           |
    |-----|-----|-----|-----|
    |     |     |     |     |
    |     |     |     |     |
    |     |     |     |     |
    |-----|-----|-----|-----|
    |           |           |
    |-----------|-----------|
    |                       |
    |-----------------------|
    

    Mein Ansatz währe:
    Oben und unten wieder zwei statische CWnd Fenster.
    Ein Splitter in der Mitte.
    Rechts und links jeweils ein Splitter der etwas kleiner ist und den mittleren Splitter als parent hat.
    Und jeweils darüber und darunter wieder ein kleines Statisches Fenster.

    Meine ersten Versuche dahingehen verliefen nicht erfolgreich, immer nur Knallts beim ausführen und ich weiß nicht woran es lag.

    Daher die frage, kann ich das so überhaupt machen?
    Wenn ja, wie bzw. wann kann ich die kleineren statischen Fenster resizen?


  • Mod

    |-----------------------|
    | Window oben           |
    |-----------|-----------|
    | 1-1-1     | 1-1-2     |
    |-----|-----|-----|-----|
    |     |     |     |     |
    |2-1-1|2-1-2|3-1-1|3-1-2|
    |     |     |     |     |
    |-----|-----|-----|-----|
    | 1-3-1     | 1-3-1     |
    |-----------|-----------|
    | Window unten          |
    |-----------------------|
    

    Du brauchst 3 Splitter.
    Die erste Ziffer gibt die Nummer des Controls an, die zweite die Zeile im Splitter die dritte die Spalte.

    Es gibt noch mehr Kombinationen.
    In den jeweiligen Zellen des SPlitters erzeugt man was man eben will CStatic oder sonst was.



  • Ah, ich verstehe, Sieht auf den ersten blick sehr schön aus 🙂
    Da gibt’s aber ein kleines Problem

    1-1-1, 1-1-2, 1-3-1 und 1-3-1 dürfen nicht in der Höhe veränderbar sein, Lediglich seitlich durch den Mittleren Splitter.

    Also im ganzen Frame existiert nichts was in der Höhe veränderbar ist, immer nur seitlich.


  • Mod

    Dann musst Du diese Einheiten einfach inein Fenster setzen. Solch eine Einheit besteht aus CStatic oben CStatic unten und in der Mitte ein CSplitterWnd mit 2-Spalten.

    Das Main-Fenster hat ja die selbe Aufteilung, auch hier könntest Du ein Fenster verwenden und dieses dort hinein erzeugen. Wie man sieht ist das geschachtelt zweimal das selbe Design.



  • Nur das ich das Richtig verstehe
    Du meinst, das ganze Fenster ist Ein CWnd Fenster, und der Mittlere Splitter verdeckt halt die mitte,
    Der Linke Splitter besteht oben ein CWnd Fenster, unten einer und dort in der Mitte wieder ein Splitter?

    |-----------------------|
    |        CWnd BG        |
    |-----------|-----------|
    | CWnd LO   | CWnd RO   |
    |-----|-----|-----|-----|
    |     |     |     |     |
    |S2 1 |S2 2 |S3 1 |S3 2 |
    |     |     |     |     |
    |-----|-----|-----|-----|
    | CWnd LU   | CWnd RU   |
    |-----------|-----------|
    |        CWnd BG        |
    |-----------------------|
    

    Was du mit CStatic meinst weiß ich gerade aber nicht gerade.


  • Mod

    Irgendwei reden wir aneinander vorbei

    Bei ein Grundfenster das so aussieht

    |-----------|
    | OBEN      |
    |-----|-----|
    |     |     |
    |S1   |S2   |
    |     |     |
    |-----|-----|
    | UNTEN     |
    |-----------|
    

    Wenn dieses Fenster funktioniert. Platzierst Du die selbe Klasse wieder in S1 und S2. Es entsteht Dein gewünschtes Bild.



  • Versteh ich nicht,
    Du sagtest doch dass die CSplitterWnd ein FrameWnd brauchen.

    Ich erstelle in der MainFrm so:

    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    {
        BOOL bolReturn = TRUE;
    
        // zwei CWnd fenster
        m_wndTopWindow.Create(NULL, _T(""), WS_CHILD|WS_VISIBLE, CRect(0, 0, 0, 0), this, 1, NULL);
        m_wndBottomWindow.Create(NULL, _T(""), WS_CHILD|WS_VISIBLE, CRect(0, 0, 0, 0), this, 1, NULL);
    
        m_wndSplitter.CreateStatic(this, 1, 2);
        m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeft), CSize(250, 0), pContext);
        m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRight), CSize(250, 0), pContext);
    
        return CFrameWnd::OnCreateClient(lpcs, pContext);
    }
    

    Dann hab ich oben und unten je ein Fenster des CWnd, und in der Mitte ein Zweiteiliges CSplitterWnd
    CLeft und CRight sind CFormView Klassen, ein CWnd würde auch gehen, aber wie bekomm ich dasselbe Konstrukt auf die linke Splitter-Seite?
    Das ist mein Problem.



  • So, Ich habe jetzt gerade wieder etwas zeit umd über dieses Problem nach zu denken.
    Was ich demnächst versuchen will ist.

    Oben ein CWnd Fenster
    Unten ein CWnd Fenster
    In der Mitte ein Zweiteiliger Splitter.
    Die linke seite hat ein oben und unten ein CWnd Fenster mit der Linken Splitter-Seite als Parent.
    Und in der Mitte wieder ein Zweiteiliger Splitter welcher ebenfalls die Linke Splitter-Seite als Parent hat.
    Die selbe Geschichte auf der Rechten Seite.

    Ich weiß nicht ob das so funktioniert, ich werde es einfach mal probieren.



  • ne, funktioniert ueberhaupt nicht - ich bekomm das kontrukt nicht in die linke seite, und ich hab ueberhaupt keine ahnung wie ich da ansetzen muss

    //dazu edit

    ich habe gerade mal gefragt, es macht nichts wenn es links und rechts oben und unten auch dynamisch in der hoehe ist, dh ich mach es so wie du es am anfang vorgeschlagen hattest, das kann ich wenigstens bereits #gg


  • Mod

    Ein Splitter kann auch in einem Splitter leben. Splitter können genestet werden. Die Hauptsache ist dass alle diese Fenster wieder in einem Frame liegen.



  • ja das hab ich ja auch, das problem war jetzt nur die rechten und linken oberen und unteren statischen fenster, diese bekomm ich nicht hin



  • mal die herangehensweise was ich probiert habe

    ich hab das konstrukt im MainFrm

    zwei CWnd fenster welche ich oben und unten positionieren
    und ein zweiteiliges splitter welcher in der mitte sitzt
    in OnSize stauche ich den splitter auf die mitte und passe die beiden fenster entsprechend an

    so

    nu brauch ich das selbe nochmal auf der linken seite
    ich habe zuerst probiert wieder zwei CWnd fenster zu benutzen, diese kann ich aber nicht erstellen mit dem linken splitter teil als parent
    also muss ich zb CFormView nehmen, aber diesen kann ich nicht mit "Create" erstellen - dh ich nehm die CFormView und erstelle diese als normales splitterfenster, dann geht es auf die ganze linke seite

    nu das problem, diese FormView auf der linken seite kann ich nicht in der groesse begrenzen, hab da gar kein einfluss
    lediglich auf einen splitter haette ich einfluss, aber auch dort wird die groesse wieder auf die ganze hoehe gestellt sobald ich den mittleren splitter bewege

    wie dem auch sei, ich habe es nicht geschafft eine splitter seite in 3 teile zu teilen wovon der obere und untere in der hoehe fest ist, nur mit nem veschiebbaren splitter gehts problemlos



  • gerade eben hatte ich ein geistesblitz

    mein gedanke bisher war immer das ich oben und unten ein CWnd fenster haben wollte und diesen dann positionieren und den splitter kleiner mache
    da fiel mir grad ein
    warum nicht in "CStaticSplitterWnd" wo ich die mausbewegungen abfange - dann kann cih alles schoen mit splittern einteilen

    erste tests wahren sehr geil, kann dann schoen verschachteln usw - geil {=


Anmelden zum Antworten