mardi 4 décembre 2012

Ajouter un menu contextuel.

Dans toutes nos applications nous avons l'habitude de voir apparaître un menu contextuel lorsque l'on fait un clique droit. C'est tellement naturel que parfois j'oublie que ça aussi il faut le programmer.

 
#Menu contextuel sur un contrôle.
[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

#Fonctions déclenché lorsque l'on sélection une des lignes du menu contextuel
function ml1() { Write-Host "Vous avez sélectionné la 1er ligne du menu" }
function ml2() { Write-Host "Vous avez sélectionné la 2éme ligne du menu" }

#Ouvre une fenêtre.
$form = New-Object Windows.Forms.Form
$form.text = "Menu contextuel"            
$form.Size = New-Object System.Drawing.Size(190,210)

#Création d'une image (PictureBox).
$image1 = New-Object System.Windows.Forms.pictureBox
$image1.Location = New-Object Drawing.Point 40,40
$image1.Size = New-Object System.Drawing.Size(100,100)
$image1.image = [system.drawing.image]::FromFile("C:\jumbor.jpg")

#Création du menu contextuel.
$menu1 = New-Object System.Windows.Forms.ContextMenu

#Création des lignes du menu.
$item1 = New-Object System.Windows.Forms.MenuItem -ArgumentList "Choix 1"
$item2 = New-Object System.Windows.Forms.MenuItem -ArgumentList "Choix 2"

#Action pour chaque ligne.
$item1.Add_Click({ ml1 })
$item2.Add_Click({ ml2 })

#Attache les lignes au menu.
$menu1.MenuItems.Add($item1)
$menu1.MenuItems.Add($item2)

#Attache le menu à la PictureBox.
$image1.ContextMenu = $menu1

#Attache le contrôle à la fenêtre.
$form.controls.add($image1)

#Affiche le tout.
$form.ShowDialog()

#Fin.

On peut programmer le menu contextuel sur n'importe quel contrôle, mais également sur la fenêtre elle-même ($form1.ContextMenu = $xxx). Si un menu contextuel est programmé sur 2 contrôles qui se chevauchent, seul le menu contextuel du contrôle au premier plan s'affichera.