Click here to Skip to main content
15,888,286 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
anyone can help me how to fix this GUI? I created a GUI, then I need the GUI can fit to any screen size without any size change. This script, when I execute in other computer with different resolution, the size changed.

Please help me. Thank you

What I have tried:

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()
$Form = New-Object system.Windows.Forms.Form
$Form.FormBorderStyle = "FixedDialog"
$Width = [System.Windows.Forms.Screen]::AllScreens.bounds.width
$Heigt = [System.Windows.Forms.Screen]::AllScreens.bounds.height

$Widht_Form = $Width[0] / 3.5
Write-Host "$Widht_Form"
$Heigt_Form = $Heigt[0] / 1.8
Write-Host "$Heigt_Form"
$Form.Width = $Widht_Form
$Form.Height = $Heigt_Form

$label1 = New-Object 'System.Windows.Forms.Label'
$Yes = New-Object 'System.Windows.Forms.Button'
$No = New-Object 'System.Windows.Forms.Button'
$Title = New-Object 'System.Windows.Forms.Label'
$timer1 = New-Object 'System.Windows.Forms.Timer'
$InitialFormWindowState = New-Object 'System.Windows.Forms.FormWindowState'

$Form_Load = {	
    $TotalTime = 10 #in seconds
        $script:StartTime = (Get-Date).AddSeconds($TotalTime)
        #Start the timer
        $timer1.Start()
}	
$Cancel_Click={	
}
$timer1_Tick={
        #Use Get-Date for Time Accuracy
        [TimeSpan]$span = $script:StartTime - (Get-Date)
        #Update the display
        $Form.Text = $label1.Text = "{0:N0}" -f $span.TotalSeconds
        if ($span.TotalSeconds -le 0) {
            $timer1.Stop()
            $Form.Close()
        }
    }

$Form_StateCorrection_Load=
{
    $Form.WindowState = $InitialFormWindowState
}

$Form_Cleanup_FormClosed=
{
    try
    {
        # $Cancel.remove_Click($Cancel_Click)
        $Form.remove_Load($Form_Load)
        $timer1.remove_Tick($timer1_Tick)
        $Form.remove_Load($Form_StateCorrection_Load)
        $Form.remove_FormClosed($Form_Cleanup_FormClosed)
    }
    catch [Exception]
    { }
}

$Form.SuspendLayout()
$Form.Controls.Add($label1)
$Form.Controls.Add($Yes)
$Form.Controls.Add($No)
$Form.Controls.Add($Title)

$Form.StartPosition = "CenterScreen"
$Form.BackColor = "#f6f6f6"
$Form.add_Load($Form_Load)

$label1.Font = 'Microsoft Sans Serif,20,style=Bold'
$Label1.ForeColor = "#176faa"
$label1.AutoSize = $true
$label1.width = 25
$label1.height = 10
$label1_height = $Heigt_Form / 2.5
$label1_width = $Widht_Form / 2.2
$label1.location = New-Object System.Drawing.Point($label1_width,$label1_height)

$Title.Text = "Do you need handling the job?"
$Title.ForeColor = "#176faa"
$Title.Font = 'Microsoft Sans Serif,16,style=Bold'
$Title.AutoSize = $true
$Title.width = 25
$Title.height = 10
$Title_height = $Heigt_Form / 5
$Title_width = $Widht_Form / 5
$Title.location = New-Object System.Drawing.Point($Title_width,$Title_height)

$Yes.AutoSize = $true
$Yes_height = $Heigt_Form * 0.7
$Yes_width = $Widht_Form / 8
$Yes.Location = New-Object System.Drawing.Size($Yes_width,$Yes_height)
$Yes.Size = New-Object System.Drawing.Size(90,35)
$Yes.Text = "Yes"
$Yes.Add_Click(
    {
    Write-Host "Call GUI Control"
    Start-Sleep -s 1
    $Form.Close()
    }
)

$No.AutoSize = $true
$No_height = $Heigt_Form * 0.7
$No_width = ($Yes_width * 6) - 35
$No.Location = New-Object System.Drawing.Size($No_width,$No_height)
$No.Size = New-Object System.Drawing.Size(90,35)
# $No.BackColor = "#9fd5f3"
$No.Text = "No"
$No.Add_Click(
    {
    Write-Host "Continue the process"
    $Form.Close()
    }
)

$timer1.add_Tick($timer1_Tick)
$Form.ResumeLayout()

#Save the initial state of the form
$InitialFormWindowState = $Form.WindowState
#Init the OnLoad event to correct the initial state of the form
$Form.add_Load($Form_StateCorrection_Load)
#Clean up the control events
$Form.add_FormClosed($Form_Cleanup_FormClosed)
#Show the Form
return $Form.ShowDialog()



I already try some function like autosize, but it's still the same problem.
Posted
Updated 14-Nov-19 15:48pm
v2

1 solution

You could try by setting the forms AutoScaleMode property to Font for a start.
Then read instructions here: c# - How to write WinForms code that auto-scales to system font and dpi settings? - Stack Overflow[^]

I did a test with a simple form with .NET 4.7 under Windows 10 and found that it is important to not set the font of controls in the designer.
I could scale the form like this:
this.Font = new Font("Arial", (float)this.numericUpDown1.Value, FontStyle.Regular);

I don't know if this works with PowerShell, but it can't be very different from a .NET application I think.
 
Share this answer
 
v2
Comments
Member 14156312 14-Nov-19 2:49am    
I tried AutoScaleMode.
$form1.AutoScaleMode = "Font"
$form1.AutoScale = $true

BUT it does NOT work. The GUI still mesh up once I execute from different screen resolution

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900