Co zrobić by powiększanie okna zachowywało proporcje startowe? Np. Rozciągam na długość to proporcjonalnie rośnie szerokość i na odwrót, no i co jak wybiorę rozciąganie tych dwóch wartości jednocześnie. Jest to w opcjach formsa czy trzeba pisać jakąś funkcję.
Najprostszym sposobem jest obsłużyć zdarzenie FormResize jednak nie wygląda to ładnie bo widać jak zwiększasz okno a później ono się zmniejsza. Żeby wyglądało to ładnie musisz zastosować to:
const double widthRatio = 6;
const double heightRatio = 4;
const int WM_SIZING = 0x214;
const int WMSZ_LEFT = 1;
const int WMSZ_RIGHT = 2;
const int WMSZ_TOP = 3;
const int WMSZ_BOTTOM = 6;
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_SIZING)
{
RECT rc = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT));
int res = m.WParam.ToInt32();
if (res == WMSZ_LEFT || res == WMSZ_RIGHT)
{
//Left or right resize -> adjust height (bottom)
rc.Bottom = rc.Top + (int)(heightRatio * this.Width / widthRatio);
}
else if (res == WMSZ_TOP || res == WMSZ_BOTTOM)
{
//Up or down resize -> adjust width (right)
rc.Right = rc.Left + (int)(widthRatio * this.Height / heightRatio);
}
else if (res == WMSZ_RIGHT + WMSZ_BOTTOM)
{
//Lower-right corner resize -> adjust height (could have been width)
rc.Bottom = rc.Top + (int)(heightRatio * this.Width / widthRatio);
}
else if (res == WMSZ_LEFT + WMSZ_TOP)
{
//Upper-left corner -> adjust width (could have been height)
rc.Left = rc.Right - (int)(widthRatio * this.Height / heightRatio);
}
Marshal.StructureToPtr(rc, m.LParam, true);
}
base.WndProc(ref m);
}