[C#] [Windows Forms] Zachowanie Proporcji Przy Rozszerzaniu Okna


(TereskaBro) #1

Witam,

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ę.

Pozdrawiam TB


(Marcin Obala) #2

Cześć

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);
}