Functions/New-FontPicker.ps1

function New-FontPicker {
    <#
.SYNOPSIS
    Present a dialog to the user and allow them to select a font and its characteristics
.DESCRIPTION
    Present a dialog to the user and allow them to select a font and its characteristics
.EXAMPLE
    New-FontPicker
 
    Will present the user with a font dialog and return the following if Arial 18 point italic was selected:
 
    FontFamily : [FontFamily: Name=Arial]
    Bold : False
    GdiCharSet : 0
    GdiVerticalFont : False
    Italic : True
    Name : Arial
    OriginalFontName :
    Strikeout : False
    Underline : False
    Style : Italic
    Size : 18
    SizeInPoints : 18
    Unit : Point
    Height : 28
    IsSystemFont : False
    SystemFontName :
.NOTES
    If the user selects 'Cancel' from the dialog box no value is returned.
#>


    [CmdletBinding()]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')]
    param (

    )

    begin {
        Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]"
        #~~< FontPicker >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        $FontPicker = New-Object -TypeName System.Windows.Forms.Form
        $FontPicker.ClientSize = New-Object -TypeName System.Drawing.Size -ArgumentList (496, 204)
        $FontPicker.Font = New-Object -TypeName System.Drawing.Font -ArgumentList ('Segoe UI', 10.0, [System.Drawing.FontStyle]::Regular, [System.Drawing.GraphicsUnit]::Point, ([byte](0)))
        $FontPicker.Text = 'Font Picker'
        $FontPicker.AutoSize = $true
        $FontPicker.AutoSizeMode = 'GrowOnly'
        $FontPicker.Icon = (Join-Path -Path $Script:ModulePath -ChildPath 'Resources\PoshFunctions.ico')
        #~~< OKButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        $OKButton = New-Object -TypeName System.Windows.Forms.Button
        $OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
        $OKButton.Location = New-Object -TypeName System.Drawing.Point -ArgumentList (389, 69)
        $OKButton.Size = New-Object -TypeName System.Drawing.Size -ArgumentList (95, 23)
        $OKButton.TabIndex = 1
        $OKButton.Text = 'OK'
        $OKButton.UseVisualStyleBackColor = $true
        $FontPicker.AcceptButton = $OKButton
        #~~< CancelButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        $CancelButton = New-Object -TypeName System.Windows.Forms.Button
        $CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
        $CancelButton.Location = New-Object -TypeName System.Drawing.Point -ArgumentList (389, 125)
        $CancelButton.Size = New-Object -TypeName System.Drawing.Size -ArgumentList (95, 23)
        $CancelButton.TabIndex = 2
        $CancelButton.Text = 'Cancel'
        $CancelButton.UseVisualStyleBackColor = $true
        $FontPicker.CancelButton = $CancelButton
        #~~< ItalicsCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        $ItalicsCheck = New-Object -TypeName System.Windows.Forms.CheckBox
        $ItalicsCheck.Location = New-Object -TypeName System.Drawing.Point -ArgumentList (261, 153)
        $ItalicsCheck.Size = New-Object -TypeName System.Drawing.Size -ArgumentList (104, 24)
        $ItalicsCheck.TabIndex = 10
        $ItalicsCheck.Text = 'Italic'
        $ItalicsCheck.Enabled = $false
        $ItalicsCheck.UseVisualStyleBackColor = $true
        #~~< BoldCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        $BoldCheck = New-Object -TypeName System.Windows.Forms.CheckBox
        $BoldCheck.Location = New-Object -TypeName System.Drawing.Point -ArgumentList (261, 100)
        $BoldCheck.Size = New-Object -TypeName System.Drawing.Size -ArgumentList (104, 24)
        $BoldCheck.TabIndex = 9
        $BoldCheck.Text = 'Bold'
        $BoldCheck.Enabled = $false
        $BoldCheck.UseVisualStyleBackColor = $true
        #~~< StyleText >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        $StyleText = New-Object -TypeName System.Windows.Forms.TextBox
        $StyleText.Enabled = $false
        $StyleText.Location = New-Object -TypeName System.Drawing.Point -ArgumentList (13, 156)
        $StyleText.Size = New-Object -TypeName System.Drawing.Size -ArgumentList (161, 21)
        $StyleText.TabIndex = 8
        $StyleText.TabStop = $false
        $StyleText.Text = ''
        #~~< StyleLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        $StyleLabel = New-Object -TypeName System.Windows.Forms.Label
        $StyleLabel.Location = New-Object -TypeName System.Drawing.Point -ArgumentList (12, 130)
        $StyleLabel.Size = New-Object -TypeName System.Drawing.Size -ArgumentList (100, 23)
        $StyleLabel.TabIndex = 7
        $StyleLabel.Text = 'Style'
        #~~< SizeText >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        $SizeText = New-Object -TypeName System.Windows.Forms.TextBox
        $SizeText.Enabled = $false
        $SizeText.Location = New-Object -TypeName System.Drawing.Point -ArgumentList (12, 100)
        $SizeText.Size = New-Object -TypeName System.Drawing.Size -ArgumentList (60, 21)
        $SizeText.TabIndex = 6
        $SizeText.TabStop = $false
        $SizeText.Text = ''
        #~~< SizeLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        $SizeLabel = New-Object -TypeName System.Windows.Forms.Label
        $SizeLabel.Location = New-Object -TypeName System.Drawing.Point -ArgumentList (12, 74)
        $SizeLabel.Size = New-Object -TypeName System.Drawing.Size -ArgumentList (100, 23)
        $SizeLabel.TabIndex = 5
        $SizeLabel.Text = 'Font size'
        #~~< NameText >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        $NameText = New-Object -TypeName System.Windows.Forms.TextBox
        $NameText.Enabled = $false
        $NameText.Location = New-Object -TypeName System.Drawing.Point -ArgumentList (13, 42)
        $NameText.Size = New-Object -TypeName System.Drawing.Size -ArgumentList (312, 21)
        $NameText.TabIndex = 4
        $NameText.TabStop = $false
        $NameText.Text = ''
        #~~< NameLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        $NameLabel = New-Object -TypeName System.Windows.Forms.Label
        $NameLabel.Location = New-Object -TypeName System.Drawing.Point -ArgumentList (13, 25)
        $NameLabel.Size = New-Object -TypeName System.Drawing.Size -ArgumentList (100, 23)
        $NameLabel.TabIndex = 3
        $NameLabel.Text = 'Font name'
        #~~< FontButon >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        $FontButon = New-Object -TypeName System.Windows.Forms.Button
        $FontButon.Location = New-Object -TypeName System.Drawing.Point -ArgumentList (389, 21)
        $FontButon.Size = New-Object -TypeName System.Drawing.Size -ArgumentList (95, 23)
        $FontButon.TabIndex = 0
        $FontButon.Text = 'Font dialog'
        $FontButon.UseVisualStyleBackColor = $true
        $FontButon.add_Click( { FontButonClick -object ($FontButon) })
        $FontPicker.Controls.Add($ItalicsCheck)
        $FontPicker.Controls.Add($BoldCheck)
        $FontPicker.Controls.Add($StyleText)
        $FontPicker.Controls.Add($StyleLabel)
        $FontPicker.Controls.Add($SizeText)
        $FontPicker.Controls.Add($SizeLabel)
        $FontPicker.Controls.Add($NameText)
        $FontPicker.Controls.Add($NameLabel)
        $FontPicker.Controls.Add($CancelButton)
        $FontPicker.Controls.Add($OKButton)
        $FontPicker.Controls.Add($FontButon)
        $FontPicker.add_Load( { FormLoad -object ($FontPicker) })
        #~~< FontDialog >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        $FontDialog = New-Object -TypeName System.Windows.Forms.FontDialog
        $FontDialog.ShowHelp = $true

        function FontButonClick {
            [CmdletBinding()]
            [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', '')]
            param
            (
                $object
            )
            $FontResult = $FontDialog.ShowDialog()
            if ($FontResult -eq 'OK') {
                $NameText.Text = $FontDialog.Font.Name
                $SizeText.Text = $FontDialog.Font.Size
                $StyleText.Text = $FontDialog.Font.Style
                $BoldCheck.Checked = $FontDialog.Font.Bold
                $ItalicsCheck.Checked = $FontDialog.Font.Italic
            }
        }
        function FormLoad {
            [CmdletBinding()]
            [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', '')]
            param
            (
                $object
            )
            $NameText.Text = $FontDialog.Font.Name
            $SizeText.Text = $FontDialog.Font.Size
            $StyleText.Text = $FontDialog.Font.Style
            $BoldCheck.Checked = $FontDialog.Font.Bold
            $ItalicsCheck.Checked = $FontDialog.Font.Italic
        }
    }

    process {
        [System.Windows.Forms.Application]::EnableVisualStyles()
        $Result = $FontPicker.ShowDialog()
        if ($Result -eq 'OK') {
            Write-Output -InputObject $FontDialog.Font
        }
    }

    end {
        Write-Verbose -Message "Ending [$($MyInvocation.Mycommand)]"
    }
}