Unsichtbare Splitter



  • Hallo,

    Durch ein anderes Topic hatte ich es geschafft feste Splitter zu erstellen.
    Als nächstes hatte ich mich schlau gemacht wie ich diese Splitter "Unsichtbar" machen kann,
    D.h. die selbe Farbe wie die Dialoge die als Inhalt angezeigt werden.
    Nach kurzem Googlen nach "Invisible Splitter" bin ich auf diese Seite gestoßen:
    http://www.codeguru.com/cpp/w-d/dislog/splitterwindowswithingdialogs/article.php/c5025

    Dort steht:

    ASSERT_VALID(pDC);
    CRect rect = rectArg;
    CPen WhitePen;
    WhitePen.CreatePen(PS_SOLID, 2, ::GetSysColor(COLOR_WINDOW);
    pDC->SelectObject(&WhitePen);
    pDC->Rectangle(rect);
    

    Das funktioniert zuerst ganz gut, aber sobald ich das Fenster in seiner Größe etwas verändere, sei es das ganze Fenster oder ein Splitter bewege,
    Wird der Fenster-Inhalt überdeckt und nichts passt mehr übereinander, es macht den Eindruck als wenn Quadrate willkürlich irgendwo platziert werden.

    Auch nach längerer Suche nach „DrawAllSplitterBars“ usw. habe ich bisher nichts Brauchbares gefunden.
    Ich suche und probiere bereits seit ich die festen Splitter erstellen kann.

    Ich hatte auch versucht die Größe der Splitter zu beeinflussen:

    m_cxSplitter = 0;
    m_cySplitter = 0;
    m_cxBorderShare = 0;
    m_cyBorderShare = 0;
    m_cxSplitterGap = 1;
    m_cySplitterGap = 1;
    m_cxBorder = 0;
    m_cyBorder = 0;
    

    Dann sind die Splitter zwar unsichtbar, aber sobald ich irgendein Splitter bewege welcher an den Unsichtbaren grenzt, wird unschön schatten dargestellt.
    Zudem beeinflusst das irgendwie auch den direkten Splitter der diesen Unsichtbaren als Parent hat, daher währe das "Umfärben" genau das richtige.

    Jemand ein Tipp für mich?


  • Mod

    Wenn der Splitter fest ist und Du ihn nicht sehen willst, warum verwendest Du ihn überhaupt?

    Du kannst Doch die beiden Teilfenster in einen eigenen von CWnd abgeleiteten Container legen. Oder gar keinen Container benutzen.

    Erzeuge die Fenster selbst im entsprechenden Parent und platziere sie in der entsprechenden OnSize Funktion des Parents.



  • Es geht um das Resizen, da mehrere von diesen Fenster seitlich durch den Splitter Resized werden sollen, das hatte ich in dem anderen Topic aber schon angesprochen das ich da Probleme habe CWnd Fenster als Child von einen Splitter zu machen und darin noch mal Splitter.

    Diese „festen“ Fenster sind nur in der Höhe fest, nicht in der Breite.



  • Ich hab mal ein Bild gemacht von dem Problem:
    www.simracing-factory.de/evil/window.JPG

    Nur die drei Splitter sind seitlich verschiebbar.
    Alle anderen Fenster sind entweder komplett fest oder nur seitlich veränderbar.
    Die Fenster sind alles Dialoge (FormView)


  • Mod

    Ich dachte Du hättest es geschaft....

    Kombiniere doch einfach die Fenster, die en festes Layout haben in einem Container. Dieses Element ist dann ein Fenster in Deinem Splitter.

    Aber das hatten wir ja schon...



  • Martin Richter schrieb:

    Ich dachte Du hättest es geschaft....

    Kombiniere doch einfach die Fenster, die en festes Layout haben in einem Container. Dieses Element ist dann ein Fenster in Deinem Splitter.

    Aber das hatten wir ja schon...

    Container?

    Ich bekomm das ja halt nicht hin, das was ich geschafft hatte war genau das was du siehst.
    Mein problem ist - wie erstelle ich dieses Fenster was alles beinhaltet um es dann einen Splitter zu zu ordnen.

    Am ende läuft es darauf hinaus, ich kann Splitter erstellen, ich kann auch CWnd fenster erstellen in in der FormView anzeigen lassen, aber so wie du das beschreibst bekomm ich das nichteinmal ansatzweise hin!

    Zeig doch mal ein Beispiel.

    Ich habe eine FormView und lauter Splitter
    Nun leite ich eine CWnd klasse ab und positionier diese in der FormView oben
    dann erstelle ich ein splitter und lass diesen in der mitte anzeigen (zwei teile)
    die frage nu, wie bekomm ich ein weiteres CWnd fenster oben rechts und links sowie unten rechts und links un in den splitter in der mitte.


  • Mod



  • Ich erkenne das Problem - und zwar dieser "Container" - den kannte ich noch nicht - deinen Code werd ich erstmal versuchen muessen zu verstehen bis ich da selber was auf die beine gestellt habe

    Eine Frage habe ich da aber noch
    In deinem Beispiel geht der "Container" ueber das ganze fenster, richtig?
    Und nun muss ich ein splitter erstellen wo dann rechts und links dieser container enthalten ist - richtig?

    //dazuedit, ich sehe gerade, der container selber beinhaltet aber kein eigenen splitter - aber da muss ja einer rein /=


  • Mod

    Ich verstehe Dein Problem immer noch nicht!
    Du wolltest Überschift und Fusszeile. Fest! Das sind die CStatic Fenster. Bau was anderes was Du auch immer willst. Darin ist nun ein View.

    Was passt Dir denn jetzt nicht?

    Aber lange wirst Du mich icht mehr damit quälen 😉 ich fahre nämlich bald in den Urlaub...



  • schau dir mal mein bild genau an

    dein beispiel ist nur dahingehend richtig das oben und unten ein statisches fenster ist - aber dazwischen (FORM 1 | Form 2) muss auch noch ein splitter rein

    www.simracing-factory.de/evil/window2.jpg


  • Mod



  • GENAU, das isses - hab jetzt keine zeit mehr aber werde morgen auf jeden fall den code zerpfluecken

    ich bin dir zu grossen dank verpflichtet

    #winkz

    und nun - hab nen schoenen urlaub - ich bin sicher das ich nun zurecht komm {=



  • so, habe mal kurz ueberflogen - und hei, so hatte ich es gestern auch kurz probiert, da es aber irgendwie nicht klappte dachte ich es lag daran das die splitter immer ein FrameView als parent haben muessen - in deinen beispiel ist aber ein container das parent

    wie dem auch sei, das beantwortet nun alle fragen - vielen dank


  • Mod

    Ich dachte ich hätte es schon mal erklärt. Die Splitter müssen in einem CFrameWnd liegen. Wieviele dann aber verschachtelt sind ist egal!
    Ursache ist letzten Endes auch wieder nur das ein CView einen Frame benötigt. Aber auch ein CView kann damit leben wenn mehrere Andere Fenster dazwischen liegen.



  • Das hatte ich so verstanden:

    Der Splitter brauch ein FrameWnd d.h. nur in MainFrm ist ein *.CreateStatic möglich.
    Aber so wie ich deinen Code nun sehe versteh’ ich wie das ganze funktioniert (endlich richtig hoffe ich),
    aber ich glaube ohne die Container ist es gleich deutlich schwerer, und die Container hatte ich noch nie zuvor gesehen
    {Wie ich schon mal irgendwo sagte habe ich seit einigen Monaten nichts mit MFC gemacht, und dort auch nie etwas mit Container oder Splitter}

    War ne schwere Geburt #gg

    //Dazu Edit -> Ich confirme deinen Urlaub, darfst gehen #erlaub #gg


  • Mod

    Solche Container Fenster (so nenne ich die), deren gesamter Clientbereich durch Unterfenster bedeckt werden, erlauben Fenster leichter zu gruppieren und nach eigenen Richtlinien zu positionieren. Oder sie erlauben eine gesamte Funktionalität zu kapseln. Dazu kann man auch von CDialog abgeleitete Container die den WS_CHILD Stil haben nutzen. Dazu gibt es Artikel in www.codeproject.com

    Wenn Du so willst ist jeder Frame ein Container! Denn vom eigentlichen CMainFrame siehst Du nie etwas. Es enthält nur andere Fenster. Das CMainFrame hat keinen OnPaint Handler und braucht den auch nicht.



  • Ich probiere hier schon seit geraumer zeit rum, mein Problem jetzt ist, wie bekomm ich solch ein Konstrukt (Du nennst es Container) in den FrameWnd

    also das der FrameWnd oben und unten auch noch ein static hat.

    BTW: kann man auf ein CStatic auch buttons und solche elemete generieren?

    //dazu edit, ich glaub ich loes das problem so das ich weiterhin ein splitter auf der FrameWnd habe, diese aber anders positionier das unten ich einer befindet, das ist auch kein problem

    //dazuedit 2
    japs, funktioniert forzueglich, problem hat sich damit nun erledigt


Anmelden zum Antworten