mai
2007
Tous ceux qui suivent un peu les actualités de .Net ont entendu parler du framework.net 3.0 et de WPF (Windows Presentation Foundation), si non, je peux rien pour vous
Si des mots comme XAML , classes partielles, etc … vous disent quelque chose, c’est que vous avez eu le plaisir de gouter à cette nouvelle forme de développement en C#. Mais quid du C++/CLI ?
Et bien, pas grand chose justement ; il n’y a pas de support du C++/CLI pour faire des développements .Net 3.0, et donc pas d’intégration dans visual studio ; c’est le cas au jour d’aujourd’hui, gageons qu’avec l’avénement d’orcas, il y ait des choses faite dans le sens du C++.
Mais est-ce que ca veut dire que rien n’est faisable en C++/CLI ? Etant donné que le C++/CLI est un langage comme un autre qui peut utiliser le framework.net, qu’est-ce qui pourrait nous empecher de faire des développements WPF ? Et bien, plusieurs choses justement, le fait par exemple que le C++/CLI ne supporte pas les classes partielles (même si ce n’est pas limitatif) et que CodeDom ne sache pas convertir le XAML en C++.
Tout ca pour dire que Visual C++ ne permet pas d’utiliser du XAML, mais rien n’empeche d’utiliser Visual C++ pour faire des applications WPF.
C’est ce que je vais vous montrer dans ce billet, et surement dans d’autres …
Tout d’abord, il faut être capable d’utiliser le framework 3.0, il faut donc installer le Microsoft .NET Framework 3.0 Redistributable Package. Et ensuite le Microsoft® Windows® Software Development Kit for Windows Vista™ and .NET Framework 3.0 Runtime Components.
Voilà, vous êtes prêt à développer des applications WPF en C++/CLI.
Tout d’abord, créez un nouveau projet clr vide.
Rajoutez les références vers
System
PresentationCore
PresentationFramework
WindowsBase
Enfin dans les propriétés du projet, changez le sub-system à Windows (sinon vous aurez une console qui trainera …) (linker-> system -> subsystem) et définissez un point d’entrée (main par exemple) (linker -> Advanced -> Entry point).
Il y a plusieurs techniques pour créer une application WPF, plus ou moins adpatées à vos besoins. Je vais commencer par vous décrire la plus simple à mettre en place, sans utiliser de XAML. Il va s’agir de créer les composants de notre fenêtre « à la main », sur le même principe qu’un programme WinForms, mais sans être aidé de l’IDE…
Il faut savoir que le framework se base sur la Classe Window qui se trouve dans les références que nous avons ajouté à la création du projet. Pour créer notre propre fenêtre, nous allons donc créer une classe qui va dériver de cette classe de base (un peu comme pour les winforms, où l’on hérite de Form).
using namespace System::Windows;
using namespace System::Windows::Controls;
ref class MaFenetre : Window
{
private:
Canvas^ canvas1;
TextBox^ textbox1;
Button^ button1;
public:
MaFenetre(void)
{
this->Title = "WPF avec C++/CLI";
this->Width = 200;
this->Height = 120;
textbox1 = gcnew TextBox();
textbox1->Width = 100;
textbox1->Height = 25;
Canvas::SetTop(textbox1, 10);
Canvas::SetLeft(textbox1, 50);
button1 = gcnew Button();
button1->Width = 80;
button1->Height = 25;
button1->Content = "Clic";
Canvas::SetTop(button1, 45);
Canvas::SetLeft(button1, 60);
button1->Click += gcnew RoutedEventHandler(this, &MaFenetre::OnButton1Click);
canvas1 = gcnew Canvas();
canvas1->Children->Add(textbox1);
canvas1->Children->Add(button1);
this->Content = canvas1;
}
void OnButton1Click(Object^ sender, RoutedEventArgs^ e)
{
MessageBox::Show("Hello " + textbox1->Text);
}
};
Alors, qu’y a-t-il de beau la dedans ?
Notre classe MaFenetre qui dérive de Window ; des contrôles (Canvas, TextBox et Button) ; leurs instanciations et le renseignement de leurs attributs ; l’ajout d’un événement associé au clic du bouton et une fonction qui va s’occuper de faire quelque chose quand on clic sur ce bouton.
Comme vous le voyez, ca ressemble beaucoup aux Winforms, à part que pour l’événement, on se sert de RoutedEventArgs. . Notez aussi que le Canvas est simplement un conteneur de contrôles.
Voilà pour la fenêtre, plutôt simple non ?
Nous avons maintenant besoin d’un objet d’application, créons donc une classe qui dérive de Application. La classe d’application a pour but de fournir les fonctionnalités pour démarrer une application WPF.
Voyons le code :
{
public:
MonApplication(void){}
protected:
virtual void OnStartup(StartupEventArgs^ e) override
{
Application::OnStartup(e);
MaFenetre^ maFenetre = gcnew MaFenetre();
maFenetre->Show();
}
};
On dérive de Application, on surchage a méthode OnStartup, qui, vous l’aurez devinée, est appelée au démarrage de l’application. C’est ici donc que nous instancions notre fenêtre et qu’on l’affiche (méthode Show()).
Il ne reste plus qu’à définir le point d’entrée, main :
int main(array<String^>^ args)
{
return (gcnew MonApplication())->Run();
}
On instancie la classe d’application et on appelle la méthode Run().
Et voilà, c’est fini. Compilez, lancez l’application, rentrez un mot dans la textBox et cliquez, vous obtiendrez cette minimale application WPF.
Vous voilà prêt à démarrer dans la programmation WPF avec le C++/CLI. Notez quand même que nous n’utilisons pas de XAML et que tous les contrôles sont créés à la main, ce qui nous prive d’un des avantages du XAML, à savoir la séparation du code technique de la présentation.
Mais cette technique peut s’avérer suffisante pour certains besoins et certains types d’application. Nous verrons plus tard comment intégrer du XAML dans un projet C++/CLI.
Vous me direz : quel intéret d’utiliser le C++/CLI pour faire des applications WPF ? et vous aurez raison de vous poser cette question. A part pour le sport, la bonne raison d’utiliser le C++/CLI pour faire des applications WPF est la fantastique capacité du C++/CLI à gérer l’intéropérabilité avec des applications natives. Ainsi, si votre application C++ native a besoin d’un petit lifting ou de pouvoir accéder au framework.net 3, vous saurez comment faire …
Télécharger le programme d’exemple.
Bonne prog,
Nico
Commentaires récents
- [Tests] Arrange Act Assert, une traduction ? dans
- [UnitTest][C#] Tester une méthode privée dans
- Récupérer une valeur d’un contrôle depuis une autre Form / inclusions croisées et déclaration anticipée dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
Archives
- janvier 2013
- avril 2012
- janvier 2012
- juin 2011
- janvier 2011
- décembre 2010
- novembre 2010
- septembre 2010
- juin 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- mai 2009
- avril 2009
- mars 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007