Proporcjonalna zmiana rozmiaru okna i jego kontrolek.

0

Witam

Jak w temacie nie mogę sobie poradzić ze zmianą rozmiaru okna podczas przeciągania, tak aby jeśli nawet rozciągnę okno po samej szerokości, to aby automatycznie rozmiar jego skorygował się do poprawnej proporcji.

Przykład:
Mam okno MdiChild, a w nim picturebox do ktorego laduje obrazki.
W momencie gdy rozciągam tylko szerokość lub wysokość, wiadome jak wygląda obrazek. Dodam, że obrazek jak zaladuje sie do picturebox, cała forma ma wielkosc dopasowaną do obrazka. Takze jest ok, poki nie użyje myszki do zmiany rozmiaru okna. Nie chce całkowicie blokować możliwości rozmiaru okna, bo czasem trzeba trochę zmniejszyć lub zwiększyć, ale jak to zrobić proporcjonalnie.

Szukałem już na stackoverflow i w google, ale nigdzie nie znalazłem działającego przykładu, no chyba, że brać pod uwagę przykład: width= height *2, co jest absurdem, przecież obrazki są o róznych proporcjach, a nie zawsze 2:1.

Oczywiście cały czas próbuje z zdarzeniem Form_Resize, ale właśnie co bym tam nie wpisywał, nie ma żadnej reakcji podczas przeciągania.

0

W momencie gdy rozciągam tylko szerokość lub wysokość, wiadome jak wygląda obrazek.

W zasadzie to nie wiadome, bo skąd mamy wiedzieć co właściwie robisz?

Do poprawnej zmiany wielkości elementów formy podczas zmiany jej rozmiaru używasz właściwości Dock oraz Anchor. Jeżeli one ci nie wystarczą, wtedy będziemy myśleć.
Jeżeli sobie nie z nimi nie poradzisz, spróbuj naszkicować to, co znajduje się na formie i w jaki sposób ma zmieniać swoją wielkość.

0

po wczytaniu obrazka musisz obliczyć stosunek height do width a potem jak zmieniasz rozmiar formy to musisz brać pod uwagę obliczony stosunek

0

no właśnie obliczam stosunek wychodzi ładne 0.75, tylko, że w przypadku Form_Resize nie działa, sypie się, natomiast w zdarzeniu Form_ResizeEnd już praktycznie działa, tylko jeszcze mi gdzieś robi się dziwny margines, którego nie powinno być między dolną krawędzią Frame'a, a picturebox'em. I do tego jakieś dziwne zachowanie ma, że ten resize działa także przy przesuwaniu ;p ;), ale to może być jakieś lekkie zamotanie przeze mnie, bo ogólnie po wczytaniu obrazka, od razu go skaluje na pół razem z frame'em (automatycznie podczas inicjalizacji Frame'a). Spróbuje jeszcze pokombinować i dam tutaj znać czy ten dziwny margines to jednak moja wina, czy inny problem.

Pozdrawiam
Marcin

0

Hej

Ja bym to zrobił tak:

  1. Ustalił pewien stały stosunek wysokość : szerokość, bazujac na poczatkowych rozmiarach obrazka.
  2. W zdarzeniu OnResize dynamicznie zmieniał szerokość / wysokość okna - jeśli user zwieszka wysokość, to Ty zwiekszasz szerokość o obliczony wczesniej stosunek.

Pozdro,
Arek

Edit:

private void Form1_Resize(object sender, System.EventArgs e)
{
   Control control = (Control)sender;
		
   // Ensure the Form remains square (Height = Width). 
   if(control.Size.Height != control.Size.Width)
   {
      control.Size = new Size(control.Size.Width, control.Size.Width);
   }
}

Źródło: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.resize.aspx

0

W sumie, może rzeczywiście lepiej od razu obliczyć stosunek frame'a, a nie obrazka. I wtedy wg tego stosunku w onResize zmieniać rozmiar. Wtedy nie trzeba by dodawać tych 30px na Title Frame'a (Frame.text).

1 użytkowników online, w tym zalogowanych: 0, gości: 1