<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog de Nico-pyright(c) &#187; Winforms</title>
	<atom:link href="https://blog.developpez.com/nico-pyright/pcategory/ccli/winforms/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/nico-pyright</link>
	<description></description>
	<lastBuildDate>Mon, 08 Apr 2013 09:26:35 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>[Winforms] [C++/CLI][C#] Databinding Bidirectionnel avec les Winforms</title>
		<link>https://blog.developpez.com/nico-pyright/p6425/ccli/winforms_c_cli_c_databinding_bidirection</link>
		<comments>https://blog.developpez.com/nico-pyright/p6425/ccli/winforms_c_cli_c_databinding_bidirection#comments</comments>
		<pubDate>Sun, 21 Sep 2008 08:30:58 +0000</pubDate>
		<dc:creator><![CDATA[nico-pyright(c)]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[C++/CLI]]></category>
		<category><![CDATA[Winforms]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le binding bidirectionnel consiste à &#171;&#160;associer&#160;&#187; une propriété de classe à un controle de Formulaire. Par exemple, j&#8217;ai un textbox sur ma form qui est associé à une chaine (String) dans ma classe. Toute modification de ce textbox entraine automatiquement une modification de ma chaine. Inversement, toute modification de cette chaine en code, implique une répercution visuelle sur la valeur du textbox. Voici comment implémenter un tel binding : Le principe est d&#8217;utiliser l&#8217;interface INotifyPropertyChanged. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Le binding bidirectionnel consiste à &laquo;&nbsp;associer&nbsp;&raquo; une propriété de classe à un controle de Formulaire.</p>
<p>Par exemple, j&rsquo;ai un textbox sur ma form qui est associé à une chaine (String) dans ma classe. Toute modification de ce textbox entraine automatiquement une modification de ma chaine. Inversement, toute modification de cette chaine en code, implique une répercution visuelle sur la valeur du textbox.</p>
<p>Voici comment implémenter un tel binding :</p>
<p><span id="more-18"></span></p>
<p>Le principe est d&rsquo;utiliser l&rsquo;interface <a href="http://msdn.microsoft.com/fr-fr/library/system.componentmodel.inotifypropertychanged.aspx">INotifyPropertyChanged</a>. L&rsquo;appel de l&rsquo;événement <a href="http://msdn.microsoft.com/fr-fr/library/system.componentmodel.inotifypropertychanged.propertychanged.aspx">PropertyChanged</a> permet d&rsquo;informer que la valeur a changé et automatiquement répercuter ce changement.</p>
<p>Voici comment faire en C++/CLI (plus loin, la version C#) :</p>
<p>Tout d&rsquo;abord, la form doit implémenter INotifyPropertyChanged</p>
<p><code class="codecolorer text default"><span class="text">public ref class Form1 : public System::Windows::Forms::Form, INotifyPropertyChanged</span></code></p>
<p>Ceci implique de définir l&rsquo;événement suivant :</p>
<p><code class="codecolorer text default"><span class="text">virtual event PropertyChangedEventHandler ^PropertyChanged;</span></code></p>
<p>Il nous faut ensuite une propriété de type String. C&rsquo;est cette propriété qui sera bindée à notre TextBox :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">private: <br />
&nbsp; String ^_chaine; <br />
public: <br />
&nbsp; property String ^Chaine <br />
&nbsp; { <br />
&nbsp; &nbsp; String ^ get() { return _chaine; } <br />
&nbsp; &nbsp; void set(String ^value) &nbsp;<br />
&nbsp; &nbsp; { &nbsp;<br />
&nbsp; &nbsp; &nbsp; if (value != _chaine) <br />
&nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; _chaine = value; <br />
&nbsp; &nbsp; &nbsp; &nbsp; NotifyPropertyChanged(&quot;Chaine&quot;); <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; } <br />
&nbsp; }</div></div>
<p>On note l&rsquo;appel à la méthode NotifyPropertyChanged pour indiquer une changement de valeur.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">private: <br />
&nbsp; void NotifyPropertyChanged(String ^info) <br />
&nbsp; { <br />
&nbsp; &nbsp; PropertyChanged(this, gcnew PropertyChangedEventArgs(info)); <br />
&nbsp; }</div></div>
<p>La méthode NotifyPropertyChanged appelle l&rsquo;événement PropertyChanged pour signaler le changement afin qu&rsquo;il soit répercuté à tous les endroits où le binding est effectué.</p>
<p>Ne pas oublier de définir le binding, au plus tot, dans le form_load par exemple :<br />
<code class="codecolorer text default"><span class="text">textBox1-&gt;DataBindings-&gt;Add(&quot;Text&quot;, this, &quot;Chaine&quot;);</span></code></p>
<p>Et le tour est joué.</p>
<p>Voici la syntaxe pour du C# :</p>
<p><code class="codecolorer text default"><span class="text">public partial class Form1 : Form, INotifyPropertyChanged</span></code></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">private string _chaine; <br />
public string Chaine <br />
{ <br />
&nbsp; &nbsp; get { return _chaine; } <br />
&nbsp; &nbsp; set <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (value != _chaine) <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _chaine = value; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NotifyPropertyChanged(&quot;Chaine&quot;); <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; } <br />
} <br />
&nbsp;<br />
private void Form1_Load(object sender, EventArgs e) <br />
{ <br />
&nbsp; &nbsp; textBox1.DataBindings.Add(&quot;Text&quot;, this, &quot;Chaine&quot;); <br />
} <br />
&nbsp;<br />
public event PropertyChangedEventHandler PropertyChanged; <br />
&nbsp;<br />
private void NotifyPropertyChanged(String info) <br />
{ <br />
&nbsp; &nbsp; if (PropertyChanged != null) <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; PropertyChanged(this, new PropertyChangedEventArgs(info)); <br />
&nbsp; &nbsp; } <br />
}</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[C++/CLI] Enregistrer un fichier avec SaveFileDialog</title>
		<link>https://blog.developpez.com/nico-pyright/p6056/ccli/c_cli_enregistrer_un_fichier_avec_savefi</link>
		<comments>https://blog.developpez.com/nico-pyright/p6056/ccli/c_cli_enregistrer_un_fichier_avec_savefi#comments</comments>
		<pubDate>Fri, 11 Jul 2008 20:00:00 +0000</pubDate>
		<dc:creator><![CDATA[nico-pyright(c)]]></dc:creator>
				<category><![CDATA[C++/CLI]]></category>
		<category><![CDATA[Winforms]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[J&#8217;étais passé rapidement sur ce point dans mon tutoriel d&#8217;introduction aux winforms, je reviens dessus vu que ca ne semble pas assez clair Pour enregistrer le contenu d&#8217;un textbox avec une SaveFileDialog, il suffit d&#8217;utiliser le stream fournir par OpenFile : saveFileDialog1-&#62;Title = &#34;Sélectionnez un fichier&#34;; saveFileDialog1-&#62;FileName = nullptr; saveFileDialog1-&#62;DefaultExt = &#34;txt&#34;; saveFileDialog1-&#62;Filter = &#34;Fichiers Texte (*.txt)&#124;*.txt&#124;Tous (*.*)&#124;*.*&#34;; if (saveFileDialog1-&#62;ShowDialog() == System::Windows::Forms::DialogResult::OK) { &#160; Stream ^s = saveFileDialog1-&#62;OpenFile(); &#160; StreamWriter ^sw = gcnew StreamWriter(s); &#160; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>J&rsquo;étais passé rapidement sur ce point dans mon <a href="http://nico-pyright.developpez.com/tutoriel/vc2005/winforms2/#LopensaveDialog">tutoriel d&rsquo;introduction aux winforms</a>, je reviens dessus vu que ca ne semble pas assez clair</p>
<p><span id="more-17"></span></p>
<p>Pour enregistrer le contenu d&rsquo;un textbox avec une SaveFileDialog, il suffit d&rsquo;utiliser le stream fournir par OpenFile :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">saveFileDialog1-&gt;Title = &quot;Sélectionnez un fichier&quot;; <br />
saveFileDialog1-&gt;FileName = nullptr; <br />
saveFileDialog1-&gt;DefaultExt = &quot;txt&quot;; <br />
saveFileDialog1-&gt;Filter = &quot;Fichiers Texte (*.txt)|*.txt|Tous (*.*)|*.*&quot;; <br />
if (saveFileDialog1-&gt;ShowDialog() == System::Windows::Forms::DialogResult::OK) <br />
{ <br />
&nbsp; Stream ^s = saveFileDialog1-&gt;OpenFile(); <br />
&nbsp; StreamWriter ^sw = gcnew StreamWriter(s); <br />
&nbsp; sw-&gt;Write(textBox1-&gt;Text); <br />
&nbsp; sw-&gt;Close(); <br />
}</div></div>
<p>C&rsquo;est tout <img src="https://blog.developpez.com/nico-pyright/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[C#] Tutoriel : Travailler avec les fichiers de configuration en C#</title>
		<link>https://blog.developpez.com/nico-pyright/p4633/c/c_tutoriel_travailler_avec_les_fichiers_</link>
		<comments>https://blog.developpez.com/nico-pyright/p4633/c/c_tutoriel_travailler_avec_les_fichiers_#comments</comments>
		<pubDate>Wed, 05 Dec 2007 08:09:35 +0000</pubDate>
		<dc:creator><![CDATA[nico-pyright(c)]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Winforms]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[voici la traduction en C# de mon article Travailler avec les fichiers de configuration en C++/CLI . Cet article a pour but de présenter diverses utilisations des fichiers de configuration dans une application Winforms en C#. Accéder au tutoriel pour travailler avec les fichiers de configuration en C#]]></description>
				<content:encoded><![CDATA[<p>voici la traduction en C# de mon article <a href="http://nico-pyright.developpez.com/tutoriel/vc2005/configurationsection">Travailler avec les fichiers de configuration en C++/CLI </a>.<br />
Cet article a pour but de présenter diverses utilisations des fichiers de configuration dans une application Winforms en C#.</p>
<p><a href="http://nico-pyright.developpez.com/tutoriel/vc2005/configurationsectioncsharp">Accéder au tutoriel pour travailler avec les fichiers de configuration en C#</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WPF avec du C++/CLI, c&#8217;est possible !</title>
		<link>https://blog.developpez.com/nico-pyright/p3531/ccli/title_57</link>
		<comments>https://blog.developpez.com/nico-pyright/p3531/ccli/title_57#comments</comments>
		<pubDate>Sat, 19 May 2007 14:10:41 +0000</pubDate>
		<dc:creator><![CDATA[nico-pyright(c)]]></dc:creator>
				<category><![CDATA[C++/CLI]]></category>
		<category><![CDATA[Winforms]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[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 &#8230; vous disent quelque chose, c&#8217;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&#8217;y a [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>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 <img src="https://blog.developpez.com/nico-pyright/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>Si des mots comme XAML , classes partielles, etc &#8230; vous disent quelque chose, c&rsquo;est que vous avez eu le plaisir de gouter à cette nouvelle forme de développement en C#. Mais quid du C++/CLI ? </p>
<p>Et bien, pas grand chose justement ; il n&rsquo;y a pas de support du C++/CLI pour faire des développements .Net 3.0, et donc pas d&rsquo;intégration dans visual studio ; c&rsquo;est le cas au jour d&rsquo;aujourd&rsquo;hui, gageons qu&rsquo;avec l&rsquo;avénement d&rsquo;orcas, il y ait des choses faite dans le sens du C++.</p>
<p>Mais est-ce que ca veut dire que rien n&rsquo;est faisable en C++/CLI ? Etant donné que le C++/CLI est un langage comme un autre qui peut utiliser le framework.net, qu&rsquo;est-ce qui pourrait nous empecher de faire des développements WPF ? <span id="more-3"></span>Et bien, plusieurs choses justement, le fait par exemple que le C++/CLI ne supporte pas les classes partielles (même si ce n&rsquo;est pas limitatif) et que CodeDom ne sache pas convertir le XAML en C++.</p>
<p>Tout ca pour dire que Visual C++ ne permet pas d&rsquo;utiliser du XAML, mais rien n&rsquo;empeche d&rsquo;utiliser Visual C++ pour faire des applications WPF.</p>
<p>C&rsquo;est ce que je vais vous montrer dans ce billet, et surement dans d&rsquo;autres &#8230;</p>
<p>Tout d&rsquo;abord, il faut être capable d&rsquo;utiliser le framework 3.0, il faut donc installer le <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=10CC340B-F857-4A14-83F5-25634C3BF043&amp;displaylang=en">Microsoft .NET Framework 3.0 Redistributable Package</a>. Et ensuite le <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c2b1e300-f358-4523-b479-f53d234cdccf">Microsoft® Windows® Software Development Kit for Windows Vista™ and .NET Framework 3.0 Runtime Components</a>.</p>
<p>Voilà, vous êtes prêt à développer des applications WPF en C++/CLI.</p>
<p>Tout d&rsquo;abord, créez un nouveau projet clr vide.<br />
Rajoutez les références vers </p>
<blockquote><p>System<br />
PresentationCore<br />
PresentationFramework<br />
WindowsBase</p></blockquote>
<p>Enfin dans les propriétés du projet, changez le sub-system à Windows (sinon vous aurez une console qui trainera &#8230;) (linker-> system -> subsystem) et définissez un point d&rsquo;entrée (<strong>main</strong> par exemple) (linker -> Advanced -> Entry point).</p>
<p>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&rsquo;agir de créer les composants de notre fenêtre &laquo;&nbsp;à la main&nbsp;&raquo;, sur le même principe qu&rsquo;un programme WinForms, mais sans être aidé de l&rsquo;IDE&#8230;</p>
<p>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&rsquo;on hérite de Form).</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">using namespace System; <br />
using namespace System::Windows; <br />
using namespace System::Windows::Controls; <br />
&nbsp;<br />
ref class MaFenetre : Window <br />
{ <br />
private: <br />
&nbsp; Canvas^ canvas1; <br />
&nbsp; TextBox^ textbox1; <br />
&nbsp; Button^ button1; <br />
&nbsp;<br />
public: <br />
&nbsp; MaFenetre(void) <br />
&nbsp; { <br />
&nbsp; &nbsp; this-&gt;Title = &quot;WPF avec C++/CLI&quot;; <br />
&nbsp; &nbsp; this-&gt;Width = 200; <br />
&nbsp; &nbsp; this-&gt;Height = 120; <br />
&nbsp; &nbsp; textbox1 = gcnew TextBox(); <br />
&nbsp; &nbsp; textbox1-&gt;Width = 100; <br />
&nbsp; &nbsp; textbox1-&gt;Height = 25; <br />
&nbsp; &nbsp; Canvas::SetTop(textbox1, 10); <br />
&nbsp; &nbsp; Canvas::SetLeft(textbox1, 50); <br />
&nbsp; &nbsp; button1 = gcnew Button(); <br />
&nbsp; &nbsp; button1-&gt;Width = 80; <br />
&nbsp; &nbsp; button1-&gt;Height = 25; <br />
&nbsp; &nbsp; button1-&gt;Content = &quot;Clic&quot;; <br />
&nbsp; &nbsp; Canvas::SetTop(button1, 45); <br />
&nbsp; &nbsp; Canvas::SetLeft(button1, 60); <br />
&nbsp; &nbsp; button1-&gt;Click += gcnew RoutedEventHandler(this, &amp;MaFenetre::OnButton1Click); <br />
&nbsp; &nbsp; canvas1 = gcnew Canvas(); <br />
&nbsp; &nbsp; canvas1-&gt;Children-&gt;Add(textbox1); <br />
&nbsp; &nbsp; canvas1-&gt;Children-&gt;Add(button1); <br />
&nbsp; &nbsp; this-&gt;Content = canvas1; <br />
&nbsp; } <br />
&nbsp;<br />
&nbsp; void OnButton1Click(Object^ sender, RoutedEventArgs^ e) <br />
&nbsp; { <br />
&nbsp; &nbsp; MessageBox::Show(&quot;Hello &quot; + textbox1-&gt;Text); <br />
&nbsp; } <br />
};</div></div>
<p>Alors, qu&rsquo;y a-t-il de beau la dedans ?<br />
Notre classe MaFenetre qui dérive de Window ; des contrôles (Canvas, TextBox et Button) ; leurs instanciations et le renseignement de leurs attributs ; l&rsquo;ajout d&rsquo;un événement associé au clic du bouton et une fonction qui va s&rsquo;occuper de faire quelque chose quand on clic sur ce bouton.<br />
Comme vous le voyez, ca ressemble beaucoup aux Winforms, à part que pour l&rsquo;événement, on se sert de <a href="http://msdn2.microsoft.com/en-us/library/system.windows.routedeventargs.aspx">RoutedEventArgs. </a>. Notez aussi que le Canvas est simplement un conteneur de contrôles.</p>
<p>Voilà pour la fenêtre, plutôt simple non ?</p>
<p>Nous avons maintenant besoin d&rsquo;un objet d&rsquo;application, créons donc une classe qui dérive de Application. La classe d&rsquo;application a pour but de fournir les fonctionnalités pour démarrer une application WPF.<br />
Voyons le code :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ref class MonApplication : Application <br />
{ <br />
public: <br />
&nbsp; MonApplication(void){} <br />
protected: <br />
&nbsp; virtual void OnStartup(StartupEventArgs^ e) override <br />
&nbsp; { <br />
&nbsp; &nbsp; Application::OnStartup(e); <br />
&nbsp; &nbsp; MaFenetre^ maFenetre = gcnew MaFenetre(); <br />
&nbsp; &nbsp; maFenetre-&gt;Show(); <br />
&nbsp; } <br />
};</div></div>
<p>On dérive de Application, on surchage a méthode OnStartup, qui, vous l&rsquo;aurez devinée, est appelée au démarrage de l&rsquo;application. C&rsquo;est ici donc que nous instancions notre fenêtre et qu&rsquo;on l&rsquo;affiche (méthode Show()).</p>
<p>Il ne reste plus qu&rsquo;à définir le point d&rsquo;entrée, <strong>main </strong>:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[STAThread] <br />
int main(array&lt;String^&gt;^ args) <br />
{ <br />
&nbsp; return (gcnew MonApplication())-&gt;Run(); <br />
}</div></div>
<p>On instancie la classe d&rsquo;application et on appelle la méthode Run().</p>
<p>Et voilà, c&rsquo;est fini. Compilez, lancez l&rsquo;application, rentrez un mot dans la textBox et cliquez, vous obtiendrez cette minimale application WPF.</p>
<p><img src="http://blog.developpez.com/media/hello.JPG" width="213" height="255" alt="" /></p>
<p>Vous voilà prêt à démarrer dans la programmation WPF avec le C++/CLI. Notez quand même que nous n&rsquo;utilisons pas de XAML et que tous les contrôles sont créés à la main, ce qui nous prive d&rsquo;un des avantages du XAML, à savoir la séparation du code technique de la présentation.</p>
<p>Mais cette technique peut s&rsquo;avérer suffisante pour certains besoins et certains types d&rsquo;application. Nous verrons plus tard comment intégrer du XAML dans un projet C++/CLI.</p>
<p>Vous me direz : quel intéret d&rsquo;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&rsquo;utiliser le C++/CLI pour faire des applications WPF est la fantastique capacité du C++/CLI à gérer l&rsquo;intéropérabilité avec des applications natives. Ainsi, si votre application C++ native a besoin d&rsquo;un petit lifting ou de pouvoir accéder au framework.net 3, vous saurez comment faire &#8230;</p>
<p><a href="ftp://ftp-developpez.com/nico-pyright/blog/DemoWpf.rar">Télécharger le programme d&rsquo;exemple.</a></p>
<p>Bonne prog,</p>
<p>Nico</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Récupérer une valeur d&#8217;un contrôle depuis une autre Form / inclusions croisées et déclaration anticipée</title>
		<link>https://blog.developpez.com/nico-pyright/p3396/ccli/recuperer_une_valeur_d_un_controle_depui</link>
		<comments>https://blog.developpez.com/nico-pyright/p3396/ccli/recuperer_une_valeur_d_un_controle_depui#comments</comments>
		<pubDate>Fri, 04 May 2007 14:32:35 +0000</pubDate>
		<dc:creator><![CDATA[nico-pyright(c)]]></dc:creator>
				<category><![CDATA[C++/CLI]]></category>
		<category><![CDATA[Winforms]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Il y a une question qui revient très souvent sur le forum C++/CLI c&#8217;est la récupération d&#8217;une valeur depuis une autre Form. C&#8217;est un mécanisme pas si complexe que ca mais qui nécessite quelques notions de bases de C++. Donc en attendant d&#8217;être intégrée dans la faq C++/CLI, je vais vous indiquer ici comment faire. Imaginons que nous voulions faire une application qui ouvre une fenetre qui possède un textBox et un bouton. Lors du [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Il y a une question qui revient très souvent sur le forum C++/CLI c&rsquo;est la récupération d&rsquo;une valeur depuis une autre Form.<br />
C&rsquo;est un mécanisme pas si complexe que ca mais qui nécessite quelques notions de bases de C++.<br />
Donc en attendant d&rsquo;être intégrée dans la <a href="http://dotnet.developpez.com/faq/cppcli">faq C++/CLI</a>, je vais vous indiquer ici comment faire.</p>
<p>Imaginons que nous voulions faire une application qui ouvre une fenetre qui possède un textBox et un bouton. Lors du click sur le bouton, on affiche une deuxième form qui possède elle aussi un bouton et un textBox (ca aurait pu etre un label). On souhaite lors du clic sur le bouton de la deuxième form afficher la valeur saisie dans le textBox de la première form&#8230;</p>
<p>Voici comment on peut faire :<br />
<span id="more-2"></span></p>
<p>Dans la form1, je dépose le textBox1 et le boutton<br />
J&rsquo;ajoute une nouvelle form, Form2 dans laquelle je mets le textbox et le bouton.</p>
<p>le but est de pouvoir lire la valeur saisie dans la Form1 depuis la Form2 sachant que c&rsquo;est la form1 qui va créer la form2.</p>
<p>Donc, en toute logique, dans la form1, on va avoir à un endroit la création et l&rsquo;affichage de la form2. Comme il faut que la form2 connaisse la form1, on va lui passer l&rsquo;objet form1 (c&rsquo;est à dire this), disons dans le constructeur :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Form2 ^maForm2 = gcnew Form2(this); <br />
maForm2-&gt;Show();</div></div>
<p>Dans la form2, on aura donc fatalement la récupération de la form1 dans le constructeur :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Form2(Form1 ^ laForm1) <br />
{ <br />
&nbsp; Form1 ^currForm1 = laForm1; // sachant qu'en vrai, on aura currForm1 comme membre privé de la classe <br />
}</div></div>
<p>et au moment de récupérer la valeur, on aura un </p>
<p><code class="codecolorer text default"><span class="text">textBox1-&gt;Text = currForm1-&gt;GetValeur();</span></code></p>
<p><strong>GetValeur </strong>sera bien sur une méthode publique de form1 :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public: <br />
&nbsp; String ^GetValeur() <br />
&nbsp; { <br />
&nbsp; &nbsp; return textBox1-&gt;Text; <br />
&nbsp; }</div></div>
<p>Tant est si bien que dans Form1.h, on va devoir faire un </p>
<p><code class="codecolorer text default"><span class="text">#include &quot;Form2.h&quot;</span></code></p>
<p>pour pouvoir instancier la form2</p>
<p>et dans la Form2.h, on va devoir faire un</p>
<p><code class="codecolorer text default"><span class="text">#include &quot;Form1.h&quot;</span></code></p>
<p>pour pouvoir utiliser la form1</p>
<p>Si vous essayez de compiler directement comme ca, il va y avoir une tripotée d&rsquo;erreurs, la plus significative étant qu&rsquo;il ne connait pas Form2, avec une erreur du genre dans Form1.h :<br />
<em>error C2143: erreur de syntaxe : absence de &lsquo;;&rsquo; avant &lsquo;^&rsquo;</em> sur la ligne </p>
<p><code class="codecolorer text default"><span class="text">Form2 ^ currForm2;</span></code></p>
<p>Comme on s&rsquo;en doute, chaque fichier incluant l&rsquo;autre, il y a des inclusions croisées qui empechent la bonne compilation.</p>
<p>Pour que ceci compile, il faut plusieurs choses :<br />
Déjà, déporter l&rsquo;impémentation des méthodes des classes dans un .cpp (plus précisément, toutes celles qui utilisent des méthodes ou des attributs de Form2 pour le fichier form1.h et toutes celles qui utilisent des méthodes ou des attributs de Form1 pour form2.h).</p>
<p>Donc, il faut créer un fichier Form1.cpp (form2.cpp étant généré automatiquement lors de l&rsquo;ajout d&rsquo;une nouvelle form).</p>
<p>Dans mon .h, j&rsquo;ai donc laissé la définition des méthodes :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">private: System::Void Form1_Load(System::Object^ &nbsp;sender, System::EventArgs^ &nbsp;e); <br />
private: System::Void button1_Click(System::Object^ &nbsp;sender, System::EventArgs^ &nbsp;e);</div></div>
<p>et dans le .cpp, j&rsquo;ai mis l&rsquo;implémentation des méthodes :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">include &quot;StdAfx.h&quot; <br />
#include &quot;Form1.h&quot; <br />
&nbsp;<br />
namespace testWinforms { <br />
&nbsp;<br />
System::Void Form1::Form1_Load(System::Object^ &nbsp;sender, System::EventArgs^ &nbsp;e) <br />
{ <br />
&nbsp; currForm2 = gcnew Form2(this); <br />
} <br />
&nbsp;<br />
System::Void Form1::button1_Click(System::Object^ &nbsp;sender, System::EventArgs^ &nbsp;e) <br />
{ <br />
&nbsp; currForm2-&gt;Show(); <br />
} <br />
&nbsp;<br />
}</div></div>
<p><strong>NB </strong>: ne pas oublier le namespace, ni l&rsquo;opérateur de résolution de portée.</p>
<p>Idem dans form2.h</p>
<p><code class="codecolorer text default"><span class="text">private: System::Void button1_Click(System::Object^ &nbsp;sender, System::EventArgs^ &nbsp;e);</span></code></p>
<p>et dans le Form2.cpp</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">System::Void Form2::button1_Click(System::Object^ &nbsp;sender, System::EventArgs^ &nbsp;e) <br />
{ <br />
&nbsp; textBox1-&gt;Text = currForm1-&gt;GetValeur(); <br />
}</div></div>
<p>Voilà pour le premier point.</p>
<p>Il reste encore à faire une chose pour que ca compile, c&rsquo;est faire une déclaration anticipée de Form1 dans le fichier Form2.h.<br />
par exemple, en premier dans le namespace</p>
<p><code class="codecolorer text default"><span class="text">ref class Form1;</span></code></p>
<p>il restera plus qu&rsquo;à faire de meme dans le fichier form1.h : déclarer form2 de cette facon : </p>
<p><code class="codecolorer text default"><span class="text">ref class Form2;</span></code></p>
<p>Compilez mainteant, tout est ok <img src="https://blog.developpez.com/nico-pyright/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p><a href="ftp://ftp-developpez.com/nico-pyright/faq/testWinforms.rar">Télécharger le projet example</a></p>
<p>Bonne prog,</p>
<p>Nico</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
