53

I have noticed that some applications change their controls position to adjust them as much as possible in the resolution as possible, If window is maximized they set themselves in such a way that over all GUI looks balanced. My question is that is it possible to make or implement this functionality in Visual studio 2010 C#?

Afnan Bashir
  • 7,349
  • 19
  • 74
  • 138

10 Answers10

72

Use Dock and Anchor properties. Here is a good article. Note that these will handle changes when maximizing/minimizing. That is a little different that if the screen resolution changes, but it will be along the same idea.

Phil Ross
  • 24,442
  • 9
  • 69
  • 76
SwDevMan81
  • 47,539
  • 21
  • 146
  • 180
  • I must mention the AutoScaleMode which made me waist **lots** of time of games with Anchor&Dock (which weren't actually the problem...) – ephraim May 07 '18 at 11:28
27

Use combinations of these to get the desired result:

  1. Set Anchor property to None, the controls will not be resized, they only shift their position.

  2. Set Anchor property to Top+Bottom+Left+Right, the controls will be resized but they don't change their position.

  3. Set the Minimum Size of the form to a proper value.

  4. Set Dock property.

  5. Use Form Resize event to change whatever you want

I don't know how font size (label, textbox, combobox, etc.) will be affected in (1) - (4), but it can be controlled in (5).

Bhaskar
  • 1,028
  • 12
  • 16
10
float widthRatio = Screen.PrimaryScreen.Bounds.Width / 1280;
float heightRatio = Screen.PrimaryScreen.Bounds.Height / 800f;
SizeF scale = new SizeF(widthRatio, heightRatio);
this.Scale(scale);
foreach (Control control in this.Controls)
{
control.Font = new Font("Verdana", control.Font.SizeInPoints * heightRatio * widthRatio);
}
  • @AfnanBashir perhaps, but this one saves you tons of time, if you already have a Windows form with tons of controls. +1 –  Oct 12 '15 at 19:39
  • That's an interesting approach (even if the ratio calculation could be improved). Ostensibly it relies on `AutoScaleMode` of the form being `Font`. – Zeus Jul 08 '21 at 02:31
2

..and to detect a change in resolution to handle it (once you're using Docking and Anchoring like SwDevMan81 suggested) use the SystemEvents.DisplaySettingsChanged event in Microsoft.Win32.

0

Here I like to use https://www.netresize.net/index.php?c=3a&id=11#buyopt. But it is paid version.

You also can get their source codes if you buy 1 Site License (Unlimited Developers).

How ever I am finding the nuget package solution.

Zin Min
  • 2,732
  • 1
  • 18
  • 27
0

sorry I saw the question late, Here is an easy programmatically solution that works well on me,

Create those global variables:

 float firstWidth;
 float firstHeight;

after on load, fill those variables;

 firstWidth = this.Size.Width;
 firstHeight = this.Size.Height;

then select your form and put these code to your form's SizeChange event;

 private void AnaMenu_SizeChanged(object sender, EventArgs e)
    {
        

        float size1 = this.Size.Width /  firstWidth;
        float size2 = this.Size.Height / firstHeight;

            SizeF scale = new SizeF(size1, size2);
        firstWidth = this.Size.Width;
        firstHeight = this.Size.Height;

        foreach (Control control in this.Controls)
        {
                
            control.Font = new Font(control.Font.FontFamily, control.Font.Size* ((size1+ size2)/2));
            
            control.Scale(scale);
                

        }


    }

I hope this helps, it works perfect on my projects.

  • I'm getting the error `Value of '∞' is not valid for 'emSize'. 'emSize' should be greater than 0 and less than or equal to System.Single.MaxValue. Parameter name: emSize` in the line `control.Font = new Font(control.Font.FontFamily, control.Font.Size* ((size1+ size2)/2));` after using your code.. – Bumba Nov 29 '21 at 13:29
-1

add this code at page load do for all control or add all control in containers

int x;
Point pt = new Point();
x = Screen.PrimaryScreen.WorkingArea.Width - 1024;
x = x / 2;
pt.Y = groupBox1.Location.Y + 50;
pt.X = groupBox1.Location.X + x;
groupBox1.Location = pt;
sschrass
  • 6,713
  • 6
  • 42
  • 58
chirag
  • 39
  • 4
-1

in the form load event add this line

this.WindowState = FormWindowState.Maximized;
Bohemian
  • 389,931
  • 88
  • 552
  • 692
soldiershin
  • 1,614
  • 1
  • 17
  • 28
-2
private void MainForm_Load( object sender, EventArgs e ) 
     { 
        this.Size = Screen.PrimaryScreen.WorkingArea.Size 
     }
Sherif Hamdy
  • 579
  • 6
  • 10
-5
this.WindowState = FormWindowState.Maximized;
ryanyuyu
  • 6,154
  • 10
  • 49
  • 50
  • 4
    Welcome to Stack Overflow! While this code may answer the question, providing additional context regarding why and/or how this code answers the question improves its long-term value. – ryanyuyu Sep 29 '16 at 13:15
  • 3
    This code will only make your windows maximized, but the size of all controls inside the windows won't dynamically changed. – Vincent Elbert Budiman May 04 '18 at 05:37