Ever written a GUI to your application? Ever think there are alot of unnecessary lines?
Here is a smart way to add basic buttons without too many lines.
function CreateButton{ param( $name, $text, $size, $location, $onclick, $Form ) $name = New-Object System.Windows.Forms.Button $name.Text = "$text" $name.Location = "$location" $name.Size = "$size" $name.add_Click($onclick) $Form.Controls.Add($name) }
This requires a specific type of code to be run on click. We declare a variable as code within curlybrackets as shown below. In this case we use System.Windows.Forms.SaveFileDialog and save a richtextbox named $consolewindow.
$SaveButton_Click = { $SaveFileDialog = New-Object System.Windows.Forms.SaveFileDialog $SaveFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" $SaveFileDialog.ShowDialog() $ConsoleWindow.Text | Out-File $SaveFileDialog.FileName $SaveFileDialog.Dispose() }
To add a button with this information we need to create a main form and the console window with the code below.
[Void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") # Main form settings $Form = New-Object System.Windows.Forms.Form $Form.ClientSize = "1000,620" $Form.DesktopLocation = "100,100" $Form.MaximizeBox = $False $Form.ShowIcon = $False $Form.FormBorderStyle = "FixedSingle" $Form.Name = "Example" $Form.Text = "Example" # Console window settings $ConsoleWindow = New-Object System.Windows.Forms.RichTextBox $ConsoleWindow.Size = "1000,250" $ConsoleWindow.Location = "0,320" #$ConsoleWindow.ReadOnly = $True #commented out for manual input. $ConsoleWindow.BackColor = "Black" $ConsoleWindow.ForeColor = "White" $Form.Controls.Add($Consolewindow)
I’ve added a few extra rows just to make it look good for the example.
Now let’s create a button
CreateButton -name "SaveButton" -text "Save to file" -size "100,30" -location "50,50" -form $form -onclick $SaveButton_Click
Then we load the forms window
$Form.ShowDialog()
Normally you might not have a use for this function but when creating dynamic buttons you could have a use for it. To create a range of buttons from an array, use something like this.
$x = 0 $y = 0 for($i=0; $i -lt 20;$i++){ CreateButton -name $Buttons[$i] -text $Buttons[$i] -size "100,30" -location "$x,$y" -form $form -onclick $Button_Click[$i] $x += 100 if($x -gt "900"){$y += 30;$x = 0} }
This example takes the first 20 from an array and puts them on the main form in a orderly fashion as to not overcrowd the main window. The example has no practical use, but you could extract nestled objects and create dynamic buttons with a bit of work.
The full script would look like this:
Note that i’m using the same function for all buttons.
function CreateButton{ param( $name, $text, $size, $location, $onclick, $Form ) $name = New-Object System.Windows.Forms.Button $name.Text = "$text" $name.Location = "$location" $name.Size = "$size" $name.add_Click($onclick) $Form.Controls.Add($name) } $SaveButton_Click = { $SaveFileDialog = New-Object System.Windows.Forms.SaveFileDialog $SaveFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" $SaveFileDialog.ShowDialog() $ConsoleWindow.Text | Out-File $SaveFileDialog.FileName $SaveFileDialog.Dispose() } [Void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") # Main form settings $Form = New-Object System.Windows.Forms.Form $Form.ClientSize = "1000,620" $Form.DesktopLocation = "100,100" $Form.MaximizeBox = $False $Form.ShowIcon = $False $Form.FormBorderStyle = "FixedSingle" $Form.Name = "Example" $Form.Text = "Example" # Console window settings $ConsoleWindow = New-Object System.Windows.Forms.RichTextBox $ConsoleWindow.Size = "1000,250" $ConsoleWindow.Location = "0,320" #$ConsoleWindow.ReadOnly = $True #commented out for manual input. $ConsoleWindow.BackColor = "Black" $ConsoleWindow.ForeColor = "White" $Form.Controls.Add($Consolewindow) $Buttons = @("1".."26") $x = 0 $y = 0 for($i=0; $i -lt 20;$i++){ if($buttons[$i] -eq $null){break} CreateButton -name $Buttons[$i] -text $Buttons[$i] -size "100,30" -location "$x,$y" -form $form -onclick $SaveButton_Click $x += 100 if($x -gt "900"){$y += 30;$x = 0} } $Form.ShowDialog()