Guide de création d'applications Windows
Guide de création d'applications Windows
com
Windows Application
SUPINFO DOT NET TRAINING COURSE
2. LES FORMULAIRES..................................................................................................................................... 11
2.1. METHODES ET PROPRIETES.......................................................................................................................... 11
2.1.1. Méthode InitializeComponent ............................................................................................................. 11
2.1.2. Méthodes et propriétés principales ..................................................................................................... 14
2.2. EVENEMENTS .............................................................................................................................................. 14
2.2.1. Présentation ........................................................................................................................................ 14
2.2.2. Paramètres d’un Gestionnaire d’évènement ....................................................................................... 15
2.3. AFFICHAGE MODAL ET NON MODAL ............................................................................................................ 16
3. CONTROLES.................................................................................................................................................. 19
3.1. INTRODUCTION ........................................................................................................................................... 19
3.2. CONTROLES COMMUNS ............................................................................................................................... 20
3.2.1. Label ................................................................................................................................................... 20
3.2.2. TextBox................................................................................................................................................ 21
3.2.3. Button .................................................................................................................................................. 23
3.2.4. ListBox ................................................................................................................................................ 24
3.2.5. ListView, TreeView et ImageList......................................................................................................... 26
3.3. BOITES DE DIALOGUES ........................................................................................................................ 31
3.3.1. OpenFileDialog et SaveFileDialog..................................................................................................... 31
3.3.2. FolderBrowserDialog ......................................................................................................................... 33
3.3.3. FontDialog .......................................................................................................................................... 34
3.3.4. ColorDialog ........................................................................................................................................ 35
3.4. DATAGRID .................................................................................................................................................. 35
3.4.1. Introduction......................................................................................................................................... 35
3.4.2. Liaison à une source de donnée ......................................................................................................... 36
3.4.3. Editeur de Styles.................................................................................................................................. 37
3.5. USERCONTROLS..................................................................................................................................... 39
3.5.1. Présentation ........................................................................................................................................ 39
3.5.2. Création .............................................................................................................................................. 39
3.5.3. Utilisation............................................................................................................................................ 43
4. MENUS ............................................................................................................................................................ 46
4.1. L’OBJET MENUITEM.................................................................................................................................... 46
4.2. MAINMENU ................................................................................................................................................ 47
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 3 / 80
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 4 / 80
La fenêtre vous permettant de créer de nouveaux projets va alors s’ouvrir. Sélectionnez Application
Windows dans le dossier Projets Visual C#.
Donnez un nom à votre projet, puis choisissez l’emplacement où sera créé votre projet. Par défaut,
celui-ci est créé dans le répertoire Visual Studio Projects qui est créé lors de l’installation de Visual
Studio .Net. Vous devriez trouver ce répertoire dans Mes Documents.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 5 / 80
• [Link] : Il s’agit de l’icône représentant notre application. Nous verrons par la suite
comment créer une icône pour son application.
• [Link] : Il s’agit du fichier qui contiendra au moins la classe représentant notre formulaire.
C’est le fichier de code principal de votre projet.
• Premier [Link] : Le principal fichier du projet Visual C#.
• Premier [Link] : Le principal fichier de la solution Visual C#.
• [Link] : Un fichier source C# contenant des données nécessaires pour l’assemblage
généré par le projet. Par exemple, si vous donnez un nom fort à votre assemblage, c’est dans
ce fichier qu’il faudra le spécifier.
Vous pouvez également renseigner des informations concernant le nom de l’assemblage, sa
version, etc… Des champs ont été prévus à cet effet comme en témoigne l’exemple ci-dessous
qui vous présente une partie d’un fichier [Link] :
• [Link] : Un fichier XML qui conserve certaines informations sur les ressources
associées à [Link].
• Premier [Link] : Un fichier de projet Visual C# contenant les paramètres choisis
par l’utilisateur.
• Premier [Link] : Le fichier de solution Visual C# contenant des informations propres à
l’utilisateur.
• Répertoire bin : L’assemblage généré par votre projet sera placé dans ce répertoire, que ce
soit en Release ou en Debug.
• Répertoire obj : Répertoire permettant de stocker des fichiers temporaires nécessaires à la
génération de l’assemblage.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 6 / 80
Pour en ajouter de nouvelles, il suffit de faire un click droit sur le nœud Références, puis de
sélectionner Ajouter une référence…
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 7 / 80
La fenêtre Ajouter une référence va alors s’ouvrir. Elle est composée de 3 onglets :
• .NET : Permet d’ajouter un assemblage .Net
• COM : Permet d’ajouter un objet COM
• Projets : Permet d’ajouter un assemblage en provenance d’un projet de la solution actuelle.
Il vous suffit de sélectionner les références à ajouter dans la liste proposée ou en les recherchant
manuellement. Une fois toutes les références sélectionnées, cliquer sur OK pour valider, et les
nouvelles références viendront alors s’ajouter à celles déjà présentes.
Voici notre point d’entrée principal. C’est lui qui sera appelé pour instancier la classe représentant
notre application, c’est pourquoi il est déclaré en static.
Si votre application comporte plusieurs formulaires, elle comportera sûrement plusieurs points
d’entrées et il vous faudra spécifier celui qui sera appelé au lancement de l’application. Il s’agira du
point d’entrée principal.
Pour ce faire, allez dans les propriétés du projet, puis dans la rubrique Général. En face du champ
Objet de démarrage sélectionner l’objet de démarrage qui contient votre point d’entrée principal.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 8 / 80
L’objet Application que nous verrons juste après, utilise une instance de la classe ApplicationContext
pour lancer le formulaire. L’instance qu’il utilise représente un comportement par défaut, aussi, vous
pourrez définir votre propre comportement en créant une classe qui hérite de ApplicationContext.
Dans l’exemple suivant, un message de bienvenu est affiché au lancement de l’application, puis un
message de fin est affiché à l’arrêt de l’application.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 9 / 80
Nous allons maintenant voir comment lancer une application, et comment lui appliquer le
comportement que l’on a implémenté dans la classe CustomContextClose.
Par défaut, ce dernier ne définit aucun comportement spécifique durant le lancement ou l’arrêt d’une
application.
Une des versions surchargée de la méthode Run permet de spécifier un objet ApplicationContext dont
vous avez modifié le comportement (grâce à l’héritage).
[Link]();
L’exemple suivant montre le point d’entrée permettant de lancer une telle application.
[STAThread]
static void Main()
{
//On instancie un nouveau formulaire de type Form1
//Mais il ne sera pas affiché
Form1 f = new Form1();
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 10 / 80
L’exemple suivant nous montre comment lancer une application qui suivra le comportement
CustomContextClose que l’on a défini à la partie précédente.
[STAThread]
static void Main()
{
//On instancie un nouveau formulaire de type Form1
Form1 f = new Form1();
L’objet Application vous permet également de fermer l’application à l’aide de la méthode Exit, elle
est aussi déclarée en static. Cette méthode ne provoque pas un arrêt immédiat de l’application. Elle va
bloquer les sources de messages et la méthode Run se terminera.
L’exemple suivant montre comment forcer la fin d’une application durant la fermeture de son
formulaire principal. Cette méthode est pratique lorsque vous avez utilisé la version sans arguments de
la méthode Run pour lancer l’application.
Vous pourrez également utiliser la méthode ExitThread qui va arrêter le Thread courant.
L’objet Application possède également des propriétés très pratiques permettant au développeur
d’obtenir très rapidement des informations sur l’application :
• ProductName : Obtient le nom du produit associé à cette application.
• StartupPath : Obtient le chemin d’accès au fichier exécutable ayant démarré l’application,
sans le nom de l’exécutable.
• AllowQuit : Booléen indiquant si l’utilisateur peut quitter ou non l’application. Attention, ce
champ est en lecture seule, vous ne pouvez pas lui affecter une valeur.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 11 / 80
2. Les formulaires
2.1. Méthodes et propriétés
2.1.1. Méthode InitializeComponent
Cette méthode permet de stocker les propriétés des contrôles modifiés dans le Concepteur de Form.
Avec Visual Basic 6, par exemple, ces données étaient placées dans un autre fichier auquel le
développeur n’avait pas accès.
Cette méthode est donc directement éditée par Visual Studio suivant les modifications apportées aux
contrôles, et il est déconseillé de l’éditer soit même.
Bien sûr, les propriétés par défaut des contrôles ne seront pas ajoutées à cette méthode.
Par défaut, elle définit des propriétés pour le formulaire tels que sa taille, son nom et son affichage. Si
vous modifier les propriétés du formulaire dans le concepteur de Form, ces modifications seront
automatiquement apportées à la méthode InitializeComponent.
Dans le concepteur de Form, nous allons modifier quelques propriétés de notre formulaire.
Tout d’abord, nous allons modifier la propriété BackColor qui représente la couleur de fond de notre
formulaire. On lui affecte la couleur blanche.
On va ensuite changer le texte qui est affiché en haut de notre formulaire. Par défaut la propriété Text
de notre formulaire est initialisée avec la valeur « Form1». Affecter lui, la chaîne de caractères
« Formulaire principal ».
Enfin nous allons modifier l’icône affichée à gauche du texte. Dans le Concepteur de Form, choisissez
une icône pour la propriété Icon.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 12 / 80
L’exemple suivant montre notre méthode InitializeComponent une fois ces modifications appliquées.
[Link] = [Link];
[Link] =
new [Link](292, 266);
[Link] =
(([Link])([Link]("$[Link]")));
[Link] = "Form1";
[Link] = "Formulaire principal";
[Link] +=
new [Link](this.Form1_Load);
}
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 13 / 80
Remarquez tout d’abord qu’un ResourceManager a été créé pour le formulaire. Il va permettre de
gérer les ressources utiles au formulaire tel que l’icône que nous avons défini.
Visual Studio a ajouté toutes les lignes de codes correspondantes aux modifications apportées dans le
concepteur de Form.
De même, si vous ajoutez des contrôles dans le concepteur de Form, les déclarations le concernant
seront automatiquement générées dans la méthode InitializeComponent.
Nous allons ajouter un contrôle Button puis constater les modifications faites à InitializeComponent.
Tout d’abord, la déclaration du contrôle va être ajoutée à notre formulaire :
Nous avons modifié le fond du bouton pour qu’il apparaisse en noir, et la couleur de texte pour que
celui ci apparaisse en blanc. Le texte du bouton a été également modifié pour afficher « Test ».
[Link] = [Link];
[Link] =
new [Link](292, 266);
[Link](this.button1);
[Link] =
(([Link])([Link]("$[Link]")));
[Link] = "Form1";
[Link] = "Formulaire principal";
[Link] +=
new [Link](this.Form1_Load);
[Link](false);
}
Toutes les propriétés nécessaires à l’initialisation de notre contrôle Button ont été automatiquement
générées.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 14 / 80
[Link]();
La méthode SuspendLayout du formulaire permet de suspendre le dessin des contrôles : Tout contrôle
initialisé après l’appel à cette méthode ne sera pas dessiné immédiatement.
Une fois la méthode ResumeLayout du formulaire appelée, les contrôles pourront alors être dessinés.
Cette méthode prend en argument un booléen, qui va indiquer si le dessin des contrôles doit avoir lieu,
dès l’appel de la méthode (true) ou ultérieurement (false).
On constate, que cette méthode est appelée à la fin de la méthode InitializeComponent (une fois tous
les control initialisés) :
[Link](false);
Ici, le dessin des contrôles n’est pas forcé (il pourra se faire ultérieurement).
Pour empêcher l’utilisateur de redimensionner le formulaire, il faudra tout d’abord lui affecter un style
de bordure fixe, initialiser la valeur de la propriété FormBorderStyle avec la valeur FixedSingle.
Il faudra ensuite empêcher l’utilisateur de mettre le formulaire en plein écran. Pour cela, mettez à false
la propriété MaximizeBox. Enfin, n’oubliez pas de fixer la taille définitive que devra avoir votre
formulaire.
2.2. Evènements
2.2.1. Présentation
Les événements vont vous permettre d’effectuer des tâches lors d’actions précises de l’utilisateur. Ils
sont donc à la base de l’interaction entre l’utilisateur et l’application.
Par exemple, lorsque vous cliquez sur un bouton pour afficher une boite de dialogue, vous déclenchez
l’évènement Click du control Button qui contiendra le code pour afficher la boite de dialogue.
Dans l’exemple suivant, nous allons définir l’événement Click d’un control Button pour qu’une boite
de dialogue soit affichée quand vous cliquez sur le bouton.
Nous allons tout d’abord créer un délégué pour l’événement Click du bouton boutonEvenement :
[Link] += new
EventHandler(boutonEvenement_Click);
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 15 / 80
Il suffira ensuite de créer une méthode qui correspondra à la signature de l’événement Click du
bouton. Dans cette méthode, nous allons tout simplement ajouter le code permettant d’afficher une
boite de dialogue
Maintenant, lorsque vous cliquerez sur votre bouton, la méthode boutonEvenement_Click sera
appelée, et dans notre cas, une boite de dialogue sera affichée.
Astuce : Tapez seulement la ligne suivante et appuyer deux fois sur la touche Tab après l’opérateur +=
[Link] +=
Lorsque vous cliquerez une première fois sur la touche Tab, la ligne sera complétée :
Lorsque vous appuierez la seconde fois sur la touche Tab, Visual Studio génère le gestionnaire
d’évènement correspondant à l’événement Click, puis complète la ligne précédente avec le nom du
nouveau gestionnaire d’évènement créé :
[Link] += new
EventHandler(boutonEvenement_Click);
Dans le concepteur de Form, il vous suffit de double cliquer sur le contrôle en question pour que
Visual studio génère son délégué et son gestionnaire d’évènement. Bien sûr l’initialisation du délégué
sera faite dans InitializeComponent. L’exemple le plus parlant est la création d’un délégué pour
l’évènement Load du formulaire lorsque vous double cliquez dessus pour afficher le code.
Le point néfaste avec cette méthode est que Visual Studio définira uniquement l’événement principal
du contrôle : Pour un contrôle Button, l’événement principal est le clique. Vous ne pourrez donc pas
définir le délégué et le gestionnaire d’évènement pour l’événement DoubleClick du control Button en
double cliquant sur celui-ci dans le concepteur de Form.
De même, pour le formulaire, c’est l’événement Load qui est géré par défaut.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 16 / 80
{
[Link]("L’appelant est un bouton");
}
Comme formulaire modal, nous pouvons citer la boite de dialogue (MessageBox). Tant que celle-ci
n’est pas fermée ou validée avec le bouton OK, vous n’avez pas accès aux autres formulaires de
l’application.
En revanche, si vous ajoutez un formulaire à votre application, et que vous l’affichez à l’aide de sa
méthode Show, vous pouvez quand même accéder au reste de l’application (ici le formulaire de
démarrage).
Nous avons utilisé la méthode Show dans l’exemple précédent pour afficher le second formulaire.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 17 / 80
{
Form2 f = new Form2();
[Link]();
}
Nous allons reprendre l’exemple précédent et utiliser la méthode ShowDialog plutôt que Show pour
lancer le second formulaire :
En exécutant de nouveau l’application, vous remarquerez que, lorsque le second formulaire s’affiche,
vous n’avez plus accès au formulaire de démarrage. Il s’agit d’un affichage modal.
Ce n’est donc pas une propriété d’un formulaire qui permet de définir son affichage comme modal ou
non, mais la méthode utilisée pour l’afficher :
• Show : Permet d’afficher un formulaire non modal.
• ShowDialog : Permet d’afficher un formulaire modal.
La méthode ShowDialog renvoi une valeur de l’énumération DialogResult qui va indiquer comment
l’utilisateur a quitté une boite de dialogue. On pourra donc savoir s’il a validé, ignoré.…
Pour déterminer ces informations, il suffit de renseigner la propriété DialogResult du bouton qui
servira à quitter le formulaire.
L’exemple suivant montre un formulaire auquel on ajoute deux boutons permettant de le fermer :
• Un bouton portant le texte Valider avec sa propriété DialogResult initialisée avec la valeur
[Link]
• Un bouton portant le texte Annuler avec sa propriété DialogResult initialisée avec la valeur
[Link]
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 18 / 80
Dans l’exemple suivant, on lance le formulaire de confirmation créé précédemment pour s’assurer que
l’utilisateur veut vraiment quitter l’application. Il suffit de lancer le formulaire à l’aide de la méthode
ShowDialog, puis de tester la valeur renvoyée.
Si l’utilisateur quitte la boite de dialogue en cliquant sur le bouton Valider, alors cela provoquera la fin
de l’application.
En revanche, si l’utilisateur quitte la boite de dialogue en cliquant sur le bouton Annuler, alors il va
falloir annuler la fermeture du formulaire.
Pour cela, l’argument CancelEventArgs possède une propriété prévue à cet effet. Si elle est mise à
true, la propriété Cancel provoquera l’annulation de l’évènement déclenché (ici, l’annulation de la
fermeture du formulaire).
case [Link]:
//On annule la fermeture de l'application
[Link] = true;
break;
}
}
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 19 / 80
3. Contrôles
3.1. Introduction
Comme vous le savez certainement, les contrôles Windows sont des objets graphiques permettant
d’interagir avec l’utilisateur. Ils peuvent être définis et utilisés directement dans le code, mais il est
possible également de les utiliser et paramétrer leurs propriétés dans le concepteur de Form.
La boite à outil vous permettra d’ajouter des contrôles. Affichez-la en passant par le menu Affichage
de Visual Studio .Net, ou en utilisant le raccourci Ctrl + Alt + X.
Par défaut, la boite à outils ne listent pas tous les contrôles disponibles, aussi, pour en ajouter il vous
suffira de faire un clique droit dessus, puis de sélectionner Ajouter/Supprimer des éléments…
Vous pourrez ensuite configurer les propriétés de vos contrôles en passant par la fenêtre des propriétés
également disponible dans le menu Affichage ou à l’aide du raccourci Alt + Entrée.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 20 / 80
Placer un control Label sur votre Form. Faites un clique droit dessus et sélectionner Propriétés.
Cliquer ensuite sur le bouton affichant 3 points, en face du champ Image. Une boite de dialogue va
vous permettre d’ajouter une image qui sera affiché dans votre label.
Sélectionnez l’icône dans le répertoire suivant :
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 21 / 80
Il s’agit d’un icône représentant une clé dorée et qui est fournie avec Visual Studio.
Voici les modifications apportées à votre code concernant cet objet Label. Bien sûr ces modifications
ont été générées dans InitializeComponent par Visual Studio.
[Link] =
[Link];
[Link] =
([Link])([Link]("[Link]"));
On constate que toutes les propriétés modifiées dans le concepteur de Form figurent ci-dessus. Nous
aurions pu éditer ces lignes de codes nous même (dans le constructeur du formulaire par exemple)
mais l’utilisation du concepteur de Form est bien plus pratique.
3.2.2. TextBox
[Link]. Présentation et utilisation
Le contrôle TextBox représente une zone de texte éditable par l’utilisateur. Elle est utilisée pour
récupérer des données de l’utilisateur, mais également pour lui en afficher.
Le code précédent permet de forcer l’utilisateur à entrer une chaîne de 6 caractères au maximum en
majuscule.
La propriété TextAligne est basée sur l’énumération HorizontalAlignment et permet d’aligner le texte
à gauche.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 22 / 80
Pour permettre à l’utilisateur d’entrer du texte qui pourra tenir sur plusieurs lignes, il suffira de mettre
la propriété MultiLine du contrôle à true.
Pour l’empêcher de modifier le texte affiché, il faudra mettre la propriété ReadOnly à true.
La validation d’un contrôle a lieu lorsque celui-ci perd le focus (on sélectionne un autre control…) ou
lorsque le formulaire se ferme.
Dans l’exemple suivant, nous allons gérer l’événement Validating pour le control TextBox. Supposer
que l’entreprise impose un Login entre 4 et 6 caractères. A l’aide de la propriété MaxLenght de la
TextBox, nous imposons un texte d’une longueur maximal de 6 caractères. Il nous reste donc à vérifier
durant la validation du control que le texte comporte au moins 4 caractères.
On commence par créer un CancelEventHandler pour l’événement Validating qui contiendra le code
permettant de valider le contenu de la TextBox.
Il nous reste à créer un délégué pour l’événement Validating de la TextBox qui pointera vers la
méthode définie ci-dessus.
Ainsi, dès que la TextBox perd le focus, on vérifie l’intégrité du Login, et si celui-ci est correct, on
passe à la phase d’identification de l’utilisateur.
Cette méthode présente néanmoins des inconvénients, car si vous avez un grand nombre de contrôle à
gérer, cela deviendra vite lourd et complexe.
Par ailleurs, si vous appuyer accidentellement sur la touche Tab, le control perdra le focus (sauf si il
est configuré pour prendre en compte la touche Tab) et la validation sera lancée.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 23 / 80
[Link] = 10;
[Link] = "$";
[Link] += new
CancelEventHandler(txtPass_Validating);
L’exemple précédent limite le mot de passe à 10 caractères et remplace le texte entré par l’utilisateur
par des $.
On créé également un délégué pour gérer la validation du contrôle. On pourra donc vérifier l’intégrité
du mot de passe comme on l’avait fait pour le Login.
3.2.3. Button
Ce contrôle qui est un bouton vous permettra d’effectuer des traitements lorsque vous cliquerez dessus
par exemple. Ajoutez un contrôle de ce type et initialisez-le avec les valeurs suivantes :
[Link] = "Login";
[Link] = [Link];
Il est beaucoup plus pratique de définir les propriétés de ce genre de contrôle directement dans le
concepteur de Form plutôt que dans le code.
Nous allons maintenant gérer la vérification du login et du mot de passe à l’aide du bouton et non plus
en passant par les évènements de validations des contrôles TextBox.
Pour ce faire, il va falloir gérer l’événement Click pour le bouton. Il s’agit de l’événement par défaut
pour ce contrôle, aussi, il vous suffira de double cliquer sur le bouton dans le concepteur de Form pour
qu’un délégué et un Gestionnaire d’évènement soient générés pour cet événement.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 24 / 80
Cette manière de faire est beaucoup plus simple : On gère les TextBox prévues pour le Login et le mot
de passe dans la même méthode.
Par ailleurs, la validation sera lancée lorsque l’utilisateur le voudra, c’est à dire lorsqu’il cliquera sur le
bouton. Plus de problème de validation accidentelle donc.
3.2.4. ListBox
[Link]. Présentation
Le contrôle ListBox permet d’afficher des données sous forme de liste à l’utilisateur. On utilise
souvent les ListBox pour permettre à l’utilisateur de sélectionner des données parmi une liste, comme
dans l’exemple suivant :
La fenêtre ci-dessus est composée de deux Label, deux ListBox et deux Button. Nous allons créer
ensemble une application qui va nous permettre de sélectionner des données dans la première ListBox
pour les ajouter dans la seconde. On aura alors dans la seconde ListBox uniquement les données utiles
à l’utilisateur.
[Link]. Utilisation
La ListBox possède une collection d’objets nommées Items. Pour ajouter des Items à votre ListBox, il
suffira d’appeler la méthode Add de la collection en spécifiant en argument un objet de type object ou
héritant de object.
En général, les Items d’une ListBox sont simplement des chaînes de caractères.
Voici comment ajouter une chaîne de caractère à la collection Items :
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 25 / 80
[Link](s);
Vous pouvez également ajouter directement une liste d’Items. Dans notre cas, par exemple, on voudra
afficher une liste de sociétés françaises dans la ListBox de gauche.
Voici comment faire :
[Link](s);
Bien sûr, vous arriverez au même résultat avec la fonction Add utilisée dans une boucle While.
ListBox
Nous allons maintenant voir comment sélectionner un Item puis l’ajouter à la de droite :
Dans la méthode Click du bouton destinée à ajouter des Items (buttonAdd), ajoutez le code suivant :
[Link]([Link]);
Ainsi, lorsque vous cliquerez sur le bouton, l’item actuellement sélectionné dans la ListBox de gauche
sera ajouté à la ListBox de droite.
Il reste néanmoins un problème, vous pourrez ajouter plusieurs fois le même Item. La méthode
Contains de l’objet ListBox va nous permettre de pallier à cela.
Voici ce que devient la méthode Click du bouton d’ajout buttonAdd. Cette fois ci, grâce à la méthode
Contains de la collection Items, on peut tester si un Item existe déjà dans la ListBox de droite avant de
l’y ajouter.
Il nous reste plus qu’à gérer l’événement Click du bouton buttonSuppr, afin de pouvoir supprimer des
éléments de la ListBox de droite.
Pour vider l’objet ListPortfolio (correspondant à la liste de droite), il suffit d’appeler la méthode Clear
de sa collection d’Items.
La propriété SelectionMode permet de gérer la sélection des items au sein d’une ListBox. Elle prend
ses valeurs dans l’énumération SelectionMode du namespace [Link].
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 26 / 80
Dans le concepteur de Form, assignez-lui la valeur MultiSimple. Vous pourrez ainsi sélectionner un
ensemble d’items à la fois.
Dans l’exemple suivant, nous avons modifié le code permettant d’ajouter l’item sélectionné dans la
liste de gauche (listAction) dans la liste de droite (listPortfolio). On gère maintenant la multi-
sélection à l’aide de la collection SelectedItems qui représente l’ensemble des objets sélectionnés dans
une ListBox.
Dans les propriétés de l’objet ImageList, cliquer sur le bouton en face du champ Images. Une boite de
dialogue va alors s’afficher pour vous permettre d’ajouter ou de supprimer des images au contrôle.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 27 / 80
Ajoutez un bouton à votre formulaire et dans le concepteur de Form, initialiser la propriété ImageList
du bouton avec l’objet ImageList du formulaire.
Sélectionnez ensuite l’image que vous voudrez utiliser grâce à la propriété ImageIndex.
[Link]. TreeView
L’objet TreeView est très similaire à l’objet ListBox. La principale différence est que l’objet TreeView
introduit une notion de hiérarchie entre les différents Items qui le composent. Vous affichez donc des
nœuds qui eux même pourront en contenir de d’autres.
Ainsi, ce contrôle repose sur la classe TreeNode qui représente un nœud. Un nœud pourra lui même en
contenir un autre et ainsi de suite.
Pour créer un nœud et le configurer, il existe un assistant dans le concepteur de Form, accessible en
cliquant sur le bouton en face du champ Nodes dans les propriétés du contrôle.
L’éditeur va alors apparaître et vous proposera les fonctionnalités suivantes. Voici l’éditeur d’objets
TreeNode fournit par le concepteur de Form :
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 28 / 80
Vous pouvez ajouter des nœuds à la racine du contrôle en cliquant sur le bouton « Ajouter une
racine ». Ici, nous avons deux nœuds racines, Actions et Indices. On va ensuite pouvoir ajouter des
enfants à un nœud sélectionné à l’aide du bouton « Ajouter un enfant ».
Si vous avez ajouté un control ImageList à votre formulaire, vous pourrez afficher des images à
gauche de vos nœuds. Pour cela, c’est très simple, toutes les images de votre ImageList seront listées
dans deux listes déroulantes :
• Image : Permet de choisir une image qui sera affichée à gauche du nœud.
• Image sélectionnée : Détermine l’image à afficher lorsque le nœud est sélectionné.
[Link]. ListView
Ce contrôle permet de lister des Items sous forme d’icônes. Il repose également sur une collection
d’Items que vous pourrez créer et initialiser via un assistant dans le concepteur de Form. Vous pourrez
également utiliser des images stockées dans un objet ImageList de votre formulaire. Il suffira
d’initialiser la propriété ImageList du control avec l’objet ImageList présent dans votre formulaire.
Une liste déroulante est prévue à cet effet dans le concepteur de Form.
A ce propos, le control ListView possède une propriété View permettant de paramétrer l’affichage du
contrôle et qui peut prendre les valeurs suivantes :
• LargeIcon : Si vous choisissez cette valeur, le contrôle ira chercher les images à afficher dans
l’objet ImageList correspondant à la propriété LargeImageList. Les icônes affichées seront
plus grandes.
• Details : Ce mode vous permettra d’afficher composées de plusieurs colonnes à la manière de
l’explorateur Windows.
• SmallIcon : Avec cette valeur, le contrôle ira chercher ses images dans l’objet ImageList
correspondant à la propriété SmallImageList. Les icônes affichées seront plus petites.
• List : Permet d’afficher vos nœuds sous forme d’une liste.
Dès que votre contrôle ListView possède un objet ImageList, vous pouvez lui ajouter des Items. Pour
cela, cliquer sur le bouton en face du champ Items dans les propriétés du contrôle. L’assistant va alors
s’afficher.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 29 / 80
Pour ajouter un Item à la ListView, il suffit de cliquer sur le bouton Ajouter. Il vous restera alors à
configurer les propriétés du nouvel Item.
Voici à quoi ressemble la ListView que nous avons initialisé dans l’assistant du concepteur de Form :
Il nous reste à gérer le comportement de notre ListView, lorsque vous double cliquez sur un de ses
Items par exemple.
Il va tout d’abord falloir initialiser la propriété Activation du contrôle ListView avec une des trois
valeurs de l’énumération ItemActivation :
[Link] = [Link];
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 30 / 80
Avec la ligne précédente, l’événement ItemActivate d’un Item de la liste sera déclenché lorsque vous
double cliquez dessus.
Et enfin, un délégué :
[Link]+=new EventHandler(maListV_ItemActivate);
Lorsque vous utilisez l’affichage détaillé de votre ListView, vous pouvez afficher plusieurs colonnes.
Pour les ajouter ou les supprimer, servez vous de l’assistant prévu à cet effet, accessible en cliquant
sur le bouton en face du champs Columns dans les propriétés du contrôle. L’ajout de colonnes est très
simple.
Une fois vos colonnes ajoutées, il vous faudra passer par la collection SubItems de l’objet
ListViewItem pour ajouter des éléments qui seront affichées dans les différentes colonnes.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 31 / 80
En supposant que votre ListView possède 4 colonnes, l’exemple précédent montre comment créer un
objet ListViewItem possédant une valeur pour chacune des colonnes.
L’objet ListViewItem sera automatiquement affiché dans la première colonne. Les objets contenus
dans sa collection SubItems seront affectés aux autres colonnes.
Il s’agit de boites de dialogue modales, elles seront donc lancées à l’aide de la méthode ShowDialog.
Vous pourrez paramétrez le répertoire initiale de la boite de dialogue à l’aide de la propriété
InitialDirectory.
Vous pouvez également paramétrez vos boites de dialogues pour qu’elles n’affichent que les fichiers
ayant une certaines extension. Pour cela, il faudra utiliser la propriété Filter. Cette propriété prend une
chaîne de caractère dont la syntaxe est la suivante :
Type_de_Fichier|*.extension
Nous allons voir un exemple pour illustrer cette propriété. Si vous voulez afficher uniquement les
fichiers Word au format doc, voici la chaîne à utiliser :
Fichier sera le libellé affiché dans la boite de dialogue, ce qui suit le | permettra de filtrer les fichiers.
Vous pouvez également préciser une chaîne de caractère avant l’extension si vous voulez recherchez
un fichier comportant cette chaîne.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 32 / 80
La propriété CheckFileExists permet de vérifier si le fichier stipulé par l’utilisateur existe lors de la
fermeture de la boite de dialogue. Il s’agit d’un booléen, à true la vérification sera faite et à false,
aucune vérification ne sera effectuée.
Prenons le cas où la propriété est mise à true : Si l’utilisateur a précisé l’extension après le nom de
fichier, aucun problème. Dans le cas contraire, l’extension sera automatiquement ajoutée.
Mise à false, aucune vérification ne sera effectuée et si l’utilisateur ne précise pas l’extension à la fin
du non du fichier, celle-ci ne sera pas ajoutée.
Si de plus, vous mettez la propriété CheckFileExists à true alors une erreur sera générée puisque le
fichier ne sera pas trouvé (il manquera l’extension).
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 33 / 80
Voyons un exemple plus concret qui va nous permettre de sélectionner des images à travers un
contrôle OpenFileDialog puis d’afficher l’image sélectionnée par l’utilisateur.
Tout d’abord, nous allons paramétrer notre boite de dialogue pour qu’elle ne liste que les fichiers avec
l’extension JPG :
[Link] =
@"C:\Documents and Settings\Images personnelles"
Ajoutons maintenant un bouton. Lorsque l’utilisateur cliquera sur le bouton, la boite de dialogue
s’affichera. Une fois son fichier sélectionné, s’il valide la boite de dialogue alors l’image sera affichée
dans un contrôle PictureBox (control servant à afficher des images) :
3.3.2. FolderBrowserDialog
Ce contrôle représente la boite de dialogue Windows permettant de sélectionner un répertoire. Il s’agit
en fait d’une boite de dialogue composée d’un TreeView et qui ne liste que les répertoires.
La propriété Description vous permettra d’ajouter une petite description en haut de la boite de
dialogue :
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 34 / 80
Vous pourrez choisir le répertoire racine à partir duquel commencera l’arborescence de votre contrôle
à l’aide de la propriété RootFolder. Seuls les sous répertoires du répertoire racine (correspondant à la
propriété RootFolder donc) seront listés. Vous pourrez choisir votre répertoire racine parmi ceux
proposés dans la liste déroulante. Dans l’exemple précédent, nous avions initialisé cette propriété avec
la valeur ProgramFiles qui nous permettra d’avoir une arborescence qui commencera à partir du
répertoire "Program Files" de l’utilisateur.
Ce contrôle représente également une boite de dialogue modale, aussi pour pouvoir l’afficher, il vous
faudra utiliser la méthode ShowDialog :
[Link]();
Enfin, pour récupérer le répertoire choisi par l’utilisateur lorsqu’il valide la boite, il suffira d’utiliser la
propriété SelectedPath :
Dans l’exemple précédent, on affiche une boite de dialogue FolderBrowserDialog. Si elle est validée
par l’utilisateur alors on affiche le chemin du répertoire qu’il a sélectionné dans une boite de dialogue
simple.
3.3.3. FontDialog
Tous les contrôles affichant du texte possèdent une propriété Font. Elle vous permet de paramétrer
l’aspect graphique du texte à afficher (police, taille etc.…). En générale, ces données sont initialisées
par le développeur et l’utilisateur n’y a pas accès. Si vous voulez permettre à l’utilisateur de modifier
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 35 / 80
l’aspect graphique d’un texte alors le control FontDialog vous fournit une interface graphique pour
interagir avec l’utilisateur.
Il s’agit de la boite de dialogue standard de Windows (Word etc.…), ce contrôle est très facile à
utiliser :
Le concept est simple, le contrôle FontDialog possède une propriété Font. Lorsque l’utilisateur
effectuera ses modifications dans la boite de dialogue, celles-ci seront stockées dans la propriété Font
de la boite de dialogue. Il suffira ensuite d’initialiser la propriété Font du contrôle cible avec celle de
votre objet FontDialog.
if([Link]() == [Link])
{
//On affecte l’objet Font du control FontDialog
//à la propriété Font d’un control TextBox
[Link] = [Link];
}
}
Dans l’exemple précédent, lorsque l’utilisateur clique sur le bouton mButton, on créé un nouvel objet
FontDialog, puis on le lance avec la méthode ShowDialog. La boite de dialogue sera donc affichée de
façon modale et le reste de l’application sera bloqué tant que la boite restera affichée.
Lorsque l’utilisateur ferme la boite, on teste à l’aide de la propriété DialogResult s’il l’a validé ou non.
S’il a validé la boite de dialogue, alors on affecte la Font paramétrée par l’utilisateur à celle d’un
control TextBox.
3.3.4. ColorDialog
Le contrôle ColorDialog est très similaire au contrôle FontDialog. Il affichera une boite de dialogue à
l’utilisateur lui permettant de modifier les couleurs affichées par vos contrôles.
if([Link]() == [Link])
{
[Link] = [Link];
}
}
3.4. DataGrid
3.4.1. Introduction
Le contrôle DataGrid est un contrôle qui vous permettra d’afficher des données très simplement, sous
la forme d’une grille.
Cette grille est représentée par une collection d’objets DataGridTableStyle. Il ne faut absolument pas
confondre cet objet et l’objet DataTable que vous étudierez plus en détail dans le cours [Link].
L’objet DataGridTableStyle représente quant à lui une table au sein du contrôle DataGrid.
Contrairement à l’objet DataTable, l’objet DataGridTableStyle prendra en compte l’aspect graphique.
L’objet DataGridTableStyle est composé d’objets DataGridColumnStyle qui représentent les
colonnes au sein d’un DataGridTableStyle.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 36 / 80
Au final, la structure est très proche de celle d’une base de données (une base qui va contenir des
tables qui seront composées de colonnes) avec la possibilité de gérer l’affichage des éléments.
La propriété DataMember vous permettra de spécifier l’objet DataTable à utiliser au sein du DataSet.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 37 / 80
Pour ajouter un style de table à votre DataGrid, il vous suffit de cliquer sur "Ajouter". Vous pourrez
ensuite paramétrer le nouveau style dans la partie de droite. La gestion de l’affichage des données se
voit donc simplifiée.
Enfin, la propriété AlternatingBackColor permet de spécifier une couleur de fond qui apparaîtra une
ligne sur deux.
Vous allez pouvoir affecter ce style à une table de votre structure de données. Pour cela, initialiser la
propriété MappingName de l’objet avec le nom de la table en question.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 38 / 80
Une fois votre objet DataGridTableStyle configuré, il ne vous reste plus qu’à lui ajouter des styles de
colonnes en passant par sa collection d’objets DataGridColumnStyle. Il existe également un éditeur
pour les d’objets de ce type. Pour y accéder, cliquer sur le bouton en face du champ GridColumnStyle
dans les propriétés de votre objet DataGridTableStyle. Grâce à cette collection, vous allez pouvoir
sélectionner les colonnes à afficher, l’ordre dans lequel elles apparaîtront.
Cet éditeur permet de configurer les paramètres pour les données au niveau d’une colonne. Vous allez
pouvoir spécifier le texte d’en-tête de la colonne à l’aide de la propriété HeaderText. La propriété
NullText permet de spécifier le texte lorsqu’une valeur de la colonne est nulle.
Pour affecter ce style à une colonne de votre structure de données, utiliser la propriété MappingName
comme pour l’objet DataGridTableStyle. Il suffira de spécifier le nom de la colonne.
Pour résumer, notre DataGrid est lié à la table Produit contenu dans notre structure de donnée
dsQuote1.
Ensuite, nous avons ajouté un style de table que nous avons affecté à la table Produit.
Pour n’afficher que les colonnes Nom et Valeur (dans notre cas, l’utilisateur n’a pas besoin de l’id
d’un produit ni de son type), nous avons créé deux styles de colonnes que nous leur avons affecté.
Voici le résultat :
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 39 / 80
Figure 34 - DataGrid
3.5. USERCONTROLS
3.5.1. Présentation
Nous avons vu comment utiliser les principaux contrôles présents lorsque vous créer une application
Windows. Il vous est également possible de créer vos propres contrôles.
Tous les contrôles héritent de la classe Control., vous pourrez donc créer vos propres contrôles en
créant des classes dérivant de UserControl.
3.5.2. Création
Visual Studio .Net vous propose deux solutions pour créer vos contrôles :
• Ajoutez à votre projet un control utilisateur. Il s’agit d’un fichier de code qui contient une
classe héritant de UserControl. Dans l’explorateur de solution, faites un click droit sur projet
puis : Ajouter >> Ajouter un contrôle utilisateur…
Par défaut, le contrôle utilisateur aura le nom du fichier qui le contient. Le contrôle utilisateur
apparaît dans le concepteur de Form, vous pouvez lui ajouter n’importe quel contrôle
Windows Form (comme pour un formulaire).
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 40 / 80
• Créer un projet Bibliothèque de contrôles Windows : Il s’agit d’un type de projet vous
permettant de créer des contrôles qui seront réutilisables par d’autres applications. Vous
pourrez également déployer ce type de projet, ainsi la réutilisation du code se voit accrue et
simplifiée.
Vous pourrez donc créer des contrôles pour des besoins ponctuels (première méthode) ou pour des
besoins à long terme (deuxième méthode).
Quelque soit la méthode utilisée, le contrôle utilisateur apparaît dans le concepteur de Form, aussi
vous pouvez le designer, c’est à dire lui ajouter des contrôle un peu à la manière des formulaires.
Vous pourrez également lui ajouter du code, gérer des évènements déclenchés par un des contrôles
(qu’il possède) ou par lui même.
L’événement principal d’un contrôle utilisateur est Load qui est déclenché lorsque le contrôle est
chargé par le formulaire.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 41 / 80
Nous allons créer un contrôle d’authentification : Ce contrôle devra permettre à l’utilisateur d’entrer
son Login et son mot de passe, puis il devra vérifier que les informations entrées par l’utilisateur sont
valables.
Au niveau de l’interface graphique, notre contrôle devra donc posséder deux TextBox paramétrées
pour nos besoins, ainsi que deux Label les accompagnants et un bouton.
Pour créer le contrôle utilisateur, reprenez tout simplement l’exemple qui nous a permis d’illustrer les
contrôles Label, TextBox et Button. Votre contrôle utilisateur devrait ressembler à cela :
[Link] vous fournit des classes représentant des structures de données, telles qu’une table de base
de données, une colonne d’une table etc…
Ainsi, lorsqu’un développeur utilisera le contrôle, il aura juste à entrer les paramètres nécessaires à
l’initialisation du DataSet, et tout sera géré automatiquement.
• PasswordColumn : Il s’agira d’un entier qui représentera l’index de la colonne contenant les
mots de passe des utilisateurs (Selon l’objet DataTable utilisé, cette colonne pourra se trouvée
en première position, deuxième position etc.…).
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 42 / 80
return _passwordColumn;
}
set
{
_passwordColumn = value;
}
}
• FormSuivante : Si notre utilisateur est authentifié, il arrivera sur une page d’accueil. Cette
page d’accueil sera un formulaire Windows. Grâce à cette propriété, il suffira de créer son
formulaire d’accueil et de l’affecter à la propriété pour que l’utilisateur arrive directement
dessus en cas d’authentification.
L’authentification se passera au niveau du bouton : dès que l’utilisateur cliquera sur le bouton, il
suffira de comparer les données entrées dans les TextBox avec celles contenues dans l’objet
DataTable du contrôle.
Si les données existent, l’utilisateur sera authentifié et il arrivera sur le formulaire FormSuivante.
Sinon, un message d’erreur sera affiché.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 43 / 80
L’exemple suivant illustre le code utilisé lorsque l’événement Click du bouton sera déclenché:
[Link]();
3.5.3. Utilisation
Une fois, notre contrôle créé, il nous reste plus qu’à l’utiliser dans une de nos applications.
Deux cas de figures se présentent à nous :
• Si vous avez créé votre contrôle utilisateur directement au sein de votre application, pour
l’utiliser il faudra le déclarer et de l’initialiser dans le code :
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 44 / 80
[Link] = passCol;
[Link] = logCol;
[Link] = Accueil;
L’exemple précédent illustre une méthode permettant d’initialiser votre contrôle au sein du
formulaire. Il vous suffira d’appeler cette méthode dans le constructeur de votre formulaire par
exemple :
• Si vous avez créé un projet de bibliothèque de contrôles utilisateurs, il vous faudra générer
votre projet :
Générer >> Générer en tâche de fond…
Dans la boite de dialogue, cochez la case qui vous permettra de générer votre projet en mode
Release puis cliquer sur Générer (voir chapitre 8).
Une fois votre projet générer, vous disposerez d’un assemblage contenant votre contrôle et il
vous suffira de l’ajouter à un projet.
Dans l’application à laquelle vous voulez ajouter ce contrôle, faites un clique droit sur la boite
à outils. Sélectionner Ajouter/Supprimer des éléments…
Une boite de dialogue va s’afficher. Elle va vous permettre d’ajouter ou de supprimer des
contrôles à votre boite à outils.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 45 / 80
Cliquer sur Parcourir, puis recherchez l’assemblage généré par votre projet de bibliothèque de
contrôles Windows.
Ajoutez-le puis valider la boite de dialogue. Le contrôle va être ajouté à la boite à outils et vous
pourrez l’utiliser dans le concepteur de Forrm.
Vous pourrez ainsi ajoutez votre contrôle à votre formulaire. Il ne vous restera plus qu’à initialiser ses
propriétés dans le code, et il sera fonctionnel au sein de votre application.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 46 / 80
4. Menus
4.1. L’objet MenuItem
Les contrôles MainMenu et ContextMenu reposent sur le même fonctionnement : Ils sont basés sur
des objets MenuItem qui peuvent répondre à des évènements tels qu’un clique d’une souris.
• Text : Correspond au texte affiché pour l’élément.
• Checked : Booléen qui indique si l’élément est sélectionné ou non (il apparaît coché ou non).
• ShortCut : Permet de définir un raccourci clavier pour l’élément.
• MenuItems : Chaque objet MenuItem peut lui même contenir une collection d’objet
MenuItem. Autrement dit, un élément peut lui même contenir une liste. C’est le principe des
menus Windows.
Le code suivant montre comment créer des objets MenuItem liés par une arborescence :
[Link](tmp);
}
La méthode AddRange permet d’ajouter une collection d’objet MenuItem. Pour ajouter seulement un
élément, il vous faudra utiliser la méthode Add.
Nous disposons de deux chaînes de connexions stockées dans un fichier de configuration. L’exemple
suivant montre comment nous allons pouvoir changer de chaîne de connexion en gérant l’événement
Click de deux objets MenuItem appartenant à l’arborescence définie précédemment.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 47 / 80
[Link] =
[Link]["Default"];
[Link] = true;
}
Nous allons maintenant voir comment utiliser des objets MenuItem au sein des objets MainMenu et
ContextMenu.
4.2. MainMenu
Ce contrôle vous permet d’ajouter des menus Windows, autrement dit, une barre de listes déroulantes
pouvant elles même contenir d’autres listes déroulantes. Cette barre apparaîtra constamment en haut
de votre formulaire.
Vous l’aurez compris, ce menu repose sur des objets MenuItem liés par une arborescence telle que
celle que l’on a défini à la partie précédente.
Le contrôle MainMenu va permettre d’afficher l’arborescence d’objets MenuItem sous forme de
menu Windows.
Ajoutez un contrôle MainMenu à votre formulaire. Remarquez tout d’abord que celui-ci ne va pas se
placer sur la Form. C’est le menu qu’il représente qui sera placé en haut du formulaire. Lorsqu’il
n’existe pas encore de liste dans le menu, celui-ci n’est visible que lorsque vous sélectionnez l’objet
MainMenu.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 48 / 80
Le contrôle MainMenu possède une collection d’objets MenuItem. Par exemple, si vous disposez
d’une arborescence d’objet MenuItem, il vous suffira d’ajouter le MenuItem racine (celui qui contient
tous les autres) à la collection d’objets MenuItem du control MainMenu.
Pour ajouter une liste déroulante, il suffit d’entrer son nom. Vous pourrez ensuite lui ajouter des
éléments de proche en proche. Pour définir l’évènement Click d’un objet MenuItem de la barre de
menu, il vous suffira de double cliquer dessus comme pour tout autre contrôle.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 49 / 80
4.3. ContextMenu
L’objet ContextMenu est le même que l’objet MainMenu, à la différence près que celui ci ne
s’affiche que lorsque vous faites un clique droit sur un contrôle.
D’ailleurs chaque contrôle possède une propriété ContextMenu. Ainsi, il suffit de construire une
arborescence d’objets MenuItem, de la rattacher à un objet ContextMenu via la collection
MenuItems.
Il ne restera plus qu’à initialiser la propriété ContextMenu de n’importe quel contrôle avec ce nouveau
menu pour que celui-ci s’affiche en cas de clique droit sur le contrôle en question.
[Link](tmp);
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 50 / 80
4.4. ToolBar
4.4.1. Présentation
Le control ToolBar permet d’afficher une barre de menu, composée cette fois ci de boutons et non de
liste déroulante.
Le principe reste le même, vous ajoutez une collection d’objets ToolBarButton à un objet ToolBar qui
permet d’afficher la barre d’outil et d’effectuer des actions lors d’un clique sur un des boutons.
La propriété Dock de votre contrôle ToolBar permettra de définir où celui-ci apparaîtra sur le
formulaire. Cette barre pourra apparaître en haut, en bas, à droite ou à gauche de votre formulaire.
La propriété ImageList du control ToolBar permet d’ajouter un contrôle ImageList à celui-ci. Vous
pourrez ensuite afficher des images de votre objet ImageList sur les boutons de votre barre d’outils.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 51 / 80
Un assistant va vous permettre de créer et d’ajouter directement vos objets ToolBarButton à l’objet
ToolBar.
Vous pourrez ajouter des ToolBarButton à votre Toolbar et éditer directement les propriétés du
nouvel élément. Vous pourrez également supprimer des objets ToolBarButton.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 52 / 80
Par exemple, pour ajouter des contrôles à votre formulaire dans le concepteur de Form, vous utiliser le
Drag & Drop.
5.2. Utilisation
Nous allons voir dans cette partie comment utiliser le Drag & Drop entre deux ListBox dans une
même application. Nous allons reprendre l’exemple qui nous a servi à illustrer le control ListBox.
Nous n’utiliserons plus les deux boutons pour ajouter un élément ou pour le supprimer.
La première chose à faire est d’autoriser le Drag & Drop sur le control qui devra recevoir les données.
Vous pourrez faire cela à l’aide de la propriété AllowDrop du contrôle cible.
Dans notre cas, l’utilisateur devra déplacer des éléments de la ListBox de gauche (listAction) vers la
ListBox de droite (listPortfolio). Il faudra donc autoriser le Drag & Drop pour l’objet listPortfolio.
[Link] = true;
Ensuite, il faut déclencher le Glisser/Déplacer lorsque vous aurez sélectionné un item dans le contrôle
listAction.
La méthode DoDragDrop est prévue à cet effet, elle se trouve dans la classe Control qui est la classe
mère de tous vos contrôles Windows Application.
Dans notre cas, il faut lancer cette méthode lorsque l’utilisateur aura sélectionné un item dans l’objet
listAction et avant qu’il ait relâché le clique de la souris.
Nous appellerons donc la méthode DoDragDrop lorsque l’évènement MouseDown de l’objet
listAction sera déclenché. Cet évènement est déclenché lorsque le clique de la souris est enfoncé au
dessus de la ListBox.
Pour le control cible (celui qui recevra les données), l’implémentation du Drag & Drop repose sur
deux évènements principaux (il en existe d’autres) qui sont définis pour tous les contrôles.
• DragOver : Se déclenche lorsque l’on déplace un élément sur le contrôle à l’aide de la souris.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 53 / 80
On commence par définir l’évènement DragOver pour le control listPortfolio. On va définir dans cet
évènement l’effet appliqué aux données qui seront déplacées. On utilise pour ce faire les membres de
l’énumération DragDropEffects. Dans notre cas, on utilise la valeur Copy qui indique que les données
seront copiées vers la cible de déplacement.
Il nous reste maintenant à définir l’évènement DragDrop de l’objet listPortfolio. Il faut tout
simplement que le code permette de copier les données du Glisser/Déplacer dans la ListBox en
question. Nous reprenons pour cela le code qui nous avait servi pour le bouton Ajouter dans notre
l’exemple du control ListBox.
Notre application est maintenant complète, vous pourrez glisser des items de la ListBox de gauche
vers celle de droite.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 54 / 80
• [Link] et [Link]
Ces deux structures représentent un point avec ses coordonnées en 2D, X et Y qui sont également des
propriétés de Point et PointF.
Les coordonnées d’un Point sont exprimées avec des int alors que celles d’un PointF le sont en float.
Le constructeur le plus simple est le suivant :
• [Link] et [Link]
Comme leur nom l’indique, ces deux structures définissent une dimension. Concrètement,
l’association d’une longueur et d’une largeur représentées par les propriétés Width et Height.
Le constructeur est le suivant :
• [Link] et [Link]
Ces deux structures représentent un rectangle, avec les propriétés Left, Top, Width et Height pour le
définir.
La différence entre Rectangle et RectangleF vient du fait que les coordonnées et dimensions d’un
Rectangle sont exprimées avec des int alors celles du RectangleF sont exprimées avec des float.
Les deux principaux constructeurs de cette entité sont :
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 55 / 80
Pour RectangleF se sont les mêmes constructeurs à la différence, que les coordonnées sont des float,
rectLocation et de type PointF et rectSize de type SizeF.
• [Link]
Enfin, la structure Color, représente une couleur ARGB (Alpha, Red, Green, Blue). Le alpha
représente le niveau de transparence de cette couleur.
Il est possible de créer une couleur grâce à la méthode statique FromArgb :
Mais aussi par le biais des propriétés de la structure Color représentant des couleurs prédéfinies:
• [Link]
• [Link]
• [Link]
• …
La classe Graphics met à votre disposition une batterie de méthodes pour dessiner de nombreuses
formes géométriques, telles que des rectangles, ellipses, polygones, etc… En voici quelques une :
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 56 / 80
Attention : n’oubliez pas d’appeler la méthode Dispose de votre objet Graphics après l’avoir utiliser.
Cette méthode libère notamment les ressources non managées associées à cet objet. N’appelez cette
méthode que lorsque vous avez créé l’objet Graphics.
Pour définir simplement ces deux entités, on peut comparer les objets Brush à un rouleau de peinture
permettant de colorier de larges surfaces, et l’objet Pen à un pinceau utilisé pour effectuer des tracés
plus précis.
Les différents types de Brush et la classe Pen se trouvent dans le namespace [Link].
• Utilisation de la SolidBrush
La classe SolidBrush représente un « rouleau de peinture », pour reprendre cette expression, de
couleur unie.
Voici un des constructeurs de la classe SolidBrush :
[Link](sb, rect);
[Link]();
[Link]();
Résultat :
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 57 / 80
Il existe une sélection de SolidBrush prédéfinie disponible à partir de la classe Brushes, il s’agit de
propriétés statiques de cette classe. En voici quelques une :
• [Link]
• [Link]
• [Link]
• …
Tout comme l’objet Graphics, les Brush propose une méthode Dispose permettant de libérer
correctement les ressources associées à cet objet.
• Utilisation du Pen
La classe Pen représente un « pinceau » d’une couleur unie, permettant de dessiner des lignes et les
contours de formes géométriques.
On peut créer un objet Pen de la façon suivante :
Ce constructeur prends en paramètre une couleur (type Color), ainsi qu’une taille de type float
définissant l’épaisseur du tracé.
Voici comment dessiner une ligne sur une surface :
[Link]();
[Link]();
Résultat :
Par analogie avec la classe Brushes, il existe une classe Pens offrant un panel de Pens préféfinis. En
voici quelques un :
• [Link]
• [Link]
• [Link]
• …
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 58 / 80
Comme la plupart des objets de GDI+, la classe Pen possède une méthode Dispose qu’il ne faut pas
oublier d’appeler après tous les traitements.
[Link] Images
Les images en GDI+ .NET sont représentées par la classe Image située dans le namespace
[Link].
Cette classe contient toutes les données d’une image en mémoire. Cette image peut être chargée dans
un objet de type Image à partir d’un fichier, d’un flux ([Link]) ou encore créée
directement dans le code.
Nous allons voir dans un premier temps comment créer notre objet Image, puis comment l’afficher sur
une surface grâce à l’objet Graphics.
Exemple :
Il est possible de créer une image de la sorte à partir d’à peu près n’importe quel format d’image
connu : (JPEG, BMP, GIF, TIFF, PNG, etc…).
La méthode FromFile peut générer une exception si le fichier n’existe pas ou que le format de l’image
n’est pas reconnu.
Maintenant nous allons créer notre image à partir de ce flux grâce à la méthode statique FromStream
de la classe Image :
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 59 / 80
Pour récupérer une image sur le Web, nous allons utiliser la classe WebClient du namespace
[Link].
Récupération du flux de l’image (ici le logo du laboratoire .NET) :
Notre image une fois créée ne contient rien. Il va falloir lui ajouter du contenu.
Pour cela nous allons récupérer l’objet Graphics de notre image, grâce à la méthode statique
FromImage de la classe Graphics.
Il est donc possible de dessiner n’importe quoi sur notre image via son objet Graphics.
6.5.4. Affichage
Maintenant que nous savons comment créer nos images en mémoire, il va être interessant de savoir
comment les afficher à l’écran sur nos surfaces de dessin.
Nous avons donc toujours besoin d’un objet Graphics, qui va nous servir à effectuer le dessin de
l’image. Ensuite, il faudra appeler la méthode DrawImage de cet objet afin d’afficher le contenu de
l’image sur la surface gérée par l’objet Graphics.
Exemple :
Graphics g = [Link]();
// On utilisera l’objet bmp de type Bitmap comme image à afficher.
[Link](bmp, 30f, 70f);
[Link]();
[Link]();
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 60 / 80
Résultat:
[Link] du texte
L’affichage d’un texte sur une surface n’est bien sûr pas fait pour remplacer le control Label, mais afin
de pouvoir réaliser des effets graphiques sur ce texte.
Pour l’affichage du texte nous aurons besoin d’un objet de type Font définissant la police et la taille à
utiliser pour dessiner le texte.
Cet objet Font se construit ainsi :
L’affichage de texte se fait via la méthode DrawString de l’objet Graphics que vous aurez créé.
En voici un exemple :
Graphics g = [Link]();
string message = "Hello world !";
Comme vous pouvez le constater encore une fois, la classe Font propose également une méthode
Dispose pour effectuer la libération des ressources associées à cet objet.
Résultat :
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 61 / 80
[Link] concrets
Voici quelques réalisations dont un issu d’un article du laboratoire .NET qui ont été codées en GDI+
.NET :
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 62 / 80
7. Impression
L’impression à partir d’une application Windows repose sur trois contrôles :
• PrintDocument : Représente le document à imprimer.
• PrintPreviewDialog : Représente la boite de dialogue d’aperçu avant impression.
• PreviewDialog : Représente la boite de dialogue de configuration de l’impression.
[Link] = 50;
[Link] = 50;
[Link] = 50;
[Link] = false;
}
L’objet PrintDocument possède une méthode Print qui va permettre de lancer l’impression. Cette
méthode va déclencher l’événement PrintPage qui devra contenir le code permettant l’impression.
[Link]+=
new PrintPageEventHandler(myDocument_PrintPage);
}
Dans le concepteur de Form, vous arriverez au même résultat en ajoutant un control PrintDocument à
votre formulaire et en double cliquant dessus.
[Link]();
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 63 / 80
Comme nous l’avons dit précédemment, c’est vous qui allez écrire le code pour imprimer votre
document.
Il va vous falloir passer par GDI+ : La méthode déclenchée par l’événement PrintPage va vous
transmettre en argument un objet PrintPageEventArgs. Celui-ci vous donnera accès à un objet
Graphics qui vous permettra donc de mettre vos données en forme.
L’exemple suivant va vous permettre d’imprimer la chaîne de caractère « Impression avec .Net » sur
une page :
L’impression se voit donc régie par les lois de GDI+, pour écrire une ligne, il vous faudra utiliser la
méthode DrawString d’un objet graphique.
Ici, on définit un objet Font avec un style Arial et une police de 10.
On initialise le point de départ de la ligne avec les valeurs des marges que l’on avait initialiser
précédemment à travers la propriété DefaultSettings de l’objet PrintDocument(l’objet
PrintPageEventArgs nous permet en effet de récupérer ces données).
Enfin, on initialise la couleur d’impression à l’aide de l’objet printColor.
Il suffit ensuite d’appeler la méthode DrawString en lui passant tous ces arguments et votre document
sera imprimé avec la chaîne de caractères « Impression avec .Net ».
La propriété HasMorePages permet de renseigner le module d’impression à savoir s’il reste des
choses à imprimer. Si vous passer cette propriété à true, l’évènement lié à PrintPage sera de nouveau
déclenché sur une nouvelle page.
Par défaut cette propriété est à false, ce qui signifie que vous n’êtes pas obligés de la définir comme
ci-dessus.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 64 / 80
[Link]();
}
Pour générer l’aperçu, le control PrintPreviewDialog, simuler l’impression via l’évènement lié à
PrintPage.
Si vous décidez d’imprimer le document, il vous suffira de cliquer sur l’icône d’impression située en
haut à gauche de la boite de dialogue, ce qui provoquera l’appel de la méthode Print de l’objet
PrintDocument rattaché au control PrintPreviewDialog.
C’est le control PrintDialog qui va vous permettre d’afficher cette boite de dialogue. Pour cela, rien de
très original, il suffira de rattacher un objet PrintDocument au contrôle PrintDialog, puis de lancer la
boite à l’aide de la méthode ShowDialog.
Les modifications effectuées par l’utilisateur seront automatiquement prises en compte.
L’exemple suivant montre comment afficher cette boite de dialogue, puis comment lancer
l’impression si l’utilisateur valide la boite.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 65 / 80
8. Génération
Une fois votre application créée vous allez pouvoir générer un fichier exécutable. Pour cela, allez
dans Générer >> Générer en tâche de fond…
Une fenêtre va alors s’ouvrir, vous permettant de configurer votre génération :
Pour générer votre exécutable final, cochez la case Release, (comme le montre l’image), cliquer
ensuite sur Générer, un fichier exécutable va alors être créé dans le répertoire Release du
répertoire Bin qui se situ lui-même à la racine du répertoire de votre solution.
Vous pouvez également générer votre solution à la ligne de commande. Pour cela, ouvrez l’invite
de commande de Visual Studio .Net 2003 :
Démarrer >> Programmes >> Microsoft Visual Studio .Net 2003 >> Outils Visual Studio
.Net 2003 >> Visual Studio .Net 2003 Command Prompt
Il s’agit d’une invite de commande, comme celui du Dos, mais qui contient des variables
d’environnements utiles à l’utilisation de Visual Studio .Net 2003.
Placez-vous ensuite dans le répertoire de votre solution. Utilisez cd pour vous déplacez, comme
dans l’invite de commande CMD. Une fois dans ce répertoire, tapez la ligne de commande
suivante :
csc [Link]
Il faut absolument spécifier le fichier comportant le point d’entrée principale (la méthode
Main).Ensuite, il faut spécifier tous les fichiers de codes utilisés dans l’application.
Par exemple, dans notre cas, nous n’utilisons pas le formulaire Form2, mais uniquement le
formulaire Form1. Nous pourrions donc générer notre exécutable en spécifiant uniquement le
fichier [Link].
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 66 / 80
Par défaut, le fichier exécutable généré prend le nom du fichier comportant le point d’entrée
principal lorsque l’on génère à la ligne de commande, et il prend le nom du Namespace lorsque
l’on passe par le designer.
Dans notre cas, lorsque nous générons notre application, le fichier créé se nommera [Link]
lorsque l’on passe par l’invite de commande, et Premier_Projet.exe lorsque l’on passe par le
designer.
On peut modifier cela.
Ouvrez la fenêtre des propriétés du projet : Click doit sur le projet dans l’explorateur de
solutions, puis Propriétés.
Bien sûr, si vous utilisez un espace dans votre nom, une erreur sera générée car le nom sera
interprété comme deux argument différents: le premier comme argument de l’option OUT, et le
second comme un fichier à compiler qu’il ne trouvera pas.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 67 / 80
9. Déploiement
9.1. Présentation
Pour déployer une Application Windows, il existe deux moyens :
• Copier le fichier exécutable sur le(s) poste(s) client(s).
• Créer un projet de déploiement.
La première méthode est la plus simple : il suffit de copier le fichier exécutable sur le poste cible, et de
renouveler l’opération autant de fois qu’il y a de postes de cibles.
Cette solution présente deux inconvénients. Tout d’abord, il convient de remarquer que cette méthode
est lourde dès que le nombre de poste client devient important. Ensuite, avec cette méthode, vous ne
pouvez exécuter d’opération durant l’installation. Imaginez que vous devez créer une clé registre
indispensable au bon fonctionnement de l’application : il vous faudra copier le fichier, puis, créer la
clé à la main voir, au mieux, à l’aide d’un script. Il faudra donc à chaque fois copier le fichier, puis
lancer le script ou créer directement la clé.
La seconde méthode va ainsi vous faciliter la vie dans le sens, où elle va vous permettre de déployer
votre application de manière totalement automatisée. Il suffira de mettre le projet de déploiement à
disposition des utilisateurs, sur l’intranet de l’entreprise par exemple (projet de déploiement =
Setup), puis les utilisateurs pourront directement récupérer le fichier.
L’installation étant totalement automatisée, l’utilisateur peut procéder directement à l’installation
puisqu’il est entièrement assisté par Windows Installer.
9.2.1. Création
Pour créer un projet de déploiement, dans l’explorateur de solutions, faites un clicque droit sur la
solution, puis Ajouter >> Nouveau Projet…
La fenêtre de création de projet va alors s’affichée. Sélectionner Projets de déploiement et de
configuration, puis Projet de configuration.
Comme lors de la création du projet d’application Windows, il vous faudra spécifier un nom à votre
projet de déploiement.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 68 / 80
Notre projet de déploiement est encore vide, et il va falloir le configurer avant de pouvoir déployer
notre application.
Intéressons nous tout d’abord aux propriétés de ce projet :
• Author : Il s’agit de l’auteur de l’application, c’est le nom qui sera affiché dans la fenêtre
d’ajout/suppression des programmes de windows.
• Description : Vous pourrez ajouter ici une description de votre application. Elle figurera
également dans la fenêtre d’ajout/suppression des programmes de Windows.
• DetectNewerInstal : Force le programme à vérifier l’existence d’une version plus récente de
l’application. Si une version plus récente est détectée, l’installation échoue. Pour passer à
travers cette vérification, il suffit de mettre cette propriété à false.
• Manufacturer : Nom du fabriquant. Ce nom servira à nommer le répertoire qui contiendra
l’application (par défaut), et sera également affiché dans la fenêtre d’ajout/suppression des
programmes Windows.
• ProductName : Il s’agit du nom de votre application. Comme pour les propriétés précédentes,
c’est ce nom qui sera listé au sein de Windows.
• UpgradeCode : Il s’agit d’un code qui est partagé entre les différentes versions d’une
application. Ce code nous permet alors de savoir si une version de l’application existe déjà sur
l’ordinateur cible. Il sera utilisé par Windows.
• ProductCode : Il s’agit d’un code qui, cette fois, identifie une application de manière unique.
En combinant la propriété UpgradeCode et ProductCode, Windows pourra ainsi détecter les
différentes versions d’une même application (UpgradeCode similaire mais ProductCode
différent), mais également distinguer d’entre les différentes applications (UpgradeCode et
ProductCode différents).
Par exemple, en mettant la propriété DetectNewerVersion à true, Windows va rechercher une
application possédant le même UpgradeCode que celle à installer, mais avec un ProductCode
différents. Il pourra ensuite évaluer si l’application trouvée est plus récente ou non que celle
qu’il doit installer.
• RemovePreviousVersion : Cette propriété va forcer Windows Installer à vérifier si une
version de l’application est déjà présente sur l’ordinateur cible. Mise à true, cette propriété va
forcer la désinstallation d’une éventuelle version déjà présente sur l’ordinateur avant
d’installer la nouvelle version. A false, aucune vérification n’est effectuée.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 69 / 80
Ces répertoires sont disponibles par défaut, mais vous pouvez en ajouter d’autres selon vos besoins.
Pour cela, clique droit sur Système de fichier de l’ordinateur cible, puis il suffit de sélectionner
Ajouter un dossier spécial. Une liste va alors s’afficher et vous n’avez plus qu’à choisir.
Voyons maintenant comment paramétrer la sortie de notre projet d’application Windows (ce qui sera
déployé sur l’ordinateur cible).
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 70 / 80
Commençons par l’application. Elle est considérée comme la sortie principale de notre projet de
déploiement. Aussi, pour la déployer, il suffit de faire un clique droit sur le dossier vers lequel elle
sera copiée (généralement le dossier d’application dans Program Files), puis : Ajouter >> Sortie du
projet…
Une boite de dialogue va alors s’afficher et il vous faudra alors choisir le type de fichier à déployer.
Nous voulons ici déployer uniquement l’application, et comme nous l’avons dit précédemment, il
s’agit de la sortie principale du projet. Sélectionnez donc cette option, puis cliquez sur ok.
La sortie du projet apparaît alors dans le dossier d’application (car c’est celui-ci que nous avons
sélectionné).
Votre projet est désormais prêt, et il ne manque plus qu’à le générer. Pour cela, ouvrez la fenêtre de
génération de tâche de fond (Générer >> Générer en tâche de fond…), puis cochez la génération en
release pour le projet d’application Windows ainsi que pour le projet de déploiement.
Ce dernier va en fait aller récupérer le résultat de la génération du projet de l’application pour en faire
un Stups (souvenez vous, nous avions choisi sortie principale).
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 71 / 80
Pour cela, il va tout d’abord falloir modifier l’interface graphique de Windows Installer.
Vous arrivez alors sur un écran qui vous liste la totalité des fenêtres qui s’afficheront par défaut.
A noter que cette fenêtre est séparée en deux parties :
• Installer : C’est cette installation et donc ces fenêtres qui seront lancées lorsque vous n’êtes
pas Administrateur de votre machine.
• Installation d’administration : Cette installation sera lancée lorsque vous êtes
l’administrateur de la machine.
Nous allons configurer uniquement la première partie, le mode de fonctionnement étant le même pour
les deux.
Pour ajouter une fenêtre qui devra apparaître au début de l’installation, faites un clique droit sur
Début. Sélectionnez ensuite Ajouter une boite de dialogue.
Vous arrivez alors sur l’écran de sélection des boites de dialogues, sachant que les boites que vous
pouvez ajouter sont prédéfinies, que vous ne pouvez ajouter qu’un nombre limité de boites, et
enfin qu’une boite ne peut être utilisée qu’une seule fois (on ne peut pas ajouter deux fois la même
boite).
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 72 / 80
Nous choisissons d’ajouter une fenêtre de Zones de texte : Il s’agit d’une fenêtre pouvant présenter à
l’utilisateur jusqu’à quatre zone de texte.
Remarquez qu’il existe trois boites de dialogues nommées Zones de texte. Rappelez-vous, que vous
ne pouvez ajouter une boite qu’une seule fois, et donc si vous avez besoin de plus de quatre zones de
texte, il vous faudra ajouter une seconde boite (voir la troisième).
Par défaut, la nouvelle boite installée est placée de manière à apparaître à la fin de l’étape choisie. Or,
dans notre cas par exemple, aucune boite ne doit apparaître après la fenêtre Confirmer l’installation.
Il va donc falloir déplacer notre nouvelle boite. Pour cela, clique droit sur la boite à déplacer, puis
choisissez Monter. Faites en de même jusqu’à ce que la boite apparaisse en deuxième position (juste
après la boite Bienvenue).
On constate ensuite un groupe de propriété qui se répète 4 fois de suite. C’est ce groupe de propriété
qui permet de paramétrer une zones de texte, et étant donnée que l’on à le droit à 4 zones au
maximum, le groupe se répète 4 fois de suite.
• Edit1Label : C’est le texte qui va précéder votre zone de texte.
• Edit1Property : Il s’agit du nom (ou plutôt de l’index) de votre zone de texte. Celui ci
permettra de récupérer la valeur du champ (comme pour un formulaire Web).
• Edit1Value : Valeur par défaut qui sera affichée dans la zone de texte.
• Edit1Visible : Permet d’afficher ou non la zone de texte.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 73 / 80
using System;
using [Link];
using [Link];
using [Link];
namespace Premier_Projet
{
[RunInstaller(true)]
public class myInstaller : Installer
{
public Installer()
{
// Cet appel est requis par le concepteur.
InitializeComponent();
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 74 / 80
{
[Link]();
}
}
[Link]( disposing );
}
Par défaut, cette classe est incluse dans le namespace du projet (ici Premier_Projet) et comporte les
directives Using nécessaires à son bon fonctionnement. Elle comporte également un constructeur, un
destructeur et une méthode d’initialisation (InitializeComponent) par défaut.
Une fois ce fichier ajouté, ajoutez à la classe qu’il contient la méthode suivante :
C’est cette méthode qui sera appelée durant l’installation et c’est donc au sein de celle-ci que devra
figurer le code implémentant la tâche spécifique qui devra être exécutée durant l’installation.
Remarquer au passage le descripteur override. En effet, la méthode Install est déjà définie dans la
classe mère ([Link]) et l’utilisation de ce mot clé va permettre de
redéfinir cette méthode.
Cette classe contient une propriété nommée Parameters appartenant à la classe dont elle hérite et qui
est en fait un dictionnaire de tous les paramètres entrés par l’utilisateur lors de l’installation.
Les noms des zones de texte par lesquels ces paramètres ont été entrés, vont servir de clé au sein du
dictionnaire.
Ainsi, pour obtenir la valeur du champ nommé Text1 il faudra faire :
Voyons maintenant un exemple avec l’ajout d’une clé au registre durant l’installation.
Voici tout d’abord une fonction permettant d’ajouter une clé au registre :
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 75 / 80
//Création de la clé
[Link] MaCle =
[Link](Chemin);
Il nous suffit simplement d’appeler cette fonction dans la méthode Install de notre classe Installer afin
qu’elle soit exécutée. Bien sûr, il faudra au préalable avoir récupérer les deux paramètres entrés par
l’utilisateur.
En supposant que ceux-ci se nomment valeurCle et cheminCle, voici à quoi devrait ressembler notre
classe au final :
using System;
using [Link];
using [Link];
using [Link];
namespace Premier_Projet
{
[RunInstaller(true)]
public class myInstaller : Installer
{
private [Link] components = null;
public myInstaller()
{
// Cet appel est requis par le concepteur.
InitializeComponent();
#endregion
#region Code ajouté pour l’exemple, en plus du code présent par défaut
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 76 / 80
{
String vCle = [Link]["valeurCle"];
String cCle = [Link]["cheminCle"];
InitialiseCle(vCle, cCle);
}
[Link]("Port",Value);
}
#endregion
}
}
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 77 / 80
En effet, les applications Windows étant compilées à la volée durant l’exécution, on pourra modifier
des paramètres concernant l’application sans avoir à la recompiler.
Imaginez que votre application soit conçue pour fonctionner avec la version 1.0 d’un assemblage
installé dans le GAC. Vous installez la version 1.2 de cet assemblage (toujours dans le GAC) et vous
voulez que votre application fonctionne avec cette nouvelle version. Vous allez pouvoir spécifier cela
dans le fichier de configuration.
Le fichier de configuration est un fichier au format XML. Pour être pris en compte, il doit :
• Avoir un nom de la forme Nom_Application.Config
• Etre installé dans le répertoire courant de l’application.
Par exemple si vous avez une application [Link]. Votre fichier de configuration devra
alors se nommé [Link] et se situé dans le même répertoire que votre application.
Pour ajouter un fichier de configuration à un projet, il suffit de suivre la procédure d’ajout de fichier à
un projet décrite au chapitre 2.1.
Les fichiers de configurations font parti de la catégorie Utilitaire.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 78 / 80
</configuration>
On remarque tout d’abord les informations concernant le fichier XML (propre à tous les fichiers
XML), suivi du nœud configuration.
Il s’agit du nœud parent. Pour que des paramètres de configurations soient pris en compte, ils doivent
impérativement se situer entre ces deux nœuds.
Autrement dit, tout ce que vous ajouterez à ce fichier devra se trouver entre la balise
<configuration> et la balise </configuration>.
10.2. Utilisation
10.2.1. Données propres à votre application
Nous avons vu que le fichier de configuration permettait de spécifier soit des données propres à votre
application, soit des données propres à l’exécution de votre application. Voyons dans un premier
temps comment spécifier des données propres à votre application. Pour cela, il va vous falloir ajouter
un nœud <appSettings>.
Vous allez pouvoir spécifier dans ce nœud toutes les données propres à votre application, elles seront
indexées à l’aide d’un identifiant (clé), et pourront facilement être récupérer dans le code.
Imaginez que vous développiez une application devant écouter un port. En fonction des firewall de
chaque machines, de la politique de sécurité de chaque Entreprise, le port d’écoute ne sera pas le
même. Plutôt que de devoir convaincre la direction des systèmes d’information d’ouvrir le port
nécessité, il sera plus simple d’avoir juste à modifier ce port en fonction de ceux ouverts sur la
machine cliente.
Pour cela, il vous suffira d’ajouter dans votre nœud <appSettings> un nœud <add/> qui lui vous
permettra de spécifier vos données.
<appSettings>
<add key="Application Port" value="9000" />
</appSettings>
Ce nœud <add/> est composé de deux attributs, une clé (l’identifiant) et une valeur correspondant à
cette clé. Il peut être répété autant de fois que nécessaire dans la balise appSettings afin de définir
toutes vos constantes d’application. Voyons maintenant comment accéder à ces paramètres dans le
code.
Voici la ligne de code permettant de récupérer la valeur de notre paramètre « Application Port » :
Ainsi, avec une simple ligne de code on va pouvoir récupérer des données pour notre application.
Avec une application classique, il aurait fallut passer par la base de registre.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 79 / 80
En plus du code que cela suscite (lecture de la base de registre), ce système était limité dans la mesure
où il était propre à une machine et donc pas facilement portable (à moins de recréer la clé sur la
nouvelle machine).
Avec un fichier de configuration, comme nous l’avons dit précédemment, il suffira de copier le fichier
dans le répertoire courant de l’application pour que celui-ci soit pris en compte.
Pour reprendre l’exemple évoqué plus haut, une application conçue pour fonctionner avec un
assemblage ayant un nom fort continuera d’utiliser celui-ci même si une nouvelle version de
l’assemblage est disponible.
Pour pallier à ce problème, il va falloir utiliser le fichier de configuration. Il existe en effet des
paramètres de configuration permettant de spécifier cela.
Tout ce qui concerne les liaisons d’assemblages et les spécifications quant au Garbage Collector doit
être spécifié dans une section Runtime délimitée par les balises <runtime> et </runtime>.
Cette balise requiert obligatoirement l’attribut xmlns qui permettra de spécifier l’espace de nom XML
nécessaire pour les liaisons d’assemblages.
Une fois les informations permettant d’identifier l’assemblage actuellement utilisé, il va falloir
spécifier les informations concernant le nouvel assemblage vers lequel devra se faire la redirection.
Pour cela, il faudra utiliser l’élément <bindingRedirect>. Cet élément se compose des attributs
suivants :
• oldVersion : Il s’agit tout simplement de l’ancienne version de l’assemblage.
• newVersion : Il s’agit de la nouvelle version de l’assemblage.
Seuls ces deux informations seront nécessaires car le nouvel assemblage partagera le même nom, le
même nom fort que le précédent mais aura un numéro de version différent.
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs
Windows Application 80 / 80
<dependentAssembly>
<assemblyIdentity name="myAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="neutral" />
<bindingRedirect oldVersion="[Link]"
newVersion="[Link]"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
[Link]
Ce document est la propriété de SUPINFO et est soumis aux règles de droits d’auteurs