📐

[PowerShell]Textboxの縦サイズ(高さ)を変更しても変わらない問題を調べた

2023/10/23に公開

概要

PowerShellでC#のソース、Windowsフォームを作成していてテキストボックスの縦サイズ(高さ)を指定しても、
期待通りの大きさにならない問題がありました。

結論、これはC#の仕様でフォントサイズに紐づいて縦のサイズが決定しているもようです。
それでは、詳しく紹介します。

この記事のターゲット

  • PowerShellユーザーの方
  • PowerShell + C#のWindowsフォーム においてテキストボックスの縦サイズを変更したい方

問題

テキストボックスの縦サイズが変更できない
# テキストボックスの作成
[System.Windows.Forms.TextBox]$textbox = New-Object System.Windows.Forms.TextBox
$textbox.Location = New-Object System.Drawing.Point(40, 80)

# 縦のサイズを「100」で設定
$textbox.Size = New-Object System.Drawing.Size(350, 100)

$textbox.Text = $target_folder
$textbox.Font = New-Object System.Drawing.Font($font_family, $font_size)

PowerShellのWindowsフォーム上にあるテキストボックスの縦サイズ(高さ)を100pxに変更するも、サイズ変更が反映されない問題が発生
画像:縦サイズを「100」に設定してみたテキストボックス

上記の通り、$textbox.Size = New-Object System.Drawing.Size(350, 100)で縦のサイズを「100」に設定するも、
サイズを変更した該当箇所のサイズは広がりませんでした

サンプルコード(Function全体 と 実行方法) < クリックで折りたたみが開く >
Function全体
#################################################################################
# 処理名 |InputForm
# 機能  |対象フォルダーを指定する入力フォーム
#--------------------------------------------------------------------------------
# 戻り値 |Boolean(True: OKボタン、False: OKボタン以外)
# 引数  |target_folder: 対象フォルダー
#################################################################################
Function InputForm {
    Param (
        [System.String]$target_folder
    )

    # アセンブリ読み込み(フォーム用)
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing

    [System.String[]]$input_parameters = @()

    # フォームの作成
    [System.String]$prompt_title = 'タイトル:対象フォルダーを入力'
    [System.String]$prompt_message = '参照するフォルダーを入力してください。'
    [System.Windows.Forms.Form]$form = New-Object System.Windows.Forms.Form
    $form.Text = $prompt_title
    [System.UInt32[]]$form_size = @(550, 300)
    $form.Size = New-Object System.Drawing.Size($form_size[0],$form_size[1])
    $form.StartPosition = 'CenterScreen'
    $form.MaximizeBox = $false
    $form.MinimizeBox = $false

    [System.String]$font_family = 'MS ゴシック'
    [System.Int32]$font_size = 12

    # ラベル作成
    [System.Windows.Forms.Label]$label = New-Object System.Windows.Forms.Label
    $label.Location = New-Object System.Drawing.Point(20, 20)
    $label.Size = New-Object System.Drawing.Size(350, 50)
    $label.Text = $prompt_message
    [System.Drawing.Font]$font = New-Object System.Drawing.Font($font_family, $font_size)
    $label.Font = New-Object System.Drawing.Font($font_family, $font_size)

    # テキストボックスの作成 ★ここから★ --->
    [System.Windows.Forms.TextBox]$textbox = New-Object System.Windows.Forms.TextBox
    $textbox.Location = New-Object System.Drawing.Point(40, 80)

    # 100の場合
    $textbox.Size = New-Object System.Drawing.Size(350, 100)

    $textbox.Text = $target_folder
    $textbox.Font = New-Object System.Drawing.Font($font_family, $font_size)
    # <--- ★ここまで★

    # 参照ボタンの作成
    [System.Windows.Forms.Button]$btnRefer = New-Object System.Windows.Forms.Button
    $btnRefer.Location = New-Object System.Drawing.Point(420, 80)
    $btnRefer.Size = New-Object System.Drawing.Size(75,25)
    $btnRefer.Text = '参照'

    # OKボタンの作成
    [System.Windows.Forms.Button]$btnOkay = New-Object System.Windows.Forms.Button
    $btnOkay.Location = New-Object System.Drawing.Point(355, 210)
    $btnOkay.Size = New-Object System.Drawing.Size(75,30)
    $btnOkay.Text = 'OK'
    $btnOkay.DialogResult = [System.Windows.Forms.DialogResult]::OK

    # Cancelボタンの作成
    [System.Windows.Forms.Button]$btnCancel = New-Object System.Windows.Forms.Button
    $btnCancel.Location = New-Object System.Drawing.Point(440,210)
    $btnCancel.Size = New-Object System.Drawing.Size(75,30)
    $btnCancel.Text = 'キャンセル'
    $btnCancel.DialogResult = [System.Windows.Forms.DialogResult]::Cancel

    # ボタンの紐づけ
    $form.AcceptButton = $btnOkay
    $form.CancelButton = $btnCancel

    # フォームに紐づけ
    $form.Controls.Add($label)
    $form.Controls.Add($textbox)
    $form.Controls.Add($btnRefer)
    $form.Controls.Add($btnOkay)
    $form.Controls.Add($btnCancel)

    # フォーム表示
    [System.Boolean]$is_Selected = ($form.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK)
    $form = $null

    return $is_Selected
}
Functionを実行
# 実行
InputForm 'D:\Downloads'

調査結果

いろいろ設定し直して検証(テスト)してみた結果、C#のテキストボックスにおける縦のサイズ(高さ)は、
フォントサイズに紐づいて大きさが決定している 」という事がわかりました。

具体的には下記内容の検証を行いました。

縦サイズを「100」に設定したテキストボックス

前述に紹介した画像と同じものです。サイズを変更しても大きさは変わりません。

縦サイズを「100」で設定
# テキストボックスの作成
[System.Windows.Forms.TextBox]$textbox = New-Object System.Windows.Forms.TextBox
$textbox.Location = New-Object System.Drawing.Point(40, 80)

# 100の場合
$textbox.Size = New-Object System.Drawing.Size(350, 100)

$textbox.Text = $target_folder
$textbox.Font = New-Object System.Drawing.Font($font_family, $font_size)

PowerShellのWindowsフォーム上にあるテキストボックスの縦サイズ(高さ)を100pxに変更するも、サイズ変更が反映されない
画像:縦サイズを「100」に設定したテキストボックス

縦サイズを「0」に設定したテキストボックス

縦サイズを「0」に変更しましたが、なんと「100」の時とまったく変わりませんでした。

縦サイズを「0」に設定したテキストボックス
# テキストボックスの作成
[System.Windows.Forms.TextBox]$textbox = New-Object System.Windows.Forms.TextBox
$textbox.Location = New-Object System.Drawing.Point(40, 80)

# 0の場合
$textbox.Size = New-Object System.Drawing.Size(350, 0)

$textbox.Text = $target_folder
$textbox.Font = New-Object System.Drawing.Font($font_family, $font_size)

PowerShellのWindowsフォーム上にあるテキストボックスの縦サイズ(高さ)を0pxに変更するも、サイズ変更が反映されない
画像:縦サイズを「0」に設定したテキストボックス

縦サイズを「0」でフォントサイズを大きくしたテキストボックス

これによりテキストボックスは「 フォントサイズにより縦のサイズが決まっている 」という事がわかりました。

縦サイズを「0」でフォントサイズを変更
# テキストボックスの作成
[System.Windows.Forms.TextBox]$textbox = New-Object System.Windows.Forms.TextBox
$textbox.Location = New-Object System.Drawing.Point(40, 80)

# 0でフォントサイズ「12 → 20」の場合
$textbox.Size = New-Object System.Drawing.Size(350, 0)
$font_size = 20

$textbox.Text = $target_folder
$textbox.Font = New-Object System.Drawing.Font($font_family, $font_size)

PowerShellのWindowsフォーム上にあるテキストボックスのフォントサイズを20に変更すると、テキストボックスの高さも変更された
画像:フォントサイズを大きくして高さが変わったテキストボックス

縦サイズを「100」でマルチラインを「オン」にしたテキストボックス

フォントサイズを変更せずともマルチラインをオンにするとサイズが大きくなりました
ただ、この状態でOKボタンが紐づいていないWindowsフォームだった場合、テキストボックスでEnterキーを入力すると改行が挿入されます。
テキストボックスで改行を受け付けたくない仕様の場合、マルチラインをオンして高さを調整する事ができないので、注意が必要。

縦サイズを「100」でマルチラインを「オン」で設定
# テキストボックスの作成
[System.Windows.Forms.TextBox]$textbox = New-Object System.Windows.Forms.TextBox
$textbox.Location = New-Object System.Drawing.Point(40, 80)

# 100でマルチラインをオンの場合
$textbox.Size = New-Object System.Drawing.Size(350, 100)
$textbox.Multiline = $true

$textbox.Text = $target_folder
$textbox.Font = New-Object System.Drawing.Font($font_family, $font_size)

PowerShellのWindowsフォーム上にあるテキストボックスのマルチラインをオンに変更すると、テキストボックスの高さが変更された
画像:縦サイズを「100」でマルチラインを「オン」にしたテキストボックス

まとめ

  • テキストボックスの縦サイズを変更したい場合は、フォントサイズを見直す
  • フォントサイズを変更したくない場合、テキストボックスのマルチラインをオンにする
    ただし、画面の作りによって改行が挿入されてしまう事がある為、注意が必要

PowerShellは色々できて好きなのですが、こういう細かい所にC#ゆずりの変なクセがあるのはイヤですね。
難しい話ではありますが、個人的には主流になっているWebライクな仕様に移り変わってほしいと感じます。

関連記事

https://haretokidoki-blog.com/pasocon_powershell-startup/
https://zenn.dev/haretokidoki/articles/7e6924ff0cc960

GitHubで編集を提案

Discussion