CSplitterWnd -> Minimale Fenstergröße setzen



  • Guten Tag

    Ich habe in meinem SDI Projekt mittels CSplitterWnd 3 Bereiche erstellt.
    Ich möchte nun den den Benutzer daran hindern dass er die einzelnen Bereiche zu klein macht.
    Kann mir bitte jemand sagen wie ich das machen kann?
    Wenn ich im MainFrame nach dem Erzeugn der SplitterWnd's SetRowInfo und SetColumnInfo aufrufe, klappt mir der Bereich nur auf 0 zusammen wenn ich die Minimalgröße unterschreite.
    In den View's wird nur OnSize, aber nicht OnGetMinMaxInfo aufgerufen.

    Weis jemad wie ich das machen kann?



  • Bei mir funktioniert das ganz gut:

    void CMinFrame::OnSize(UINT nType, int cx, int cy)
    {
    
    	if( cx < m_sizeMin.cx )
    	{
    		if( GetParent()->IsKindOf( RUNTIME_CLASS( CSplitterWnd ) ) )
    		{
    			CSplitterWnd* pSplWnd = reinterpret_cast< CSplitterWnd* >( GetParent() );
    			pSplWnd->SetColumnInfo( 0, m_sizeMin.cx, m_sizeMin.cx );
    			pSplWnd->RecalcLayout();
    
    		}
    	}
    	CSplitterFrameWnd::OnSize(nType, cx, cy);
    
    }
    

    Bin mir aber nicht mehr ganz sicher ob das auch aus der View funktioniert wenn man keinen extra Frame für die Splitter verwendet.



  • connan schrieb:

    Bin mir aber nicht mehr ganz sicher ob das auch aus der View funktioniert wenn man keinen extra Frame für die Splitter verwendet.

    Also bei FormView's funktioniert es.

    Man muss aber sicher gehen dass dieser Codeabschnitt erst aufgerufen wird, wenn das Programmfenster fertig aufgebaut wurde. Denn ansonsten stürzt das Programm beim Aufruf von RecalcLayout(); ab.

    Ich glaube das Beispiel von connan ist würdig für's Archiv.


  • Mod

    Der bessere Ansatz wäre IMHO GetHitRect oder StartTracking zu überschreiben und m_rectLimit korrekt anzupassen.



  • Danke für den Hinweis



  • Wo gräbst du sowas nur immer aus? Dazu finde ich null Information und bekomms so auch nicht hin. Der MFC Quellcode sieht einfach furchtbar aus und irgendwie scheint es darauf hinauszulaufen die Funtkionen komplett neu zu schreiben?! Die Ansätze bei CodeGuru sind ähnlich wie meiner außer das Bsp. "True" Dynamic Splitter Bar, das geht so ein bisschen in deine Richtung aber das ist ein komplett neues CSplitterWnd und auch nicht ganz das was ich möchte.
    Noch einen kleinen Tip parat?


  • Mod

    connan schrieb:

    Wo gräbst du sowas nur immer aus?

    Ich lese den Sourcecode.
    In diesem Fall habe ich einfach mal die Grundfunktionen angesehen undbin auf das Trech Rect gestoßen. Das begrenzt alles und erschien mir ein guter Ansatz (also ungetestet).
    Dann habe ich den Tipp gepostet.

    connan schrieb:

    Dazu finde ich null Information und bekomms so auch nicht hin. Der MFC Quellcode sieht einfach furchtbar aus und irgendwie scheint es darauf hinauszulaufen die Funtkionen komplett neu zu schreiben?!

    Unfug. Ich verstehe Dich nicht. Für mich ist der MFC Code relativ einfach zu lesen. 🕶
    Aber sicher ist: er ist komplex!

    connan schrieb:

    Noch einen kleinen Tip parat?

    Ich habe den Tipp nur aufgrund der Durchsicht des Sourcecode gegeben.
    Ich habe eben ein kleines Sample geschrieben.
    1. Mit dem Wizard eine Anwendung Explorer Stil gebaut.
    2. Dann einfach CMySplitterWnd::StartTracking implementiert.

    Aktuell einfach nach Brutalo-Manier ohne nachdenken.

    Der aktuelle Code begrenzt das Ziehen des Splitters nach links und rechts auf 100 Pixel. D.h. weder rechtes noch linkes pane kann unter 100 Pixel gezogen werden.

    void CMySplitterWnd::StartTracking( int ht )
    {
    	__super::StartTracking(ht);
    	m_rectLimit.left += 100;
    	m_rectLimit.right -= 100;
    }
    

    Mit etwas mehr Analyse bekommst Du schnell raus welcher Tracker gemeint ist und wie man m_rectLimit evtl. gezielt manipulieren muss. Bei nur einem Splitter ist dies IMHO simpel.

    Ich sehe hier keinen Grund alles neu zu schreiben.
    Ich verwende die aktuellen Funktionen und Member...



  • Funktioniert 👍 und inzwischen versteh ich auch warum. Wie man das allerdings mal ebenso beim überfliegen der Quellen sehen kann ist mir ein Rätsel.

    Martin Richter schrieb:

    Aber sicher ist: er ist komplex!

    Puh na wenigstens das 😉
    Bleibt mir nur mal wieder Danke zu sagen: Danke!

    Edit: Wenn man jetzt noch den Threadtitel korrigiert kann das wirklich ins Archiv!


Anmelden zum Antworten