2016-03-02

PowerShellでユーザーフォームを作る - コンテキストメニュー編 -

 PowerShellでは、ユーザーの好みに合わせて、独自にフォームを作成することができます。

今回は「PowerShellでユーザーフォームを作る - コンテキストメニュー編 -」です。

コンテキストメニューとは、ショートカットメニューとも呼ばれており、フォーム上のアイテム(ボタンなど)をクリックしたときなどにポップアップ表示されるメニューのことを言います。


<今回の完成品>


それではスクリプトを記述します。

#コンテキストメニュー

Add-Type -AssemblyName System.Windows.Forms

$form = New-Object System.Windows.Forms.Form
$form.Size = "200,200"
$form.Startposition = "centerscreen"
$form.Text = "タイトル"

$Button = New-Object System.Windows.Forms.Button
$Button.Location = "50,80"
$Button.Size = "80,30"
$Button.Text  = "閉じる"
$Button.FlatStyle = "Popup"
$Button.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.Controls.Add($Button)

# インスタンス化
$Context = New-Object System.Windows.Forms.ContextMenuStrip

# 項目を追加
[void]$Context.Items.Add("テスト1")
[void]$Context.Items.Add("テスト2")
[void]$Context.Items.Add("テスト3")

$Click = {
    # クリックされた項目を文字列として取得
    [String]$A = $_.ClickedItem

    # コンテキストメニューを閉じる
    $Context.Close()

    # クリックされた項目によって、表示メッセージを変える
    IF ( $A -eq "テスト1")
    {
        [System.Windows.Forms.MessageBox]::Show("テスト1が選択されました", "タイトル")
    }elseif( $A -eq "テスト2" ){
        [System.Windows.Forms.MessageBox]::Show("テスト2を選択しましたね?", "タイトル")
    }else{
        [System.Windows.Forms.MessageBox]::Show("テスト3を選択するとはお目が高い!", "タイトル")
    }
}
$Context.Add_ItemClicked($Click)

# クリックイベントの内容
$RIght = {
    IF ( $_.Button -eq "Right" )
    {
        $Context.Show()
    }
}
$form.Add_MouseDown($RIght)

# フォームにコンテキストメニューを追加
$form.ContextMenuStrip = $Context

$form.Showdialog()

上記内容をコピーし、PowerShell ISEに貼り付けて、実行してみてください。
完成品と同じものが表示されるはずです。

それでは解説をしていきます。
また過去の記事で解説した部分については割愛致します。

内容をご確認いただきたい場合は【ユーザーフォーム - 基礎編 -】をご覧ください。

*****解説*****************************************************************************
# インスタンス化
$Context = New-Object System.Windows.Forms.ContextMenuStrip
ここでは、ContextMenuStripクラスをインスタンス化しています。

# 項目を追加
[void]$Context.Items.Add("テスト1")
[void]$Context.Items.Add("テスト2")
[void]$Context.Items.Add("テスト3")
続いて、メニューとして表示させる項目を追加します。
文頭に[void]を付けているのは、コンソールへの出力を防ぐためです。

$Click = {
    # クリックされた項目を文字列として取得
    [String]$A = $_.ClickedItem

    # コンテキストメニューを閉じる
    $Context.Close()

    # クリックされた項目によって、表示メッセージを変える
    IF ( $A -eq "テスト1")
    {
        [System.Windows.Forms.MessageBox]::Show("テスト1が選択されました", "タイトル")
    }elseif( $A -eq "テスト2" ){
        [System.Windows.Forms.MessageBox]::Show("テスト2を選択しましたね?", "タイトル")
    }else{
        [System.Windows.Forms.MessageBox]::Show("テスト3を選択するとはお目が高い!", "タイトル")
    }
}
$Context.Add_ItemClicked($Click)
ここでは、コンテキストメニューにアイテムクリックイベントを設定しています。

# クリックされた項目を文字列として取得
    [String]$A = $_.ClickedItem
この記述内の「$_」はToolStripItemClickedEventArgs クラスを表しており、そのClickedItemプロパティを取得し、変数Aに文字列として格納しています。
とどのつまり、クリックした項目が「テスト1」ならば、変数Aには「テスト1」が格納されます。

その後、if文を用いて変数Aの値によって、処理を分岐させ、メッセージを表示します。
# クリックイベントの内容
$RIght = {
    IF ( $_.Button -eq "Right" )
    {
        $Context.Show()
    }
}
$form.Add_MouseDown($RIght)
次に、フォームにマウスダウンイベントを設定し、右クリックの場合のみコンテキストメニューを表示するようにしています。
# フォームにコンテキストメニューを追加
$form.ContextMenuStrip = $Context
ここでは作成したコンテキストメニューをフォームを関連付けしています。
この記述がないと、コンテキストメニューは画面座標(0,0)の位置に表示されてしまうので注意が必要です。
*************************************************************************************************

コンテキストメニューを充実させることで、そのフォームの利便性はグッと向上します。

独自の項目・機能を盛り込み、より良いアプリケーションを独自開発していきましょう!

=============================================================
本投稿に関する疑問や質問には可能な限りお答えさせていただきます。
お気軽にコメントやメールをお送りください。
(リクエストも歓迎します)
メール:tkk-powershell@gmail.com
また、間違いのご指摘・アドバイス等も歓迎いたします。
=============================================================
Google+、Twitterで更新情報をお届けしています!
ぜひフォローをお願い致します!           
=============================================================
スポンサーリンク


0 件のコメント:

コメントを投稿

疑問・質問・リクエスト お気軽にどうぞ (^O^)/