Vamos aqui demonstrar o que muda na exibição quando são ajustadas determinadas propriedades como SmoothingMode e Pen.Width.
Tomamos como exemplo o mesmo código do post Desenhando linhas com efeito gradiente, invertendo as cores, passando azul para o centro e verde na extremidade e alterando as propriedades abaixo mencionadas.
Inicialmente, deixamos as coisas com os valores padrão.
Nesse exemplo de código, estaremos traçando linhas a partir de um ponto central a todos os 360º de um círculo. Cada linha terá o efeito gradiente com as cores verde e azul. O código é o seguinte:
[reflection.assembly]::LoadWithPartialName("System.Windows.Forms")[reflection.assembly]::LoadWithPartialName("System.Drawing")[System.Windows.Forms.Application]::EnableVisualStyles();Functionline([Int32]$val,[String]$c1,[String]$c2){$ang=$val*([math]::PI/180)## em Radianos$r=150## tamanho da linha[System.Drawing.Graphics]$g=$f.CreateGraphics()$p1=New-ObjectSystem.Drawing.Point(190,180)$p2=New-ObjectSystem.Drawing.Point((190+$r*[math]::Cos($ang)),(180+$r*[math]::Sin($ang)))$lgb=New-ObjectSystem.Drawing.Drawing2D.LinearGradientBrush($p1,$p2,$c1,$c2)$pen=New-ObjectSystem.Drawing.Pen($lgb)$g.DrawLine($pen,$p1,$p2)$g.Dispose()}$f=New-ObjectWindows.Forms.Form$f.Width=400$f.Height=400$f.Show()$f.Refresh()for([Int32]$angulo=0;$angulo-lt360;$angulo++){line$angulo'Green''Blue'Start-Sleep-Milliseconds50}Start-Sleep-s5$f.Close()$f.Dispose()
Vamos usar o powershell para realizar algumas experiências com computação gráfica, tendo como premissa que um pixel (um ponto) pode ser considerado base para o desenho de outras estruturas como retas, triângulos, quadrados, etc.
Como nosso objetivo aqui é a implementação dessas estruturas básicas, vamos ignorar que o powershell já possui métodos implementados para desenhar retas, polígonos, etc.
Um pixel possui uma coordenada (x,y).
Uma reta será um conjunto de pontos; traçada através da implementação do algoritmo de Bresenham.
Implementaremos triângulos isósceles a partir de um ponto e a altura do triângulo fornecidos.
Quadrados serão implementados a partir de um ponto e o tamanho do lado fornecidos.
RSS (Rich Site Summary) é um formato de distribuição de informações pela Internet. Através do recurso é possível obter notícias resumidas.
O objetivo aqui não é o de implementar um leitor completo, mas demonstrar que o Powershell tem bons recursos para a construção de leitor RSS. Com poucas linhas de código tem-se a possibilidade de acessar um feed de RSS publicado na Web, obter o XML correspondente e extrair as informações.
Extraídas as informações do XML, vamos guardá-las em um arquivo temporário. Esta etapa se faz necessária em função da codificação de caracteres. Para a correta exibição no Out-GridView faremos a codificação na hora de salvar para esse arquivo temporário, bem como ao carregarmos o conteúdo desse arquivo para o Out-GridView.
Estamos pegando como exemplo um RSS do G1, mas podia ser qualquer um. Para facilitar está sendo atribuído a uma variável $channelURI. O código está abaixo:
Out-GridView é um recurso bem interessante a ser utilizado em scripts. Por exemplo, tem um filtro integrado bem interessante. Nesse exemplo, se quisermos visualizar apenas as notícias do dia 06, basta digitarmos no filtro. O resultado é esse:
Explorando as Propriedades em instâncias da classe System.Windows.Forms.Form, vemos a possibilidade de definir uma imagem de fundo para o Form através de BackgroundImage.
GDI+ possui codificadores (encoders) e decodificadores (decoders) integrados, que suportam os seguintes formatos de imagem:
BMP
GIF
JPEG
PNG
TIFF
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")[System.Windows.Forms.Application]::EnableVisualStyles()_Main### Chama a função _MainFunction_Main{$FormImg=New-ObjectSystem.Windows.Forms.Form$FormImg.ClientSize=New-ObjectSystem.Drawing.Size(512,288)$FormImg.FormBorderStyle=[System.Windows.Forms.FormBorderStyle]::Fixed3D$FormImg.Text=".::. Inserindo uma imagem de fundo no Form .::."$FormImg.MaximizeBox=$false# - Desabilitar 'Maximizar' a Janela$FormImg.StartPosition="CenterScreen"########################## Cria Imagem de Fundo a partir de um arquivo .JPG$FormImg.BackgroundImage=[System.Drawing.Image]::`FromFile($PSScriptRoot+"\Img\Fundo.jpg")$FormImg.BackgroundImageLayout="Stretch"## ajusta-se ao tamanho do Form# None, Tile, Center, Stretch, Zoom##$BotaoSair#$BotaoSair=New-ObjectSystem.Windows.Forms.Button$BotaoSair.Font=New-ObjectSystem.Drawing.Font("Microsoft Sans Serif",`10,[System.Drawing.FontStyle]::Bold)$BotaoSair.Text="SAIR"## Executa o código definido na variável $BotaoSair_Click$BotaoSair.Add_Click($BotaoSair_Click)$FormImg.Controls.Add($BotaoSair)$BotaoSair.Size=New-ObjectSystem.Drawing.Size(80,35)$BotaoSair_X=($FormImg.ClientSize.Width/2)-($BotaoSair.Width/2)$BotaoSair_Y=$FormImg.ClientSize.Height-50$BotaoSair.Location=New-ObjectSystem.Drawing.`Point($BotaoSair_X,$BotaoSair_Y)# Exibe o Form[System.Windows.Forms.Application]::Run($FormImg)}### End _Main### Executado no evento de clique em $BotaoSair$BotaoSair_Click={$FormImg.Close()}
O resultado da execução desse código é o seguinte:
No vídeo a seguir demonstra-se como codificar a imagem em Base64 e também como adicionar um ícone para o Form.
Alterar o quão opaco é um Form é fácil, pois existe uma Propriedade [Opacity], que obtém ou define o nível de opacidade do formulário.
Esta propriedade habilita-nos a especificar um nível de transparência para o Form e seus Controls.
Ela varia de 0.0 (invisível) a 1.0 (totalmente visível).
Add-Type-AssemblyNameSystem.Windows.FormsAdd-Type-AssemblyNameSystem.Drawing[Windows.Forms.Application]::EnableVisualStyles()$Form=New-ObjectSystem.Windows.Forms.Form$Form.Text=".:: Configurando uma Transparência para o Form ::."$Form.ClientSize=New-ObjectSystem.Drawing.Size(600,480)$Form.BackColor="Gray"$Form.StartPosition="CenterScreen"$Form.Opacity=0.7## Opacity [0.0 - 0%] a [1.0 - 100%]$Form.ShowDialog()
Abaixo um vídeo com código de demonstração de ajuste de transparência através do controle trackbar:
[Aqui] é possível obter o código do script exibido no vídeo.
Mudar a cor de fundo do Form é simples, basta alterar a Propriedade Backcolor.
Add-Type-AssemblyNameSystem.Windows.FormsAdd-Type-AssemblyNameSystem.Drawing[Windows.Forms.Application]::EnableVisualStyles()##Form3#$Form3=New-ObjectSystem.Windows.Forms.Form$Form3.Text=".:: Mudando a Cor de Fundo ::."$Form3.ClientSize=New-ObjectSystem.Drawing.Size(584,366)$Form3.BackColor="Green"$Form3.ShowDialog()
Neste exemplo, alteramos a cor de fundo para verde.
Pode-se utilizar o nome da cor, como Green, ou o código ARGB (AlphaRedGreenBlue).
[Aqui] você encontra uma lista de cores para referenciar pelo nome.
[Aqui] você encontra um código de exemplo para usar ARGB, e que faz uso de System.Windows.Forms.ColorDialog.
No vídeo a seguir, utilizam-se 3 botões que trocam a cor de fundo ao clique:
O código correspondente ao vídeo pode ser obtido [aqui].
Na sequência, vamos adicionar os seguintes controles: button, checkbox, combobox, label, radiobutton, richtextbox, textbox, datetimepicker. Observe que a adição ao Form [$Form0] se dá através de $Form0.Controls.Add(Objeto_que_representa_o_controle).
##Label0#$Label0=New-ObjectSystem.Windows.Forms.Label$Label0.AutoSize=$true$Label0.Font=New-ObjectSystem.Drawing.Font("Arial",14,[System.Drawing.FontStyle]::Bold)$Label0.Text="Eu sou um LABEL"$Label0.Size=New-ObjectSystem.Drawing.Size(313,27)$Label0.Location=New-ObjectSystem.Drawing.Point(15,9)$Form0.Controls.Add($Label0)
A classe System.Windows.Forms.MessageBox possui vários métodos Show [veja aqui].
Através deles, podemos exibir uma MessageBox personalizada.
Add-Type-AssemblyNameSystem.Windows.Forms# Exibe a MessageBox$resposta=[System.Windows.Forms.MessageBox]::Show(`'Quer reiniciar o computador?','Exemplo de MessageBox','YesNo','Question')
Nesse exemplo, chamamos Show(texto,título,botões,ícone).
Podemos capturar em uma variável qual o botão foi pressionado e, assim, realizar determinada ação com base no valor dessa variável:
# Verifica o botão clicado# Realiza ação, baseada no botão clicadoif($resposta-eq'Yes'){Restart-Computer-WhatIf}else{Write-Warning'Não vamos reinciar o computador.'}
Antes de começarmos essa jornada pela interface gráfica com o Powershell, é importante informar sobre o ambiente de execução.
Todos os scripts estão sendo testados em Microsoft Windows 10, com as seguintes versões:
Para a criação de interface gráfica, inicialmente precisamos adicionar o seguinte código:
1
2
3
4
5
6
7
8
9
# Windows Forms: permite criar o FormAdd-Type-AssemblyNameSystem.Windows.Forms## System Drawing: permite 'desenhar o Form' na tela.Add-Type-AssemblyNameSystem.Drawing#Vamos habilitar estilos visuais - tema do sistema operacional#Como: cores, fontes, etc[Windows.Forms.Application]::EnableVisualStyles()
Na sequência do código, criamos um objeto Form e ajustamos algumas de suas Propriedades.
Por fim, exibimos o Form criado:
# Instanciamos um objeto de Windows.Forms para criação do Form$Form1=New-ObjectSystem.Windows.Forms.Form## Criamos uma janela (Form) 600x480$Form1.ClientSize=New-ObjectSystem.Drawing.Size(600,480)# Criamos um Form fixo 'FixedToolWindow', que não irá permitir redimensionamento$Form1.FormBorderStyle=[System.Windows.Forms.FormBorderStyle]::FixedToolWindow## Propriedade Text## Este texto irá aparececer no título da janela$Form1.Text=".::. Meu Primeiro Form no Powershell .::."# Criamos o Form no centro da tela, assim não importará a resolução do monitor$Form1.StartPosition="CenterScreen"# Executamos o Form1[System.Windows.Forms.Application]::Run($Form1)## Run($Form1)
Ao executarmos o script, visualizamos que foi criado um Form centralizado, que não permite redimensionamento, e com o título e tamanho que ajustamos:
O video a seguir ilustra esse mesmo Form, porém apresenta outra maneira de declarar o início do código: