Ansatz Probleme - 4fach geteiltes fenster
-
Man muss in dem entsprechenden Pane des ersten Splitters wieder ein CSplitterWnd anlegen mit den entsprechenden neuen Panes.
Oder eben mit 2x2 Panes.Die grundsätzlcihe Technik wird in TN029 erklärt.
http://msdn2.microsoft.com/en-us/library/969ca366(VS.80).aspxEin Sample dazu findest Du hier (VIEWEX)
http://msdn2.microsoft.com/en-us/library/1d7781f1(VS.80).aspx
-
Danke,
Noch eine kleine Frage dazu.
Ich muss oben und unten ein bereich fest haben - also oben ein bereich quer der so bleibt und unten dasselbe,
d.h. die 4 Splitter sollen dann auch nur in der Mitte sein.Mein Gedanke war nun, ein leeres Hauptfenster - ein Dialog in der Mitte anzeigen lassen, und diesen Dialog dann 4fach teilen.
Kann man das so machen?
-
Vergiss dasmit dem Dialog mal ganz schenll. Ein CSplitterWnd muss IMHO in einem Frame gehostet werden. Also geh am besten von SDI aus.
Ansonsten einen CSplitterWnd erzeugen mit 3 Zeilen.
Im mittleren Splitter einen Splitter erzeugen mit 4 Spalten. Und in denen die einzelnen Fenster.
-
Hätte ich mir doch denken können.
Kann ich den oberen und Unteren Splitter irgendwie fixieren das der nicht zu verschieben ist?
-
Ich habe jetzt die 3 Teile horizontal,
mein Problem ist nun, ich habe alle 3 fensterklassen von "CFormView" geerbt und sehe nun in allen dreien einen Dialog,
Wenn ich aber eine Klasse benutz welche von CWnd erbt, dann bekomm ich einen Fehler.D.h., wie muss ich die mittlere Klasse erstellen das ich diese dann auch noch mal teilen kann?
Danke für die Hilfe bisher.
-
Mr Evil schrieb:
Hätte ich mir doch denken können.
Kann ich den oberen und Unteren Splitter irgendwie fixieren das der nicht zu verschieben ist?Dann brauchst Du doch gar keinen Splitter. Dann erzeugst Du Deine drei Fenster einfach so und platzierst Sie wie Du willst bei OnSize!
Das mittlere ist dann dein CSplitterWnd.
-
Martin Richter schrieb:
Dann erzeugst Du Deine drei Fenster einfach so und platzierst Sie wie Du willst bei OnSize
Wie meinst du das?
Ich habe nur ein Main fenster,
dann erstell ich noch eine klasse welches von CWnd erbt,
dann habe ich versucht mit m_wndMiddleWindow.Create(...) das fenster zu erstellen in der mitte - bekomm da aber ueberhaupt nichts hin /=(Habe seit Monaten kein MFC mehr gemacht)
//Dazuedit
ich habs glaube hinbekommen imt der cpp-tutor.de seite {=
vielen dank
-
Jetzt verstehe ich Dich nicht. Du kannst doch beliebige Fenster erzeugen. Mit OnSize kanst Du diese anordnen, dazu braucht man grundsätzlich kein SplitterWnd.
-
ich hab das jetzt so - ein fenster mit create oben, in der mitte und eines unten - und das in der mitte soll nun 4 senkrechte splitter bekommen
und da hakt es noch
ich hab die klasse
CMiddleWindow welche CWnd ableitet und genau in der mitte angezeigt wird - aber ich bekomm die splitter dort nicht rein - ich weiss nicht wo und in welder prozedur /=
-
Erzeuge doch in der Mitte direkt ein CSplitterWnd und erzeuge dann mit CreateStatic (o.ä.) die entsprechenden Unterfenster.
-
mal skizziert was ich meine
---------------------------------------------------- | fester bereich A | |--------------------------------------------------- | variabel | variabel | variabel | variabel | | 1 | 2 | 3 | 4 | | | | | | | | | | | ---------------------------------------------------- | fester bereich B | |---------------------------------------------------A = CTopWindow : CWnd -> Create
B = CBottomWindow : CWnd -> Create
Mitte = CMiddleWindow : CWnd -> Create
1-4 = sollen duch splitter erstellt werdennun soll die mitte die 4 splitter bekommen
"OnCreate" bringt nichts, diese methode wird komischerweise nie aufgerufen
und im MainFrm kann ich die splitter nicht auf den mitleren begrenzen /=
-
Martin Richter schrieb:
Erzeuge doch in der Mitte direkt ein CSplitterWnd
das ist es ja, wie kann ich die splitter auf die mitte begrenzen?
Die splitter im MainFrm erstellen klappt ja schon, nur leider nur ueber das ganze fenster (bekomme von dem mitleren fenster das CWnd nicht fuer das parent)
und in der CMiddleWindow klasse fuer das mittlere fenster bekomm ich die splitter ueberhaupt nicht zum laufen
-
args - verzweifel - ich bekomm einfach die bloeden splitter nicht in der mitte - in MainFrame immer nur ueber das ganze fenster, und in "MiddleWindow : CWnd" bekomm ich gar keine splitter rein /=
-
Ich habe mein Hauptfenster, das ist ein FrameWnd,
in diesem kann ich nun in der PreCreateWindow die 4 Splitter erstellen, die aber nur über das ganze Fenster gehen: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);Die Klassen "CLeft1View" usw. sind FormView klassen.
Nun war die Frage wie ich oben und unten ein Bereich erstellen kann der fest ist, mein erster Ansatz ist das ich oben und unten noch zwei Splitter setze, aber wie du schon richtig sagtest, brauch ich an der stelle keine Splitter.
Daher habe ich nun 3 Fensterklassen generiert:
class CTopWindow : public CWnd class CMiddleWindow : public CWnd class CBottomWindow : public CWndUnd diese will ich dann in dem MainFrm erstellen und anzeigen lassen:
// position und groesse wird in OnSize geregelt m_wndTopWindow.Create(NULL, _T(""), WS_CHILD|WS_VISIBLE, CRect(0, 0, 0, 0), this, 1, NULL); m_wndMiddleWindow.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);Nun stellt sich mir die Frage, wie kann ich die 4 Splitter auf den MiddleWindow Fenster begrenzen,
Wenn ich:m_wndSplitterLeft.CreateStatic(&m_wndMiddleWindow, 1, 2);mache, bekomm ich die Splitter nicht zu sehen.
Dann dachte ich daran was du sagtest,
Du sagtest die Splitter brauchen einen FrameWnd.Also habe ich die CMiddleWindow klasse von CFrameWnd abgeleitet, aber dann gibt es das „Create“ nicht mehr, und ich habe dort keine Ahnung wie ich das Fenster dann in dem Hauptfenster erstelle und positioniere.
Ich denke mir das ich grundlegend etwas falsch mache, entschuldige meine ausdrucksweise gestern, aber war schon spät geworden und ich immer genervter.
-
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 fensterdaher nun die frage:
wie erstelle ich diese, und wie positionier ich diese?
-
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
-
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!