Создание графического интерфейса PowerShell (часть 5)

Опубликовано: 18 Марта, 2023

  • Создание графического интерфейса PowerShell (часть 13)

В своей предыдущей статье я полностью переписал сценарий Hello World, используя совершенно другую технику. В этой статье я хочу показать вам внутреннюю работу скрипта. Оттуда я покажу вам, как адаптировать эту технику, чтобы сделать что-то более полезное. Для справки, вот код из предыдущей статьи:

#Загрузить сборки

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null

[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | Out-Null

$net = New-Object -ComObject Wscript.Network

#Определить функцию щелчка по кнопке

Функция DisplayHelloWorldText{

Add-Type -AssemblyName System.Windows.Forms

# Создать текст Hello World

$Label = Новый объект System.Windows.Forms.Label

$Label.Text = «Привет, мир»

$Label.AutoSize = $Истина

$Label.Location = новый объект System.Drawing.Size(88,73)

$Form.Controls.Add($Label)

}

#Нарисовать форму

$Form = Новый объект System.Windows.Forms.Form

$Форма.ширина = 525

$Форма.высота = 350

$Form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::Fixed3D

$Form.Text = «Привет, мир»

$Form.maximumsize = Новый объект System.Drawing.Size(525 350)

$Form.startposition = «центральный экран»

$Form.KeyPreview = $Истина

$Form.Add_KeyDown({if ($_.KeyCode -eq «Enter») {}})

$Form.Add_KeyDown({if ($_.KeyCode -eq «Escape»)

{$Форма.Закрыть()}})

#Создать кнопку

$Button1 = новый объект System.Windows.Forms.Button

$Button1.Location = новый объект System.Drawing.Size(249,132)

$Button1.Size = новый объект System.Drawing.Size(80,20)

$Button1.Text = «Кнопка»

$Button1.Add_Click({DisplayHelloWorldText})

#Создать форму

$Форма.Управление.Добавить($Кнопка1)

$Form.Add_Shown({$Form.Activate()})

$Форма.ШоуДиалог()

Как вы можете видеть в примере кода, я разбил код на разделы. Первый раздел скрипта загружает сборки, которые мы будем использовать. Сборка на самом деле не что иное, как уже существующий набор кода. В этом случае Microsoft предоставляет код, и это хорошая новость. Это означает, что нам не нужно заново изобретать велосипед. Например, если я хочу создать окно, я могу просто использовать сборку, а не создавать код с нуля, который будет рисовать окно. В данном конкретном случае я загружаю две сборки — System.Windows.Forms и System.Drawing.

Несмотря на то, что нам не нужно писать код, создающий диалоговые окна и другие общие элементы интерфейса с нуля, для создания этих элементов требуется некоторый код. В конце концов, диалоговые окна не появляются по волшебству. Если мы хотим отобразить диалоговое окно, мы должны сообщить Windows, где разместить диалоговое окно и насколько большим оно должно быть.

Раздел сценария, который отвечает за создание диалогового окна, — это раздел Draw Form, который вы можете увидеть ниже:

#Нарисовать форму

$Form = Новый объект System.Windows.Forms.Form

$Форма.ширина = 525

$Форма.высота = 350

$Form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::Fixed3D

$Form.Text = «Привет, мир»

$Form.maximumsize = Новый объект System.Drawing.Size(525 350)

$Form.startposition = «центральный экран»

$Form.KeyPreview = $Истина

$Form.Add_KeyDown({if ($_.KeyCode -eq «Enter») {}})

$Form.Add_KeyDown({if ($_.KeyCode -eq «Escape»)

{$Форма.Закрыть()}})

Если вы посмотрите на самую первую строку кода выше, вы увидите, что я определяю переменную с именем $Form. Эта переменная используется для создания нового объекта формы. Форма — это, по сути, то же самое, что и диалоговое окно. Остальные строки кода в этом разделе определяют атрибуты формы. Например, мы определяем ширину формы, высоту, стиль границы и даже имя окна (через $Form.Text). Когда вы просматриваете блок кода выше, вы также заметите, что мы сообщаем окнам, что мы хотим отобразить форму в центре экрана.

Большая часть кода, показанного в приведенном выше блоке, говорит сама за себя, но последние две строки, вероятно, не требуют пояснений. Эти две строки кода определяют действие ввода с клавиатуры. В этом случае мы сообщаем PowerShell, что нажатие Enter равносильно нажатию кнопки формы. Мы также говорим PowerShell закрыть форму, если кто-то нажмет клавишу Escape.

Самое важное, что нужно понять о показанном выше блоке кода, это то, что он на самом деле не рисует форму (или диалоговое окно). Вместо этого он просто устанавливает параметры, которые будут использоваться при отрисовке формы позже.

Кнопка

Точно так же, как мы создали блок кода для определения диалогового окна, существует также блок кода, определяющий кнопку. Вот как выглядит этот блок кода:

#Создать кнопку

$Button1 = новый объект System.Windows.Forms.Button

$Button1.Location = новый объект System.Drawing.Size(249,132)

$Button1.Size = новый объект System.Drawing.Size(80,20)

$Button1.Text = «Кнопка»

$Button1.Add_Click({DisplayHelloWorldText})

Первая строка в этом блоке кода определяет новый объект формы типа Button. Следующая строка указывает, что кнопка должна быть размещена по координатам X=249, Y=132. Третья строка кода указывает, что размер кнопки будет 80 пикселей в ширину и 20 пикселей в высоту (вы можете сделать кнопку любого размера). Четвертая строка определяет текст, который будет отображаться на кнопке. В этом случае на кнопке будет просто написано «Кнопка».

Последняя строка кода, пожалуй, самая важная, потому что она сообщает Windows, что делать, когда кто-то нажимает кнопку. В этом случае при нажатии кнопки скрипт вызовет функцию PowerShell с именем DisplayHelloWorldText.

Стоит отметить, что, как и блок кода, определяющий диалоговое окно, только что рассмотренный код кнопки фактически не отображает кнопку. Вместо этого он просто определяет атрибуты, которые будут использоваться при отображении кнопки.

Отображение формы

Следующий блок кода, о котором я хочу рассказать, — это код, который фактически отображает форму. Вот код:

#Создать форму

$Форма.Управление.Добавить($Кнопка1)

$Form.Add_Shown({$Form.Activate()})

$Форма.ШоуДиалог()

Несмотря на кажущуюся загадочность, этот блок кода довольно прост. Как вы помните, мы уже определили объект формы. Этот код добавляет нашу кнопку ($Button1) к существующему объекту формы, а затем активирует форму в следующей строке. Последняя строка кода вызывает отображение диалогового окна и кнопки на экране.

Функциональные элементы

Последнее, о чем я хочу поговорить, это функция DisplayHelloWorldText. Помните, что скрипт вызывает эту функцию в ответ на нажатие кнопки. Вот код функции:

#Определить функцию щелчка по кнопке

Функция DisplayHelloWorldText{

Add-Type -AssemblyName System.Windows.Forms

# Создать текст Hello World

$Label = Новый объект System.Windows.Forms.Label

$Label.Text = «Привет, мир»

$Label.AutoSize = $Истина

$Label.Location = новый объект System.Drawing.Size(88,73)

$Form.Controls.Add($Label)

}

Что вы должны понимать об этом блоке кода, так это то, что, поскольку мы создаем графический вывод, мы не можем отображать текст на экране с помощью командлета Write-Host, как мы могли бы в текстовой среде. Наш графический интерфейс — это форма, и мы отображаем объекты в графическом интерфейсе, добавляя их в форму. Это именно то, что делает приведенный выше код. Мы определяем метку, которая станет частью формы. Эта метка будет расположена в координатах X=88, Y=73 и будет содержать слова Hello World.

Если вам интересно, это самая последняя строка кода в приведенном выше блоке кода, которая добавляет метку в нашу форму диалогового окна. Другие строки кода просто определяют метку.

Итак, краткое объяснение состоит в том, что скрипт определяет форму и определяет кнопку внутри этой формы. Если кнопка нажата, то PowerShell запускает функцию, которая добавляет на форму метку, и эта метка содержит слова Hello World.

Вывод

Теперь, когда я провел вас через внутреннюю работу графического интерфейса PowerShell, пришло время заставить его сделать что-то полезное. В следующей статье мы начнем создавать более полезный скрипт.