Mostrando postagens com marcador interface gráfica. Mostrar todas as postagens
Mostrando postagens com marcador interface gráfica. Mostrar todas as postagens

terça-feira, 31 de outubro de 2017

Efeito gradiente - parte 2

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.
$lgb = New-Object System.Drawing.Drawing2D.LinearGradientBrush`
($p1, $p2, $c1, $c2)
$pen = New-Object System.Drawing.Pen($lgb)
$pen.Width = 1
$g.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::Default

O resultado:

Mudando apenas $pen.Width=2

Alterando [System.Drawing.Drawing2D.SmoothingMode]::HighQuality, mas mantendo $pen.Width=1

Alterando [System.Drawing.Drawing2D.SmoothingMode]::HighQuality e $pen.Width=2

segunda-feira, 30 de outubro de 2017

Desenhando linhas com efeito gradiente

Aqui vamos demonstrar como explorar um efeito gradiente na composição da cor de uma linha.

Para tanto, precisamos dos seguintes componentes principais:
  • Definimos form.CreateGraphics
  • Definimos 2 pontos p1 e p2 para traçar a linha
  • Criamos o objeto LinearGradientBrush
  • Criamos o objeto pen
  • Traçamos a linha
[System.Drawing.Graphics]$g = $f.CreateGraphics()
$lgb = New-Object System.Drawing.Drawing2D.LinearGradientBrush($p1, $p2, $c1, $c2)
$pen = New-Object System.Drawing.Pen($lgb)
$g.DrawLine($pen, $p1, $p2)


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();

Function line([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-Object System.Drawing.Point(190, 180)
    $p2 = New-Object System.Drawing.Point((190+$r*[math]::Cos($ang)), (180+$r*[math]::Sin($ang)))
    $lgb = New-Object System.Drawing.Drawing2D.LinearGradientBrush($p1, $p2, $c1, $c2)
    $pen = New-Object System.Drawing.Pen($lgb)
    $g.DrawLine($pen, $p1, $p2)
    $g.Dispose()
}

$f = New-Object Windows.Forms.Form
$f.Width = 400
$f.Height = 400
$f.Show()
$f.Refresh()

for ([Int32]$angulo=0;$angulo -lt 360;$angulo++) {
    line $angulo 'Green' 'Blue'
    Start-Sleep -Milliseconds 50
}

Start-Sleep -s 5
$f.Close()
$f.Dispose()

Segue o resultado:

quarta-feira, 25 de outubro de 2017

Desenhando com Pixels

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.

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

##########################################################
Function plot([Int32]$x, [Int32] $y, [String] $cor) {
    $img.SetPixel($x, $y, $cor) 
}

##########################################################
Function retaBresenham ([Int32]$x1, [Int32]$y1, [Int32]$x2, [Int32]$y2, [String] $cor) {
    [Int32] $dx = $x2 - $x1
    [Int32] $dy = $y2 - $y1
    [Int32] $stepx, $stepy

    if ($dy -lt 0) { 
        $dy = -$dy 
        $stepy = -1
    }
    else { $stepy = 1 }

    if ($dx -lt 0) { 
        $dx = -$dx 
        $stepx = -1
    }
    else { $stepx = 1 }

    $dy = $dy -shl 1
    $dx = $dx -shl 1

    plot $x1 $y1 $cor

    if ($dx -gt $dy) {
        [Int32] $fraction = $dy - ($dx -shr 1)
        while ($x1 -ne $x2) {
            if ($fraction -ge 0) {
                $y1 += $stepy
                $fraction -= $dx
            }
            $x1 += $stepx
            $fraction += $dy
            plot $x1 $y1 $cor
        }
    }
    else {
        [Int32] $fraction = $dx - ($dy -shr 1)
        while ($y1 -ne $y2) {
            if ($fraction -ge 0) {
                $x1 += $stepx
                $fraction -= $dy
            }
            $y1 += $stepy
            $fraction += $dx
            plot $x1 $y1 $cor
        }
    }
    
}

##########################################################
Function triangulo([Int32]$x1, [Int32]$y1, [Int32]$h, [String]$cor) {
    [Int32] $lado = ([math]::Sqrt(4*$h*$h/3))
    retaBresenham $x1 $y1 ($x1-($lado/2)) ($y1+$h) $cor
    retaBresenham $x1 $y1 ($x1+($lado/2)) ($y1+$h) $cor
    retaBresenham ($x1-($lado/2)) ($y1+$h) ($x1+($lado/2)) ($y1+$h) $cor
}

##########################################################
Function quadrado([Int32]$x1, [Int32]$y1, [Int32]$tam, [String]$cor) {
    retaBresenham $x1 $y1 ($x1+$tam) $y1 $cor
    retaBresenham $x1 $y1 $x1 ($y1+$tam) $cor
    retaBresenham $x1 ($y1+$tam) ($x1+$tam) ($y1+$tam) $cor
    retaBresenham ($x1+$tam) $y1 ($x1+$tam) ($y1+$tam) $cor
}

##########################################################
$B64 = "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAHgAlgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Z"
$imgBytes = [Convert]::FromBase64String($B64)
$imgStream = New-Object IO.MemoryStream($imgBytes, 0, $imgBytes.Length)
$img = [System.Drawing.Image]::FromStream($imgStream)
[Windows.Forms.Application]::EnableVisualStyles()
$form = New-Object Windows.Forms.Form
$form.Width = $img.Size.Width;
$form.Height = $img.Size.Height;
$pictureBox = new-object Windows.Forms.PictureBox
$pictureBox.Width =  $img.Size.Width;
$pictureBox.Height =  $img.Size.Height;

### Pontos
for ([Int32]$x=30;$x -lt 55;$x+=5) {
    plot $x 50 'Red'
    plot $x 60 'Red'
    plot $x 70 'Red'
}
### Reta
retaBresenham 0 0 585 440 'Blue'
retaBresenham 50 0 535 440 'Orange'
### Triângulo
triangulo 100 100 100 'Green'
triangulo 100 120 70 'Gray'
### Quadrado
quadrado 250 70 100 'Red'
quadrado 270 90 60 'Black'

$pictureBox.Image = $img;
$form.controls.add($pictureBox)
$form.Add_Shown( { $form.Activate() } )
$form.ShowDialog()

Neste exemplo, estamos criando alguns pontos, 2 retas, 2 triângulos e 2 quadrados.

quinta-feira, 7 de setembro de 2017

RSS no Out-GridView

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:
cls
$channelURI = "http://g1.globo.com/dynamo/tecnologia/rss2.xml"
$noticia = @()

$web = New-Object Net.WebClient
[xml]$resp = $web.DownloadString($channelURI) 
$noticia += $resp.rss.channel.title
$resp.rss.channel.item | ForEach { $noticia += $_.Title + ' - [' + $_.pubDate + ']' }

$noticia | Out-File $PSScriptRoot'\temp.txt' -Encoding default
Get-Content $PSScriptRoot'\temp.txt' -Encoding UTF8 | Out-GridView


Como resultado, temos o seguinte Out-GridView:

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:

quarta-feira, 6 de setembro de 2017

Imagem de Fundo no Form

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.

Para atribuirmos a imagem a partir de um arquivo, podemos utilizar o método FromFile de System.Drawing.Image

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 _Main

Function _Main {
    $FormImg = New-Object System.Windows.Forms.Form 
    $FormImg.ClientSize = New-Object System.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-Object System.Windows.Forms.Button
    $BotaoSair.Font = New-Object System.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-Object System.Drawing.Size(80, 35)
    $BotaoSair_X = ($FormImg.ClientSize.Width / 2) - ($BotaoSair.Width / 2)
    $BotaoSair_Y = $FormImg.ClientSize.Height - 50
    $BotaoSair.Location = New-Object System.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.

Códigos podem ser obtidos aqui.

domingo, 27 de agosto de 2017

Criando um Form com Transparência

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 -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
[Windows.Forms.Application]::EnableVisualStyles()

$Form = New-Object System.Windows.Forms.Form
$Form.Text = ".:: Configurando uma Transparência para o Form ::."
$Form.ClientSize = New-Object System.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.

Referência:
Propriedade Form.Opacity

sábado, 26 de agosto de 2017

Mudar a cor de fundo

Mudar a cor de fundo do Form é simples, basta alterar a Propriedade Backcolor.

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
[Windows.Forms.Application]::EnableVisualStyles()

#
#Form3
#
$Form3 = New-Object System.Windows.Forms.Form
$Form3.Text = ".:: Mudando a Cor de Fundo ::."
$Form3.ClientSize = New-Object System.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].

Criando Controls no Form

Agora vamos aprender a criar algumas coisas em nosso Form, adicionando alguns controles [Controls]. Há muitos outros.

Iniciamos o script, como de costume:
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
[Windows.Forms.Application]::EnableVisualStyles()


Criamos o Form:
#
#Form0
#
$Form0 = New-Object System.Windows.Forms.Form
$Form0.Text = "Controls"
$Form0.ClientSize = New-Object System.Drawing.Size(373, 356)


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).

Adicionamos um botão [button]:
#
#Button0
#
$Button0 = New-Object System.Windows.Forms.Button
$Button0.Text = "Button"
$Button0.Size = New-Object System.Drawing.Size(75, 42)
$Button0.Location = New-Object System.Drawing.Point(18, 40)
$Form0.Controls.Add($Button0)


Adicionamos checkbox:
#
#CheckBox0
#
$CheckBox0 = New-Object System.Windows.Forms.CheckBox
$CheckBox0.Text = "CheckBox"
$CheckBox0.Size = New-Object System.Drawing.Size(104, 24)
$CheckBox0.Location = New-Object System.Drawing.Point(110, 48)
$Form0.Controls.Add($CheckBox0)


Adicionamos combobox
#
#ComboBox0
#
$ComboBox0 = New-Object System.Windows.Forms.ComboBox
$ComboBox0.Text = "ComboBox"
$ComboBox0.Size = New-Object System.Drawing.Size(121, 21)
$ComboBox0.Location = New-Object System.Drawing.Point(222, 50)
$Form0.Controls.Add($ComboBox0)


Adicionamos um label:
#
#Label0
#
$Label0 = New-Object System.Windows.Forms.Label
$Label0.AutoSize = $true
$Label0.Font = New-Object System.Drawing.Font("Arial", 14, [System.Drawing.FontStyle]::Bold)
$Label0.Text = "Eu sou um LABEL"
$Label0.Size = New-Object System.Drawing.Size(313, 27)
$Label0.Location = New-Object System.Drawing.Point(15, 9)
$Form0.Controls.Add($Label0)


Adicionamos um radiobutton:
#
#RadioButton0
#
$RadioButton0 = New-Object System.Windows.Forms.RadioButton
$RadioButton0.Text = "RadioButton"
$RadioButton0.Size = New-Object System.Drawing.Size(104, 24)
$RadioButton0.Location = New-Object System.Drawing.Point(110, 86)
$Form0.Controls.Add($RadioButton0)


Adicionamos richtextbox:
#
#RichTextBox0
#
$RichTextBox0 = New-Object System.Windows.Forms.RichTextBox
$RichTextBox0.Text = "RichTextBox"
$RichTextBox0.Size = New-Object System.Drawing.Size(100, 50)
$RichTextBox0.Location = New-Object System.Drawing.Point(221, 89)
$Form0.Controls.Add($RichTextBox0)


Adicionamos textbox:
#
#TextBox0
#
$TextBox0 = New-Object System.Windows.Forms.TextBox
$TextBox0.Text = "TextBox"
$TextBox0.Size = New-Object System.Drawing.Size(100, 20)
$TextBox0.Location = New-Object System.Drawing.Point(19, 121)
$Form0.Controls.Add($TextBox0)


Adicionamos datetimepicker:
#
#DateTimePicker0
#
$DateTimePicker0 = New-Object System.Windows.Forms.DateTimePicker
$DateTimePicker0.Size = New-Object System.Drawing.Size(200, 20)
$DateTimePicker0.Location = New-Object System.Drawing.Point(20, 167)
$Form0.Controls.Add($DateTimePicker0)


Por fim, exibimos o Form:
[void]$Form0.ShowDialog()



A seguir, um video demonstrando também a adição de Controls a um Form:

[Acesso ao código do vídeo]

Criando uma MessageBox

A classe System.Windows.Forms.MessageBox possui vários métodos Show [veja aqui].

Através deles, podemos exibir uma MessageBox personalizada.

Add-Type -AssemblyName System.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 clicado
if ($resposta -eq 'Yes')
{
  Restart-Computer -WhatIf
}
else
{
  Write-Warning 'Não vamos reinciar o computador.'
}


Ao executarmos o script o resultado é o seguinte:

sexta-feira, 25 de agosto de 2017

Meu primeiro Form

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 Form
Add-Type -AssemblyName System.Windows.Forms

## System Drawing: permite 'desenhar o Form' na tela.
Add-Type -AssemblyName System.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-Object System.Windows.Forms.Form 

## Criamos uma janela (Form) 600x480
$Form1.ClientSize = New-Object System.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:


Download Scripts em:
https://github.com/JefersonBdA/PowershellGUI

Referências:
https://docs.microsoft.com/en-us/cpp/dotnet/windows-forms-mfc-programming-differences https://kktechkaizen.blogspot.com.br/2009/10/wpf-vs-windows-forms-vs-mfc.html