Nur eine prozentuale Veränderung der Fenstergröße durch den Benutzer zulassen

BlackSnow

Grünschnabel
Hallo,

ich möchte, dass der Benutzer das Fenster nur prozentual vergrößern bzw. verkleinern kann. D. h. Wenn er z. B. den rechten Fensterrand festhält und das Fenster schmäler zieht, soll auch automatisch die Fensterhöhe verhältnismäßig kleiner werden.

Habe versucht die OnSize- und die OnSizing-Methode zu überschreiben, aber ich komme momentan nicht weiter.

In der OnSize Methode hat die Variable fwSide bei mir immer den Wert 0. Also merke ich mir schon in der OnSizing-Methode mit Hilfe der Membervariable m_nKante, an welcher Kante der Benutzer die Fenstergröße verändern will:

Code:
void CMainFrame::OnSizing(UINT fwSide, LPRECT pRect) {
   this->m_nKante = fwSide;
   CFrameWnd::OnSizing(fwSide, pRect);
}


Danach wird ja die OnSize Methode aufgerufen, wenn der Benutzer die Größe verändert hat.
Nehmen wir mal an, der Benutzer hält das Fenster an der rechten (m_nKante = 2) oder
linken Kante (m_nKante = 1) fest. D. h. er hat das Fenster in der Breite verändert. Abhängig von der neuen Client-Breite habe ich dann die neue Höhe cy berechnet, die der Client-Bereich haben muss, damit das Verhältnis Breite zu Höhe noch das gleiche bleibt.

(In den Variablen m_nClientbreite und m_nClienthoehe ist die alte Breite und Höhe des Clientbereichs gespeichert)

Welche Methode muss ich denn nun aufrufen um die Höhe des Fensters zu setzen? Wenn ich SetWindowPos() aufrufe tut sich gar nichts.

Code:
void CMainFrame::OnSize(UINT fwSide, int cx, int cy) {

   double skalierung = (double)this->m_nClientbreite  / this->m_nClienthoehe;
      
   if (this->m_nKante == 1 || this->m_nKante == 2) {
         
      cy = cx / skalierung;
      this->m_nClientbreite = cx;
      this->m_nClienthoehe = cy;
         
       ?
   }
}

Danke Euch.
 
BlackSnow hat gesagt.:
In der OnSize Methode hat die Variable fwSide bei mir immer den Wert 0
Bei OnSize() hat der erste Parameter eine andere Bedeutung, als bei OnSizing(): Er zeigt die Art der Größenänderung an. Du solltest dazu vielleicht noch mal einen Blick in die MSDN werfen.

BlackSnow hat gesagt.:
Wenn ich SetWindowPos() aufrufe tut sich gar nichts
SetWindowPos() an sich ist schon ok. Warum hast du denn den entsprechenden Code in deiner geposteten Source weggelassen? Vielleicht passen irgendwelche Parameter nicht.

Gruß
MCoder
 
Folgendes hab ich dort stehen:

Code:
		if (this->m_nKante == 1 || this->m_nKante == 2) {

			cy = (int) (cx / this->m_nSkalierung);

			this->m_nClientbreite = cx;
			this->m_nClienthoehe = cy;

			this->SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOMOVE);
		}

Funktioniert aber nicht ganz. Das Problem ist folgendes:
Wenn ich die Fenstergröße per Maus verändere, flackert das Fenster stark.
Wenn ich die Maustaste nach der Größenänderung loslasse, ist nur noch der Clientbereich und die Symbolleiste zu sehen. Die Titel- und Menüleiste ist verschwunden und auch der Rahmen ist weg.

Im unteren rechten Eck des Client-Bereichs ist aber noch die Ecke mit der ich die Fenstergröße ebenfalls verändern kann. Wenn ich diese Ecke anklicke, taucht auch wieder die Titel- und die Menüleiste, sowie der Rahmen auf.

Jetzt weiß ich nicht ob ich irgendwo nochmal die OnSize der Vaterklasse aufrufen muss, oder die ShowWindow()-Methode. Hab schon einiges versucht aber nichts funktioniert.
 
Hallo, hab mir das heute noch mal angeschaut. Die Änderungen müssen schon bei OnSizing ausgeführt werden.
Der übergebene LPRECT-Parameter kann entsprechend modifiziert werden:
C++:
void CMainFrame::OnSizing(UINT fwSide, LPRECT pRect)
{
    // ...

    pRect->bottom = pRect->top + ((pRect->right - pRect->left) / skalierung);
    CFrameWnd::OnSizing(fwSide, pRect);
}
Gruß
MCoder
 
Zurück