|
|
|||||||||
|
Cet article s'adresse aux développeurs désirant utiliser le .NET Compact Framework (.NET CF) pour développer des applications mobiles sur des appareils Windows CE. La philosophie .NET en général apporte un grand nombre d'avantages aux développeurs d'applications. L'un de ces avantages est de pouvoir développer de nouvelles classes qui s'appuient sur des classes existantes. Je veux bien évidemment parler de l'héritage. Il y a grosso-modo deux types de classes. Celles qui possèdent une interface graphique et celles qui n'en possèdent pas. Dans le premier cas, il s'agit d'un contrôle ou Windows Control. Dans le second cas, il s'agit tout simplement une classe. Lors de la conception d'une application, les contrôles sont placés sur des formulaires par le développeur. Par contre, les classes sont instanciées dynamiquement par le code. Si vous faites du développement .NET sur PC, vous pouvez développer des classes et des contrôles en utilisant respectivement les projets Class Library et Windows Control Library. Par contre si vous faites du développement .NET pour Windows CE. Vous devez utiliser un projet Smart Device Application. Lors de la création d'un tel projet, un assistant vous permet de spécifier le type de plate-forme que vous visez ainsi que le type de projet que vous désirez réaliser.
Comme vous pouvez le constater, en regardant la capture d'écran ci-dessus, il n'existe pas de type de projet Windows Control Library pour les smart devices ! Pour développer des classes réutilisables, seul le projet Class Library est disponible. Nous voici donc arrivé au point de départ
de mon propos. Je vais vous montrer comment développer un contrôle
mobile en partant d'un projet de classe.
Comme d'habitude, afin d'illustrer mon article, il me faut un exemple à la fois simple et efficace. J'ai choisi de vous montrer comment implémenter un bouton pouvant être muni d'une icône. Ce contrôle, que nous appellerons dorénavant PictureButton, n'est pas fourni en standard dans la boîte à outils de Visual Studio .NET.
PS : rien ne vous empêche de transposer le code
de cet article en VB .NET si le coeur vous en dit.
Si vous avez bien suivi mes indications, vous
devriez obtenir un code similaire à ceci :
De ces deux propriétés, seule Icon va devoir être implémentée. En effet, la propriété Text est une propriété commune des contrôles .NET. De ce fait elle est prise en charge par la classe Windows.Forms.Control. Comme notre PictureButton dérive justement de cette classe, nous héritons aussi de la propriété Text. Afin d'ajouter la propriété Icon,
faites un click droit sur votre classe PictureButton dans la fenêtre
Class View. Ensuite dans le menu contextuel, choisissez Add -> Add
Property...
Un appui sur le bouton 'Finish' va générer les méthodes d'accès set et get à la propriété. Vous pouvez remarquer sur la capture d'écran qu'il n'est pas possible de spécifier directement System.Drawing.Icon comme type de propriété. Une fois le code généré, il va falloir changer le type string en type System.Drawing.Icon. De plus déclarez une variable membre privée m_icoBtn de type System.Drawin.Icon. Cette dernière servira à stocker la valeur de la propriété Icon. Voici donc le code de la propriété Icon :
Notez l'instruction this.Invalidate() dans la méthode set. Elle sert à forcer un réaffichage du contrôle lorsque la valeur de la propriété Icon change. En ce qui concerne la propriété Text, il y a quand même un petit quelque chose à coder dans notre classe. Il faut s'assurer que le contrôle sera rafraîchi lorsque le texte change. Ce comportement n'est pas implémenté par défaut. Je vous propose donc de réagir à l'évènement TextChanged de la classe de base Control. Pour gérer cet évènement,
ajouter cette ligne code dans le constructeur de votre PictureButton :
Normalement, vous ne devrez pas taper le code à droite du signe '=' ! Dès que vous aurez tapé le caractère '=', l'éditeur de Visual Studio .NET va vous proposer une déclaration par défaut pour la fonction de gestion de l'évènement. Appuyez deux fois sur la touche Tab pour accepter les propositions. Ajoutez ensuite la ligne this.Invalidate() à
l'intérieur de l'event handler comme suit :
Dans la function PictureButton_Paint ajoutez le code qui affiche l'icône et le texte. Dans le code ci-dessous, l'icône et le texte sont centrés verticalement par rapport à la hauteur du contrôle. De plus je réalise les opérations non pas directement sur la fenêtre mais sur une bitmap en mémoire. Lorsque le bouton est dessiné, je transfère le contenu de la bitmap dans la zone client du contrôle. Ceci permet d'éviter des effets de clignotement du bouton lors de l'affichage. Voici le code de l'évènement Paint :
Voici la première étape du travail réalisée : vous avez maintenant une classe PictureButton développée avec le framework compact. La deuxième étape du développement
consiste à fournir au développeur le moyen de placer votre
contrôle PictureButton sur une fenêtre directement à
partir de l'environnement de développement Visual Studio .NET.
En fait, un contrôle graphique possède deux modes de fonctionnement appelés mode design-time et mode run-time. Dans le mode design-time, un contrôle est instancié par Visual Studio .NET pour permettre au développeur de visualiser le contrôle et d'interagir avec lui. Ce mode est appelé design-time tout simplement parce que le développeur est en train de concevoir son application. Quand un contrôle s'exécute en design-time, généralement il n'offre pas 100% de ses fonctionnalités : il se limite bien souvent à produire un rendu graphique à l'intérieur de la fenêtre hôte. Par contre, quand l'application est réellement exécutée, le contrôle est alors instancié en mode run-time. Dans ce mode, le contrôle offre toutes ses fonctionnalités. La question qui vous vient probablement à l'esprit maintenant est : " Mais comme puis-je savoir si mon contrôle est exécuté en mode design-time ou run-time ? ". Dans le cas d'un contrôle mobile la réponse est subtile. La particularité d'un contrôle mobile est que en mode design-time, il s'exécute sur votre PC et qu'il utilise le Framework .NET complet. Par contre, en mode run-time, il s'exécute sur votre appareil mobile et utilise le Framework .NET compact. Ceci nous amène tout droit à la réponse: il va falloir développer deux exemplaires de la classe, une pour chaque mode. Dans la première partie de l'article, nous avons développé la classe utilisant le Framework compact et destinée à tourner en mode run-time. Il nous reste donc à développer la classe pour le design-time qui cette fois-ci devra utiliser le Framework complet. Vous pourriez créer un nouveau projet et redévelopper votre contrôle pour le Framework .NET complet. Nous allons cependant procéder d'une autre manière. Je vous propose de repartir du même code source et d'y faire quelques aménagements pour le mode design-time. Ces aménagements seront sous l'influence de directives de compilation conditionnelles. De cette manière, nous serons en mesure d'assembler le code pour le framework complet et le framework compact à partir du même source. Pratiquement, à chaque fois que nous placerons du code spécifique au mode design-time, nous le mettrons à l'intérieur d'un bloc #if #endif comme suit :
Le premier attribut à ajouter est l'attribut RuntimeAssemblyAttribute. Il permet de spécifier à Visual Studio .NET quelques informations liées à la version runtime de l'assembly qui sera téléchargé sur l'appareil mobile.
RuntimeAssemblyAttribute spécifie le numéro
de version, la langue et une clé publique si vous désirez
développer une classe globale. Notez que le numéro de version
est censé coincider avec la version de l'assembly .NET CF.
l'attribut Category vous permet de spécifier
l'emplacement de la propriété Icon dans la fenêtre
des propriétés. J'ai choisi 'Custom' dans cet exemple et
voici ce que cela donne dans l'éditeur :
L'attribut DefaultValueAttribute vous permet de donner une valeur par défaut à la propriété lorsque le développeur dépose votre contrôle sur un formulaire. Enfin l'attribut Description vous permet de donner une brève description de la propriété.
Par contre pour générer l'assembly destiné à l'environnement de développement, nous allons invoquer le compilateur C# directement sur la ligne de commande. Voici la ligne de commande à utiliser :
Je vous conseille de placer cette ligne de commande dans un fichier .bat, de manière à ne pas devoir la retaper sans cesse Quelques détails concernant la commande :
Attention :
Copiez ces deux fichiers respectivement dans les répertoires:
Démarrez Visual Studio .NET, executez un
click droit sur la fenêtre boîte à outils et sélectionnez
l'entrée de menu Add/Remove Items ...
Sur l'écran suivant, cliquez sur le bouton Browse et sélectionnez l'assembly design.PictureButton.dll que vous venez juste de copier. Vous pourrez ensuite voir votre contrôle apparaitre dans la liste des composants .NET disponibles.
Voici maintenant l'application en cours d'exécution sur l'appareil mobile.
|
|||||||||
|
Copyright 2001-2004 - Tous droits réservés Toutes les autres marques et produits présents dans ces pages sont la propriété exclusive de leurs sociétés respectives. |