W tym poście chciałbym przedstawić klasę odpowiedzialną za dynamiczną zmianę wielkości kontrolek na ekranie w WindowsForm.
[Źródło: https://docs.microsoft.com/en-us/dotnet/]
Program:
Dane odnośnie lokalizacji oraz wielkości kontrolek przechowuje w klasie controlSize:
- class controlSize
- {
- private Int32 locationX;
- private Int32 locationY;
- private Int32 sizeWidth;
- private Int32 sizeHeight;
- protected controlSize() { }
- protected controlSize(Int32 setLocationX, Int32 setLocationY, Int32 setSizeWidth, Int32 setSizeHeight)
- {
- LocationX_ap = setLocationX;
- LocationY_ap = setLocationY;
- SizeWidth_ap = setSizeWidth;
- SizeHeight_ap = setSizeHeight;
- }
- protected Int32 LocationX_ap
- {
- get { return locationX; }
- set { locationX = value; }
- }
- protected Int32 LocationY_ap
- {
- get { return locationY; }
- set { locationY = value; }
- }
- protected Int32 SizeWidth_ap
- {
- get { return sizeWidth; }
- set { sizeWidth = value; }
- }
- protected Int32 SizeHeight_ap
- {
- get { return sizeHeight; }
- set { sizeHeight = value; }
- }
- }
Klasa główna pobiera parametry do ustawienia a następnie przy wywołaniu funkcji changeControlsSize zmienia jej rozmiar. Jako parametry podawana jest nazwa kontrolki, rozmiar okna oraz jego oryginalny rozmiar.
- class resizeControls : controlSize
- {
- public resizeControls(Int32 setLocationX, Int32 setLocationY, Int32 setSizeWidth, Int32 setSizeHeight)
- {
- this.LocationX_ap = setLocationX;
- this.LocationY_ap = setLocationY;
- this.SizeWidth_ap = setSizeWidth;
- this.SizeHeight_ap = setSizeHeight;
- }
- public void changeControlsSize(Control control, float sizeWidth, float sizeHeight, Size formOriginalSize)
- {
- float xSize = (float)(sizeWidth) / (float)(formOriginalSize.Width);
- float ySize = (float)(sizeHeight) / (float)(formOriginalSize.Height);
- int newXPos = (int)(this.LocationX_ap * xSize);
- int newYPos = (int)(this.LocationY_ap * ySize);
- int newWidth = (int)(this.SizeWidth_ap * xSize);
- int newHeight = (int)(this.SizeHeight_ap * ySize);
- control.Location = new Point(newXPos, newYPos);
- control.Size = new Size(newWidth, newHeight);
- }
- }
Dodatkowo przygotowałem klasę pomocniczą, która zmienia rozmiar tylko na podstawie podanych parametrów, bez przechowywania danych.
- class resizeSimple
- {
- public void changeControlsSize(Rectangle originalConrolReact, Control control,
- float sizeWidth, float sizeHeight, Size formOriginalSize)
- {
- float xRatio = (float)(sizeWidth) / (float)(formOriginalSize.Width);
- float yRatio = (float)(sizeHeight) / (float)(formOriginalSize.Height);
- int newX = (int)(originalConrolReact.X * xRatio);
- int newY = (int)(originalConrolReact.Y * yRatio);
- int newWidth = (int)(originalConrolReact.Width * xRatio);
- int newHeight = (int)(originalConrolReact.Height * yRatio);
- control.Location = new Point(newX, newY);
- control.Size = new Size(newWidth, newHeight);
- }
- }
Aby wykorzystać klasę należy wykorzystać zdarzenie Form1_Load:
- forms_helpFu.resizeControls lookDataBaseBtn_OriginalSizeRect;
- forms_helpFu.resizeControls editDataBaseBtn_OriginalSizeRect;
- forms_helpFu.resizeControls programCardBtn_OriginalSizeRect;
- forms_helpFu.resizeControls closeAppBtn_OriginalSizeRect;
- private Size formStartSize;
- private void Form1_Load(object sender, EventArgs e)
- {
- formOriginalSize = this.Size;
- lookDataBaseBtn_OriginalSizeRect = new forms_helpFu.resizeControls(lookDataBaseBtn.Location.X, lookDataBaseBtn.Location.Y, lookDataBaseBtn.Width, lookDataBaseBtn.Height);
- editDataBaseBtn_OriginalSizeRect = new forms_helpFu.resizeControls(editDataBaseBtn.Location.X, editDataBaseBtn.Location.Y, editDataBaseBtn.Width, editDataBaseBtn.Height);
- programCardBtn_OriginalSizeRect = new forms_helpFu.resizeControls(programCardBtn.Location.X, programCardBtn.Location.Y, programCardBtn.Width, programCardBtn.Height);
- closeAppBtn_OriginalSizeRect = new forms_helpFu.resizeControls(closeAppBtn.Location.X, closeAppBtn.Location.Y, closeAppBtn.Width, closeAppBtn.Height);
- }
Na samej górze są inicjalizatory obiektów oraz zmienna w formacie Size przechowująca rozmiar okna. W zdarzeniu wprowadzane są zmienne do nowych obiektów oraz pobierany jest startowy rozmiar okna.
Główna operacja edytująca kontrolki musi się odbywać w drugim zdarzeniu czyli Form1_Resize:
- private void Form1_Resize(object sender, EventArgs e)
- {
- lookDataBaseBtn_OriginalSizeRect.changeControlsSize(lookDataBaseBtn, this.Width, this.Height, formStartSize);
- editDataBaseBtn_OriginalSizeRect.changeControlsSize(editDataBaseBtn, this.Width, this.Height, formStartSize);
- programCardBtn_OriginalSizeRect.changeControlsSize(programCardBtn, this.Width, this.Height, formStartSize);
- closeAppBtn_OriginalSizeRect.changeControlsSize(closeAppBtn, this.Width, this.Height, formStartSize);
- }
Tutaj następuje wywołanie funkcji odpowiedzialnej za zmianę rozmiaru.
Dla prostszej klasy resizeSimple należy postępować trochę inaczej. Zaczynamy od definicji zmiennych dla każdej kontrolki:
- Rectangle lookDataBaseBtn_OriginalSizeRect;
- Rectangle editDataBaseBtn_OriginalSizeRect;
- Rectangle programCardBtn_OriginalSizeRect;
- Rectangle closeAppBtn_OriginalSizeRect;
- private Size formStartSize;
Tym razem dane przechowywane są w strukturze Rectangle, która pozwala na przechowanie czterech parametrów czyli lokalizacji (X, Y), wysokości oraz szerokości prostokąta.
Następnie w zdarzeniu Form_Load inicjalizuje się każdą ze zmiennej potrzebnymi danymi:
- private void Form1_Load(object sender, EventArgs e)
- {
- formOriginalSize = this.Size;
- lookDataBaseBtn_OriginalSizeRect = new Rectangle(lookDataBaseBtn.Location.X, lookDataBaseBtn.Location.Y, lookDataBaseBtn.Width, lookDataBaseBtn.Height);
- editDataBaseBtn_OriginalSizeRect = new Rectangle(editDataBaseBtn.Location.X, editDataBaseBtn.Location.Y, editDataBaseBtn.Width, editDataBaseBtn.Height);
- programCardBtn_OriginalSizeRect = new Rectangle(programCardBtn.Location.X, programCardBtn.Location.Y, programCardBtn.Width, programCardBtn.Height);
- closeAppBtn_OriginalSizeRect = new Rectangle(closeAppBtn.Location.X, closeAppBtn.Location.Y, closeAppBtn.Width, closeAppBtn.Height);
- }
Teraz zmiana rozmiaru wygląda następująco:
- private void Form1_Resize(object sender, EventArgs e)
- {
- lookDataBaseBtn_OriginalSizeRect.changeControlsSize(lookDataBaseBtn_OriginalSizeRect, lookDataBaseBtn, this.Width, this.Height, formStartSize);
- editDataBaseBtn_OriginalSizeRect.changeControlsSize(editDataBaseBtn_OriginalSizeRect, editDataBaseBtn, this.Width, this.Height, formStartSize);
- programCardBtn_OriginalSizeRect.changeControlsSize(programCardBtn_OriginalSizeRect, programCardBtn, this.Width, this.Height, formStartSize);
- closeAppBtn_OriginalSizeRect.changeControlsSize(closeAppBtn_OriginalSizeRect, closeAppBtn, this.Width, this.Height, formStartSize);
- }
Plik z klasą główną można pobrać z dysku Google pod tym linkiem.