Affichage des articles dont le libellé est RichTextBox. Afficher tous les articles
Affichage des articles dont le libellé est RichTextBox. Afficher tous les articles

vendredi 5 janvier 2018

Mémo-LiteDB (LiteDB.FileStorage)

Memo-LiteDB est un exemple d'utilisation des fonctions "FileStorage" de LiteDB. Ce programme ouvre un fichier RichTextBox depuis la base de données, et l'affiche dans la fenêtre "Mémo" après l'avoir décrypté à l'aide du mot de passe saisi à l'ouverture du programme. A la fermeture de la fenêtre, le fichier est enregistré dans la base de données LiteDB après l'avoir crypté.

Memo-LiteDB


Ce programme nécessite la Dll "LiteDB.dll" v5.0.10. Créer un dossier "ldb" au même niveau que le script. Puis télécharger la Dll dans le dossier "ldb".

Site de référence : http://www.litedb.org


 

###################################################################################
#                                                                                 #
# Mémo v2.1.0                                                                     #
# http://powershell.sekki.fr                                                      #
# Validé sous : Windows 10 / PowerShell v5 / LiteDB v5                            #
#                                                                                 #
###################################################################################


#Assembly.
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")

#Chemin courant.
$global:curpath = ""
if ($psISE) { $global:curpath = Split-Path -parent $psISE.CurrentFile.Fullpath }
else        { $global:curpath = Split-Path $MyInvocation.MyCommand.Path }

#Alerte.
function Alerte([string]$TEXT,[switch]$Q)
  {
    if (!$TEXT) { Return }
    $MessageBox = [Windows.Forms.MessageBox]
    if ($Q) { $BoutonBox = [Windows.Forms.MessageBoxButtons]::YESNO
              $titre     = "Memo - Choix"
              $IconBox   = [windows.forms.MessageBoxIcon]::Question
              $MessageBox::show($TEXT,$Titre,$BoutonBox,$IconBox) }
    else    { $BoutonBox = [Windows.Forms.MessageBoxButtons]::OK
              $titre     = "Memo - Alerte"
              $IconBox   = [windows.forms.MessageBoxIcon]::Warning
              $null      = $MessageBox::show($TEXT,$Titre,$BoutonBox,$IconBox) }
  }

#Charge les fonctions LiteDB.
Try { [void][Reflection.Assembly]::LoadFile($global:curpath+"\ldb\LiteDB.dll") }
Catch { Alerte "LiteDB.dll manquant."; Return }


################################################
# Fonctions.
################################################


#Input.
function Password([string]$TEXT)
{
   $formB = New-Object Windows.Forms.Form
   $formB.text = "Mémo"
   $formB.ClientSize = New-Object System.Drawing.Size(220,70)
   $formB.MinimumSize = New-Object System.Drawing.Size(220,70)
   $labelB1 = New-Object Windows.Forms.Label
   $labelB1.Location = New-Object Drawing.Point 10,10
   $labelB1.Size = New-Object Drawing.Point 200,16
   $labelB1.Text = $TEXT
   $textB1 = New-Object Windows.Forms.MaskedTextBox
   $textB1.PasswordChar = '*'
   $textB1.Location = New-Object Drawing.Point 10,30
   $textB1.Size = New-Object Drawing.Point 200,16
   $textB1.Add_KeyDown({ if ($_.KeyCode -eq "Enter") { $formB.Close() } })
   $formB.Controls.Add($labelB1)
   $formB.Controls.Add($textB1)
   [void]$formB.ShowDialog()
   $textB1.Text
}

#Codage/décodage du texte.
function Code_Txt([string]$crcode,[string]$mk,[int]$crsw)
{
   $j = 0
   $out = ""
   $key = @()
   $lk = $mk.length
   $lc = $crcode.length
   For($i = 0;$i -lt $lk;$i++) { $d=[Convert]::ToInt32($mk[$i], 16); $key += ,$d }
   For($i = 0;$i -lt $lc;$i++)
    {
      $dec = [byte][char]$crcode[$i]
      $dec = $dec + ($key[$j] * $crsw)
      if ($dec -lt 0)   {$dec = $dec + 256}
      if ($dec -ge 256) {$dec = $dec - 256}
      $car = [char][byte]$dec
      $out = $out + $car
      $j++
      if ($j -gt $lk) {$j = 0}
    }
   return $out
}

#Fonctions RichTextBox (voir article dédié).
Function ChangeRT($rtmode,$rtdata)
{
   $rtfont  = $global:textA1.SelectionFont.FontFamily
   $rtsize  = $global:textA1.SelectionFont.Size
   $rtstyle = $global:textA1.SelectionFont.Style
   if ($rtmode -eq 1) { $rtfont = $rtdata }   #Mode 1 : Change le nom.
   if ($rtmode -eq 2) { $rtsize = $rtdata }   #Mode 2 : Change la taille.
   if ($rtmode -eq 3) {                       #Mode 3 : Change le style.
                        $tbit = $rtstyle -band $rtdata
                        if ($tbit -ne $rtdata)
                          { $rtstyle = $rtstyle -bor $rtdata }
                        else                  
                          { $rbit = 255 -bxor $rtdata
                            $rtstyle = $rtstyle -band $rbit  }
                      }
   $myfont  = New-Object System.Drawing.Font($rtfont,$rtsize,$rtstyle,3,0)
   $global:textA1.SelectionFont = $myfont
}

#Template Bride.
Function New_Button([string]$text,[int]$p)
{
   $l = 72
   $button = New-Object Windows.Forms.Button
   $button.Location = New-Object Drawing.Point ((($l-1)*($p-1))-1),-1
   $button.Size = New-Object Drawing.Point $l,23
   $button.FlatStyle = [System.Windows.Forms.FlatStyle]::Flat
   $button.BackColor = [System.Drawing.Color]::FromArgb(255,225,225,225)
   $button.Text = $text
   return $button
}


################################################
# Main.
################################################


#Initialisation.
$global:bride = 1

#Ouvrir/Créer une Base de Données.
$db = New-Object LiteDB.LiteDatabase(($curpath+"\ldb\memo.db"),$null)

#Demander le code d'ouverture.
$smdp = Password "Code d'ouverture."

#Converti le mot de passe en clé.
$imdp = ""
$l = $smdp.length
for($i = 0;$i -lt $l;$i++)
{
   if ($smdp[$i] -match "^[0-9]+$") { $imdp += $smdp[$i] }
   else { $imdp += [string][int][char]$smdp[$i] }
}

#Vérification.
if ($imdp.length -lt 4) { Alerte "Le mot de passe n'est pas valide."; Return }

#Fenêtre principale.
$formA = New-Object Windows.Forms.Form
$formA.text = "Mémo - v2.1.0"
$formA.ClientSize = New-Object System.Drawing.Size(279,367)
$formA.MinimumSize = New-Object System.Drawing.Size(300,186)
$formA.KeyPreview  = $True
$formA.Add_KeyDown({if ($_.KeyCode -eq "Escape") { $gridA1.ClearSelection() }})

#Client Size.
$csw = $formA.ClientSize.Width
$csh = $formA.ClientSize.Height

#Couleurs.
$noir  = [System.Drawing.Color]::FromArgb(255,0,0,0)
$rouge = [System.Drawing.Color]::FromArgb(255,200,0,0)
$vert  = [System.Drawing.Color]::FromArgb(255,0,200,0)
$gris1 = [System.Drawing.Color]::FromArgb(255,240,240,240)
$bleu1 = [System.Drawing.Color]::FromArgb(255,94,191,212)
$blue2 = [System.Drawing.Color]::FromArgb(255,44,40,109)

#Création du menu contextuel.
$menu1 = New-Object System.Windows.Forms.ContextMenu
$item1 = New-Object System.Windows.Forms.MenuItem -ArgumentList "Gras"
$item1.Add_Click({ ChangeRT 3 ([System.Drawing.FontStyle]::Bold) })
$rtn = $menu1.MenuItems.Add($item1)
$item2 = New-Object System.Windows.Forms.MenuItem -ArgumentList "Italique"
$item2.Add_Click({ ChangeRT 3 ([System.Drawing.FontStyle]::Italic) })
$rtn = $menu1.MenuItems.Add($item2)
$item3 = New-Object System.Windows.Forms.MenuItem -ArgumentList "Souligne"
$item3.Add_Click({ ChangeRT 3 ([System.Drawing.FontStyle]::Underline) })
$rtn = $menu1.MenuItems.Add($item3)
$rtn = $menu1.MenuItems.Add("-")
$item4 = New-Object System.Windows.Forms.MenuItem -ArgumentList "Noir"
$item4.Add_Click({ $global:textA1.SelectionColor = $noir })
$rtn = $menu1.MenuItems.Add($item4)
$item5 = New-Object System.Windows.Forms.MenuItem -ArgumentList "Rouge"
$item5.Add_Click({ $global:textA1.SelectionColor = $rouge })
$rtn = $menu1.MenuItems.Add($item5)
$item6 = New-Object System.Windows.Forms.MenuItem -ArgumentList "Vert"
$item6.Add_Click({ $global:textA1.SelectionColor = $vert })
$rtn = $menu1.MenuItems.Add($item6)

#Création d'une RichTextBox.
$textA1 = New-Object Windows.Forms.RichTextBox
$textA1.Location = New-Object Drawing.Point -1, 21
$textA1.Size = New-Object Drawing.Point ($csw+2),($csh-36)
$textA1.Font = New-Object System.Drawing.Font("Lucida Console","10",0,3,0)
$textA1.DetectUrls = $true   #Active les liens Hyperlink.
$textA1.add_LinkClicked({ Invoke-Expression "start $($_.LinkText)" })
$textA1.ContextMenu = $menu1
$textA1.Visible = $true

#DataGrid - DataGridView.
$gridA1 = New-Object System.Windows.Forms.DataGridView
$gridA1.Location = New-Object Drawing.Point -1, 21
$gridA1.Size = New-Object Drawing.Point ($csw+2),($csh-36)
$gridA1.ScrollBars = "Vertical"
$gridA1.ReadOnly = $true
$gridA1.AutoSize = $false
$gridA1.GridColor = "Black"
$gridA1.AllowUserToResizeRows = $false
$gridA1.BorderStyle = [System.Windows.Forms.BorderStyle]::None
$gridA1.BackgroundColor = $gris1
$gridA1.DefaultCellStyle.SelectionBackColor = $bleu1
#$gridA1.SelectionMode = "FullRowSelect"
$gridA1.MultiSelect = $false


#DataGrid - Titre et Entête.
$gridA1.RowHeadersVisible    = $false
$gridA1.ColumnHeadersVisible = $true
$gridA1.ColumnHeadersHeightSizeMode = "DisableResizing"
$gridA1.EnableHeadersVisualStyles = $false
$gridA1.ColumnHeadersDefaultCellStyle.BackColor = $blue2
$gridA1.ColumnHeadersDefaultCellStyle.ForeColor = "White"
$gridA1.ColumnHeadersBorderStyle = "Single"
$gridA1.Visible = $false
$gridA1.ContextMenu = $menu1

#Script : #Charge les données dans la DataGrid.
$script1 = {
             $ascm = [System.Windows.Forms.DataGridViewAutoSizeColumnMode]::Fill
             $grille = $true; $i = 0; $noah = $false
             $lines = ($textA1.Text).split("`r`n")
             foreach ($line in $lines)
              {
                if ($line -notmatch "^.*;.*$") { $grille = $false}
              }
             if ($grille)
               {
                 $gridA1.Columns.Clear()
                 $textA1.Visible = $false
                 $labels = $lines[0].split(";")
                 $gridA1.ColumnCount = $labels.length
                 foreach ($label in $labels)
                  {
                    $gridA1.Columns[$i++].Name = $label
                  }
                 foreach($line in $lines)
                  {
                    if ($noah) { [void]$gridA1.Rows.Add($line.split(";")) }
                    else       { $noah = $true } }
                 foreach($column in $gridA1.Columns)
                  {
              
                    $column.SortMode = "NotSortable"
                    $column.AutoSizeMode = $ascm
                  }  
                 $gridA1.Visible = $true
                 $gridA1.ClearSelection()
                 $menu2 = New-Object System.Windows.Forms.ContextMenuStrip
                 [void]$menu2.Items.Add("Copier")
                 [void]$menu2.Items.Add("Editer")
                 $menu2.Add_ItemClicked({
Switch ($_.ClickedItem) {
Editer { $textA1.Visible = $true; $gridA1.Visible = $false }
Copier { $r = $gridA1.SelectedCells[0].RowIndex
          $c = $gridA1.SelectedCells[0].ColumnIndex
          [Windows.Forms.Clipboard]::Clear()
          [Windows.Forms.Clipboard]::SetText($gridA1.Rows[$r].Cells[$c].Value) }
        }  
                                       })
                 foreach($column in $gridA1.Columns)
                  {
                    $column.ContextMenuStrip = $menu2
                  }
               }
             else { $textA1.Visible = $true; $gridA1.Visible = $false }
           }

#Menu 1.
$buttonA1 = New_Button "I" 1
$buttonA1.Add_Click({
                      Switch ($global:bride)
                       {
                         1 { $global:bride1 = $textA1.Rtf }
                         2 { $global:bride2 = $textA1.Rtf }
                         3 { $global:bride3 = $textA1.Rtf }
                         4 { $global:bride4 = $textA1.Rtf }
                       }
                      Try { $textA1.Rtf = $global:bride1 }
                      Catch { $textA1.Text = $global:bride1 }
                      $global:bride = 1
                      &$script1
                   })
#Menu 2.
$buttonA2 = New_Button "II" 2
$buttonA2.Add_Click({
                      Switch ($global:bride)
                       {
                         1 { $global:bride1 = $textA1.Rtf }
                         2 { $global:bride2 = $textA1.Rtf }
                         3 { $global:bride3 = $textA1.Rtf }
                         4 { $global:bride4 = $textA1.Rtf }
                       }
                      Try { $textA1.Rtf = $global:bride2 }
                      Catch { $textA1.Text = $global:bride2 }
                      $global:bride = 2
                      &$script1
                   })
#Menu 3.
$buttonA3 = New_Button "III" 3
$buttonA3.Add_Click({
                      Switch ($global:bride)
                       {
                         1 { $global:bride1 = $textA1.Rtf }
                         2 { $global:bride2 = $textA1.Rtf }
                         3 { $global:bride3 = $textA1.Rtf }
                         4 { $global:bride4 = $textA1.Rtf }
                       }
                      Try { $textA1.Rtf = $global:bride3 }
                      Catch { $textA1.Text = $global:bride3 }
                      $global:bride = 3
                      &$script1
                   })
#Menu 4.
$buttonA4 = New_Button "IV" 4
$buttonA4.Add_Click({
                      Switch ($global:bride)
                       {
                         1 { $global:bride1 = $textA1.Rtf }
                         2 { $global:bride2 = $textA1.Rtf }
                         3 { $global:bride3 = $textA1.Rtf }
                         4 { $global:bride4 = $textA1.Rtf }
                       }
                      Try { $textA1.Rtf = $global:bride4 }
                      Catch { $textA1.Text = $global:bride4 }
                      $global:bride = 4
                      &$script1
                   })

#Lecture des fichiers dans la base.
$global:bride1 = "";$global:bride2 = "";$global:bride3 = "";$global:bride4 = ""
$file = $db.FileStorage.FindById("$/memo/bride1.rtf")
if ($file) { $sr = New-Object System.IO.StreamReader($file.OpenRead())
             $global:bride1 = Code_Txt $sr.ReadToEnd() $imdp -1 }
$file = $db.FileStorage.FindById("$/memo/bride2.rtf")
if ($file) { $sr = New-Object System.IO.StreamReader($file.OpenRead())
             $global:bride2 = Code_Txt $sr.ReadToEnd() $imdp -1 }
$file = $db.FileStorage.FindById("$/memo/bride3.rtf")
if ($file) { $sr = New-Object System.IO.StreamReader($file.OpenRead())
             $global:bride3 = Code_Txt $sr.ReadToEnd() $imdp -1 }
$file = $db.FileStorage.FindById("$/memo/bride4.rtf")
if ($file) { $sr = New-Object System.IO.StreamReader($file.OpenRead())
             $global:bride4 = Code_Txt $sr.ReadToEnd() $imdp -1 }  

#Chargement initial.
Try { $textA1.Rtf = $global:bride1 } Catch { $textA1.Text = $global:bride1 }
&$script1

#Liens.
$formA.controls.add($textA1)
$formA.controls.add($gridA1)
$formA.controls.add($buttonA1)
$formA.controls.add($buttonA2)
$formA.controls.add($buttonA3)
$formA.controls.add($buttonA4)

#Affiche le tout.
$formA.Add_Resize({
                    $csw = $formA.ClientSize.Width
                    $csh = $formA.ClientSize.Height
                    $textA1.Size = New-Object Drawing.Point ($csw+2),($csh-36)
                    $gridA1.Size = New-Object Drawing.Point ($csw+2),($csh-36)
                 })
$formA.Add_FormClosing({
           #Mémorise le contenu dans la fenêtre.
           Switch ($global:bride)
            {
              1 { $global:bride1 = $textA1.Rtf }
              2 { $global:bride2 = $textA1.Rtf }
              3 { $global:bride3 = $textA1.Rtf }
              4 { $global:bride4 = $textA1.Rtf }
            }
           #Sauvegarde des brides.
           if ((Alerte "Voulez-vous sauvegarder les infos ?" -Q) -eq "Yes")
             {
               #Bride 1:
               $tx = Code_Txt $global:bride1 $imdp 1
               [byte[]] $bytes = [System.Text.Encoding]::UTF8.GetBytes($tx)
               $ms = New-Object System.IO.MemoryStream($bytes,0,$bytes.Length)
               $db.FileStorage.Upload("$/memo/bride1.rtf", "bride1.rtf", $ms)
               #Bride 2:
               $tx = Code_Txt $global:bride2 $imdp 1
               [byte[]] $bytes = [System.Text.Encoding]::UTF8.GetBytes($tx)
               $ms = New-Object System.IO.MemoryStream($bytes,0,$bytes.Length)
               $db.FileStorage.Upload("$/memo/bride2.rtf", "bride2.rtf", $ms)
               #Bride 3:
               $tx = Code_Txt $global:bride3 $imdp 1
               [byte[]] $bytes = [System.Text.Encoding]::UTF8.GetBytes($tx)
               $ms = New-Object System.IO.MemoryStream($bytes,0,$bytes.Length)
               $db.FileStorage.Upload("$/memo/bride3.rtf", "bride3.rtf", $ms)
               #Bride 4:
               $tx = Code_Txt $global:bride4 $imdp 1
               [byte[]] $bytes = [System.Text.Encoding]::UTF8.GetBytes($tx)
               $ms = New-Object System.IO.MemoryStream($bytes,0,$bytes.Length)
               $db.FileStorage.Upload("$/memo/bride4.rtf", "bride4.rtf", $ms)
             }
                      })

[void]$formA.ShowDialog()

#Compresser la base de données.
[void]$db.Rebuild()

#Fermer la base de données.
$db.Dispose()

#Fin.

mardi 6 août 2013

Ajouter une RichTextBox dans une fenêtre.

Dans l'exemple suivant, nous allons voir comment créer une RichTextBox dans une fenêtre. Bien entendu je vais également ajouter quelques contrôles pour mettre en forme le texte.

 
#Ce script affiche une fenêtre avec une RichTextBox.
#En haut de la fenêtre, des boutons permettent de changer
#la mise en forme du texte (Police, Taille, couleur, ...).

#Chemin du fichier .rtf.
$filertb = "C:\note.rtf"

#Cette fonction permet de modifier un des paramètres de la police,
#tout en conservant les autres.
Function ChangeRT($rtmode,$rtdata)
 {
   #Je mémorise les valeurs actuelles du texte sélectionné.
   $rtfont  = $global:richtb.SelectionFont.FontFamily
   $rtsize  = $global:richtb.SelectionFont.Size
   $rtstyle = $global:richtb.SelectionFont.Style
   #Puis je change la valeur spécifique en fonction du mode :
   #1-Font, 2-Size, 3-Style.
   if ($rtmode -eq 1) { $rtfont = $rtdata }   #Mode 1 : Change la police.
   if ($rtmode -eq 2) { $rtsize = $rtdata }   #Mode 2 : Change la taille.
   if ($rtmode -eq 3)
    {
      #Mode 3 : Change une des caractéristiques du style (toggle).
      #Attention le style est en mode binaire. Je vais donc utiliser des
      #opérateur binaire pour calculer tout ça (band, bor et bxor).
      #Note : Bit 1 = Gras, bit 2 = Italic, bit 3 = Souligné, ...
      #J'isole le bit du style qui m'interesse dans le style courant.
      $tbit = $rtstyle -band $rtdata
      #Puis, je regarde si mon style est déjà appliqué ou non.
      if ($tbit -ne $rtdata)
        {
          #Si le bit est a 0, j'ajoute mon style au style courant.
          $rtstyle = $rtstyle -bor $rtdata
        }
      else
        {
          #Si le bit est a 1, j'inverse les bits de mon style.
          $rbit = 255 -bxor $rtdata
          #Puis je soustrais mon style au style courant.
          $rtstyle = $rtstyle -band $rbit
        }
    }
   #J'applique le changement sur le texte sélectionné avec "SelectionFont".
   $global:richtb.SelectionFont = New-Object System.Drawing.Font($rtfont, $rtsize, $rtstyle, 3, 0)
 }

#Ouvre une fenêtre.
[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$form = New-Object Windows.Forms.Form
$form.text = "Exemple de RichTextBox."
$form.Size = New-Object System.Drawing.Size(367,500)

#Bloque le redimensionnement de la fenêtre.
$form.minimumSize = New-Object System.Drawing.Size(367,500)
$form.maximumSize = New-Object System.Drawing.Size(367,500)

#Bouton sauvegarder.
$bouton1 = New-Object Windows.Forms.Button
$bouton1.Location = New-Object Drawing.Point 0,0
$bouton1.Size = New-Object System.Drawing.Size(24,22)
$bouton1.Font = New-Object System.Drawing.Font("Wingdings","12",0,3,0)
$bouton1.text = "="

#Pour sauvegarder le text, j'utilise "SaveFile".
$bouton1.add_click({ $global:richtb.SaveFile($filertb) })

#Liste déroulante "Police" (ComboBox).
$liste1 = New-Object System.Windows.Forms.Combobox
$liste1.Location = New-Object Drawing.Point 29,1
$liste1.Size = New-Object System.Drawing.Size(170,30)
$liste1.DropDownStyle = "DropDownList"
$liste1.Items.AddRange(("Arial", "Lucida Console", "Tahoma", "Time New Roman", "Verdana"))
$liste1.SelectedIndex = 1

#Pour modifier la police, j'utilise "SelectionFont" (voir fonction). 
$liste1.add_SelectedValueChanged({ ChangeRT 1 $liste1.Text })

#Liste déroulante "Taille" (ComboBox).
$liste2 = New-Object System.Windows.Forms.Combobox
$liste2.Location = New-Object Drawing.Point 200,1
$liste2.Size = New-Object System.Drawing.Size(49,30)
$liste2.DropDownStyle = "DropDownList"
$liste2.Items.AddRange(("8","9","10","11","12","14","16","18","20","22","24"))
$liste2.SelectedIndex = 2

#Pour modifier la taille, j'utilise "SelectionFont" (voir fonction).
$liste2.add_SelectedValueChanged({ ChangeRT 2 $liste2.Text })

#Bouton de style - Gras (Bold).
$bouton2 = New-Object Windows.Forms.Button
$bouton2.Location = New-Object Drawing.Point 255,0
$bouton2.Size = New-Object System.Drawing.Size(24,22)
$bouton2.Font = New-Object System.Drawing.Font("Cambria","10",[System.Drawing.FontStyle]::Bold,3,0)
$bouton2.text = "B"

#Pour modifier le style, j'utilise "SelectionFont" (voir fonction).
$bouton2.add_click({ ChangeRT 3 ([System.Drawing.FontStyle]::Bold) })

#Bouton de style - Italique (Italic).
$bouton3 = New-Object Windows.Forms.Button
$bouton3.Location = New-Object Drawing.Point 278,0
$bouton3.Size = New-Object System.Drawing.Size(24,22)
$bouton3.Font = New-Object System.Drawing.Font("Cambria","10",([System.Drawing.FontStyle]::Bold -bor [System.Drawing.FontStyle]::Italic),3,0)
$bouton3.text = "I"
$bouton3.add_click({ ChangeRT 3 ([System.Drawing.FontStyle]::Italic) })

#Bouton de style - Souligné (Underline).
$bouton4 = New-Object Windows.Forms.Button
$bouton4.Location = New-Object Drawing.Point 301,0
$bouton4.Size = New-Object System.Drawing.Size(24,22)
$bouton4.Font = New-Object System.Drawing.Font("Cambria","10",([System.Drawing.FontStyle]::Bold -bor [System.Drawing.FontStyle]::Underline),3,0)
$bouton4.text = "U"
$bouton4.add_click({ ChangeRT 3 ([System.Drawing.FontStyle]::Underline) })

#Création d'une image (PictureBox).
$image1 = New-Object System.Windows.Forms.pictureBox
$image1.Location = New-Object Drawing.Point 330,1
$image1.Size = New-Object System.Drawing.Size(10,10)
$image1.backcolor = "Black"

#Pour modifier la couleur, j'utilise "SelectionColor".
#Note : FromArgb(255,0,0,0) -> FromArgb(Alpha, Rouge, Vert, Blue).
$image1.add_click({ $global:richtb.SelectionColor = [System.Drawing.Color]::FromArgb(255,0,0,0) })

#Création d'une image (PictureBox).
$image2 = New-Object System.Windows.Forms.pictureBox
$image2.Location = New-Object Drawing.Point 340,1
$image2.Size = New-Object System.Drawing.Size(10,10)
$image2.backcolor = "Red"
$image2.add_click({ $global:richtb.SelectionColor = [System.Drawing.Color]::FromArgb(255,255,0,0) })

#Création d'une image (PictureBox).
$image3 = New-Object System.Windows.Forms.pictureBox
$image3.Location = New-Object Drawing.Point 330,11
$image3.Size = New-Object System.Drawing.Size(10,10)
$image3.backcolor = "Green"
$image3.add_click({ $global:richtb.SelectionColor = [System.Drawing.Color]::FromArgb(255,0,255,0) })

#Création d'une image (PictureBox).
$image4 = New-Object System.Windows.Forms.pictureBox
$image4.Location = New-Object Drawing.Point 340,11
$image4.Size = New-Object System.Drawing.Size(10,10)
$image4.backcolor = "Blue"
$image4.add_click({ $global:richtb.SelectionColor = [System.Drawing.Color]::FromArgb(255,0,0,255) })

#Création d'une RichTextBox (RichTextBox).
$global:richtb = New-Object Windows.Forms.RichTextBox
$global:richtb.Location = New-Object Drawing.Point 0,22
$global:richtb.Size = New-Object System.Drawing.Size(352,444)
$global:richtb.Font = New-Object System.Drawing.Font("Lucida Console","10",0,3,0)

#Active la détection des liens HyperText dans la richtextbox.
$global:richtb.DetectUrls = $true   #Active les liens Hyperlink.
$global:richtb.add_LinkClicked({ Invoke-Expression "start $($_.LinkText)" })

#Charge le fichier rtf au lancement du programme.
if (Test-Path $filertb) { $global:richtb.LoadFile($filertb) }

#Attache les contrôles à la fenêtre.
$form.controls.add($global:richtb)
$form.controls.add($bouton1)
$form.controls.add($bouton2)
$form.controls.add($bouton3)
$form.controls.add($bouton4)
$form.controls.add($liste1)
$form.controls.add($liste2)
$form.controls.add($image1)
$form.controls.add($image2)
$form.controls.add($image3)
$form.controls.add($image4)

#Affiche le tout.
$form.ShowDialog()

#Fin.

J'imagine que vous avez certainement remarqué le petit passage sur la gestion des bits dans la fonction ChangeRT. Pour ceux qui parle pas binaire couramment voici quelques explications.

En général on connais bien les décimales (base 10) dont l'unité va de 0 à 9. En informatique, a la base 10 s'ajoute souvent la base 16 (Hexa) et la base 2 (le binaire). Le binaire a une unité qui va de 0 a 1. sin on compte jusqu'à 7 en binaire cela donne :
0000 (= 0 en décimale)
1000 (= 1 en décimale)
0100 (= 2 en décimale)
1100 (= 3 en décimale)
0010 (= 4 en décimale)
1010 (= 5 en décimale)
0110 (= 6 en décimale)
1110 (= 7 en décimale)
Dans notre cas, chaque rang correspond à un style :
Rang 1 = Bold
Rang 2 = Italic
Rang 3 = Underline
Ainsi en binaire :
1000 = Bold
0100 = Italic
0010 = Underline 
Bien sur on peu mélanger les styles :
1100 = Bold et Italic
0110 = Italic et Underline
1110 = Bold, Italic et Underline
Dans la fonction le but est de changer l'un des rangs. Pour cela il faut connaitre l'état du rang que l'on souhaite changer et le changer en 1 ou en 0 sans toucher aux autres rangs. Pour cela j'utilise les 3 opérateurs -band -bor et bxor :
-bor (ou Bit OR) va faire regarder chaque rang de deux binaire et appliquer une opération "ou".
-and (ou Bit AND) va faire regarder chaque rang de deux binaire et appliquer une opération "et".
-bxor (ou Bit XOR) va faire regarder chaque rang et appliquer une opération "ou exclusif".
Par exemple :
1010 -bor 0010 = 1010
1010 -band 0010 = 0010
1010 -bxor 0010 = 1000
Si a ce stade vous êtes largué désolé ^^.
Si vous avez accroché jusque là, la suite devrait vous parler.

Dans mon script je veux modifier un des rangs tout en conservant les autres intactes. Pour l'exemple je vais prendre en entrée le style bold (1000). Imaginons que j'ai déjà appliqué le style Italic (0100) sur mon texte.
1- Je récupère mon style courant.
$rtstyle = $global:richtb.SelectionFont.Style
$rtstyle = 0100

2- J'extrais le rang que je veux tester dans le style courant.
$tbit = $rtstyle -band $rtdata
$tbit = 0100 -band 1000 = 0000
Note : $rtdata ne peut avoir qu'un seul de ses rangs à 1.

3- Je teste si le rang extrait est égale au rang recherché.
if ($tbit -ne $rtdata)
if (0 -ne 1) 
Dans ce cas il s'agit d'une bonne vielle comparaison décimale normal.

4- Si le style testé n'est pas présent, je l'ajoute au style courant.
$rtstyle = $rtstyle -bor $rtdata
$rtstyle = 0100 -bor 1000 = 1100 = Bold et Italic

Pour le deuxième cas je vais prendre en entrée le style bold (1000). Imaginons que j'ai déjà appliqué le style Bold et Italic (1100) sur mon texte.
1- Je récupère mon style courant.
$rtstyle = $global:richtb.SelectionFont.Style
$rtstyle = 1100

2- J'extrais le rang que je veux tester dans le style courant.
$tbit = $rtstyle -band $rtdata
$tbit = 1100 -band 1000 = 1000
Note : $rtdata ne peut avoir qu'un seul de ses rangs à 1.

3- Je teste si le rang extrait est égale au rang recherché.
if ($tbit -ne $rtdata)
if (1 -ne 1) 
Dans ce cas il s'agit d'une bonne vielle comparaison décimale normal.

4- Si le style testé est présent, je dois de retirer du style courant.
4.1- Pour cela je vais inverser tout les rangs de $rtdata.
$rbit = 15 -bxor $rtdata
$rbit = 1111 -bxor 1000 = 0111

4.2- Puis je soustrais mon style au style courant.
$rtstyle = $rtstyle -band $rbit
$rtstyle = 1100 -band 0111 = 0100 = Italic