czwartek, 24 maja 2018

C# - dynamiczna zmiana rozmiaru kontrolek w WindowsForm

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:

  1.     class controlSize
  2.     {
  3.         private Int32 locationX;
  4.         private Int32 locationY;
  5.         private Int32 sizeWidth;
  6.         private Int32 sizeHeight;
  7.         protected controlSize() { }
  8.         protected controlSize(Int32 setLocationX, Int32 setLocationY, Int32 setSizeWidth, Int32 setSizeHeight)
  9.         {
  10.             LocationX_ap = setLocationX;
  11.             LocationY_ap = setLocationY;
  12.             SizeWidth_ap = setSizeWidth;
  13.             SizeHeight_ap = setSizeHeight;
  14.         }
  15.         protected Int32 LocationX_ap
  16.         {
  17.             get { return locationX; }
  18.             set { locationX = value; }
  19.         }
  20.         protected Int32 LocationY_ap
  21.         {
  22.             get { return locationY; }
  23.             set { locationY = value; }
  24.         }
  25.         protected Int32 SizeWidth_ap
  26.         {
  27.             get { return sizeWidth; }
  28.             set { sizeWidth = value; }
  29.         }
  30.         protected Int32 SizeHeight_ap
  31.         {
  32.             get { return sizeHeight; }
  33.             set { sizeHeight = value; }
  34.         }
  35.     }

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.

  1.     class resizeControls : controlSize
  2.     {
  3.         public resizeControls(Int32 setLocationX, Int32 setLocationY, Int32 setSizeWidth, Int32 setSizeHeight)
  4.         {
  5.             this.LocationX_ap = setLocationX;
  6.             this.LocationY_ap = setLocationY;
  7.             this.SizeWidth_ap = setSizeWidth;
  8.             this.SizeHeight_ap = setSizeHeight;
  9.         }
  10.         public void changeControlsSize(Control control, float sizeWidth, float sizeHeight, Size formOriginalSize)
  11.         {
  12.             float xSize = (float)(sizeWidth) / (float)(formOriginalSize.Width);
  13.             float ySize = (float)(sizeHeight) / (float)(formOriginalSize.Height);
  14.             int newXPos = (int)(this.LocationX_ap * xSize);
  15.             int newYPos = (int)(this.LocationY_ap * ySize);
  16.             int newWidth = (int)(this.SizeWidth_ap * xSize);
  17.             int newHeight = (int)(this.SizeHeight_ap * ySize);
  18.             control.Location = new Point(newXPos, newYPos);
  19.             control.Size = new Size(newWidth, newHeight);
  20.         }
  21.     }

Dodatkowo przygotowałem klasę pomocniczą, która zmienia rozmiar tylko na podstawie podanych parametrów, bez przechowywania danych.

  1.     class resizeSimple
  2.     {
  3.         public void changeControlsSize(Rectangle originalConrolReact, Control control,
  4.                                                 float sizeWidth, float sizeHeight, Size formOriginalSize)
  5.         {
  6.             float xRatio = (float)(sizeWidth) / (float)(formOriginalSize.Width);
  7.             float yRatio = (float)(sizeHeight) / (float)(formOriginalSize.Height);
  8.             int newX = (int)(originalConrolReact.X * xRatio);
  9.             int newY = (int)(originalConrolReact.Y * yRatio);
  10.             int newWidth = (int)(originalConrolReact.Width * xRatio);
  11.             int newHeight = (int)(originalConrolReact.Height * yRatio);
  12.             control.Location = new Point(newX, newY);
  13.             control.Size = new Size(newWidth, newHeight);
  14.         }
  15.     }

Aby wykorzystać klasę należy wykorzystać zdarzenie Form1_Load:

  1.         forms_helpFu.resizeControls lookDataBaseBtn_OriginalSizeRect;
  2.         forms_helpFu.resizeControls editDataBaseBtn_OriginalSizeRect;
  3.         forms_helpFu.resizeControls programCardBtn_OriginalSizeRect;
  4.         forms_helpFu.resizeControls closeAppBtn_OriginalSizeRect;
  5.         private Size formStartSize;
  6.         private void Form1_Load(object sender, EventArgs e)
  7.         {
  8.             formOriginalSize = this.Size;
  9.             lookDataBaseBtn_OriginalSizeRect = new forms_helpFu.resizeControls(lookDataBaseBtn.Location.X, lookDataBaseBtn.Location.Y, lookDataBaseBtn.Width, lookDataBaseBtn.Height);
  10.             editDataBaseBtn_OriginalSizeRect = new forms_helpFu.resizeControls(editDataBaseBtn.Location.X, editDataBaseBtn.Location.Y, editDataBaseBtn.Width, editDataBaseBtn.Height);
  11.             programCardBtn_OriginalSizeRect = new forms_helpFu.resizeControls(programCardBtn.Location.X, programCardBtn.Location.Y, programCardBtn.Width, programCardBtn.Height);
  12.             closeAppBtn_OriginalSizeRect = new forms_helpFu.resizeControls(closeAppBtn.Location.X, closeAppBtn.Location.Y, closeAppBtn.Width, closeAppBtn.Height);
  13.         }


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:

  1.         private void Form1_Resize(object sender, EventArgs e)
  2.         {
  3.             lookDataBaseBtn_OriginalSizeRect.changeControlsSize(lookDataBaseBtn, this.Widththis.Height, formStartSize);
  4.             editDataBaseBtn_OriginalSizeRect.changeControlsSize(editDataBaseBtn, this.Widththis.Height, formStartSize);
  5.             programCardBtn_OriginalSizeRect.changeControlsSize(programCardBtn, this.Widththis.Height, formStartSize);
  6.             closeAppBtn_OriginalSizeRect.changeControlsSize(closeAppBtn, this.Widththis.Height, formStartSize);
  7.         }

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:

  1.         Rectangle lookDataBaseBtn_OriginalSizeRect;
  2.         Rectangle editDataBaseBtn_OriginalSizeRect;
  3.         Rectangle programCardBtn_OriginalSizeRect;
  4.         Rectangle closeAppBtn_OriginalSizeRect;
  5.         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:

  1.         private void Form1_Load(object sender, EventArgs e)
  2.         {
  3.             formOriginalSize = this.Size;
  4.             lookDataBaseBtn_OriginalSizeRect = new Rectangle(lookDataBaseBtn.Location.X, lookDataBaseBtn.Location.Y, lookDataBaseBtn.Width, lookDataBaseBtn.Height);
  5.             editDataBaseBtn_OriginalSizeRect = new Rectangle(editDataBaseBtn.Location.X, editDataBaseBtn.Location.Y, editDataBaseBtn.Width, editDataBaseBtn.Height);
  6.             programCardBtn_OriginalSizeRect = new Rectangle(programCardBtn.Location.X, programCardBtn.Location.Y, programCardBtn.Width, programCardBtn.Height);
  7.             closeAppBtn_OriginalSizeRect = new Rectangle(closeAppBtn.Location.X, closeAppBtn.Location.Y, closeAppBtn.Width, closeAppBtn.Height);
  8.         }

Teraz zmiana rozmiaru wygląda następująco:

  1.         private void Form1_Resize(object sender, EventArgs e)
  2.         {
  3.             lookDataBaseBtn_OriginalSizeRect.changeControlsSize(lookDataBaseBtn_OriginalSizeRect, lookDataBaseBtn, this.Widththis.Height, formStartSize);
  4.             editDataBaseBtn_OriginalSizeRect.changeControlsSize(editDataBaseBtn_OriginalSizeRect, editDataBaseBtn, this.Widththis.Height, formStartSize);
  5.             programCardBtn_OriginalSizeRect.changeControlsSize(programCardBtn_OriginalSizeRect, programCardBtn, this.Widththis.Height, formStartSize);
  6.             closeAppBtn_OriginalSizeRect.changeControlsSize(closeAppBtn_OriginalSizeRect, closeAppBtn, this.Widththis.Height, formStartSize);
  7.         }

Plik z klasą główną można pobrać z dysku Google pod tym linkiem.