Professional Documents
Culture Documents
1 sur 10
http://nico-pyright.developpez.com/tutoriel/vc2005/winforms2/
Forums Tutoriels Magazine FAQs Blogs Chat Newsletter tudes Emploi Club
Contacts
Accueil
ALM
Java
.NET
Programmation
Dv. Web
EDI
Algorithmique
Forums C++
FAQ C++
Programmation
2D-3D-Jeux
Tutoriels C++
SGBD
Assembleur
Livres C++
Office
C++
Solutions d'entreprise
Go
Objective C
Pascal
Bibliothques C++
Applications
Perl
Python
Sources C++
Mobiles
Swift
Systmes
Qt
XML
Autres
Qt
Dmarrer avec les Winforms (partie 2) en C++/CLI avec Visual Studio 2005
Table des matires
1.Introduction
2.Les menus
2.1.Le menu de la fentre
2.2.Le menu contextuel
3.Le contrle NotifyIcon
4.Le contrle ToolTip
4.Le contrle ToolStrip
5.Les boites de dialogues standards
5.1.La boite de slection d'un rpertoire
5.2.Les boites d'ouvertures et de
sauvegardes de fichiers
5.3.Les autres boites de dialogues
6.Les Timers
7.Les ImageList
8.Les tabControl
9.Les splitContainer
10.Les StatusStrip
11.Implmenter un drag and drop
4.Conclusion
Remerciements
Contact
A travers ce tutoriel, vous trouverez la suite de l'introduction la programmation des Winforms grce au framework .net 2.0 travers l'utilisation
du langage C++/CLI avec Visual C++ 2005. Vous y dcouvrirez l'utilisation de certains contrles des Winforms.
Article lu 5188 fois.
L'auteur
Nico-pyright(c)
L'article
Publi le 12 juin 2006
1.Introduction
Vous tes un dveloppeur, vous avez des bases dans le langage C/C++ et vous
souhaitez acqurir des connaissances en programmation Windows dans le domaine
du dveloppement d'interfaces homme machine en .Net grce au framework 2.0 et le
C++/CLI ?
Alors ce tutoriel est pour vous.
Vous trouverez dans ce cours la suite de l'introduction la programmation des
Winforms (Windows Forms). Je vous invite consulter le tutoriel Dmarrer avec les
winforms en prambule.
Je vais vous prsenter dans ce tutoriel certains contrles en rentrant un peu plus
dans les dtails.
A travers ce tutoriel, j'utiliserai le logiciel Visual Studio 2005 de Microsoft et plus
particulirement Visual C++ 2005 ainsi que le framework dotnet 2.0.
2.Les menus
26/10/2015 10:27
2 sur 10
http://nico-pyright.developpez.com/tutoriel/vc2005/winforms2/
Notez que ce qui est applicable pour un menu l'est aussi pou un sous-menu. Pour y
accder, il faut alors rentrer dans l'diteur de proprits de DropDownItems.
Pour tre averti d'un click sur le menu, il faut intercepter l'vnement ItemClicked.
Pour intercepter un click sur un sous-menu, il faut intercepter de la mme faon
l'vnement DropDownItemClicked, ces vnements devant tre intercepts pour
chaque composant MenuStrip et ToolStripMenuItem qui composent le menu. Ceci
implique donc d'avoir une fonction qui intercepte l'vnement par lment
intercepter.
Remarque : Il est possible d'utiliser une seule fonction pour intercepter tous les
vnements dans la mesure o le prototype de la fonction est le mme chaque fois.
Il faut dans ce cas modifier par code chaque ajout de handler pour tous les objets
composants le menus. On s'en rfre l'objet ToolStripItemClickedEventArgs et
la proprit ClickedItem pour identifier sur quel lment on a cliqu.
Un menu dispose des proprits Checked et RadioCheck qui permettent de cocher
un lment de menu.
On peut galer associer facilement un raccourci grce la proprit Shortcut ;
celui-ci pouvant tre affich ou non grce la proprit ShowShortCut.
Slectionnez
menuItem->ShortcutKeys = static_cast<Keys>(Keys::Control | Keys::B);
On peut noter une proprit intressante : LayoutStyle, qui permet par exemple
d'orienter le menu verticalement.
26/10/2015 10:27
3 sur 10
http://nico-pyright.developpez.com/tutoriel/vc2005/winforms2/
Je vais vous montrer dans ce paragraphe comment crer un menu contextuel par
code.
On utilise les classes ContextMenu et MenuItem.
On va faire un menu contextuel contenant deux lments (ouvrir et supprimer), on
l'affichera lors du clic droit sur un listview par exemple.
On dclare trois variables, un ContextMenu, et deux MenuItem :
Slectionnez
ContextMenu ^ monMenu;
MenuItem ^ eltOuvrir;
MenuItem ^ eltSupprimer;
Slectionnez
monMenu = gcnew System::Windows::Forms::ContextMenu();
eltOuvrir = gcnew MenuItem("Ouvrir");
eltOuvrir->Click += gcnew EventHandler(this, &Form1::OnMenuOuvrir);
eltSupprimer = gcnew MenuItem("Supprimer");
eltSupprimer->Click += gcnew EventHandler(this, &Form1::OnMenuSupprimer);
...
private: System::Void OnMenuOuvrir(Object ^sender, EventArgs ^e)
{
MessageBox::Show("Ouverture");
}
private: System::Void OnMenuSupprimer(Object ^sender, EventArgs ^e)
{
MessageBox::Show("Suppression");
}
Slectionnez
if (e->Button == System::Windows::Forms::MouseButtons::Right)
{
monMenu->MenuItems->AddRange(gcnew array<MenuItem ^> {eltOuvrir, eltSupprimer
monMenu->Show(listView1, e->Location);
}
Son utilisation est trs aise. Ajoutez un contrle NotifyIcon sur votre form. Dans les
proprits du contrle, renseignez la proprit Icon qui correspondra l'icne que
nous verrons affiche dans la barre des taches.
Et pour afficher une bulle comme ci-dessus, il suffit d'appeler la mthode
ShowBalloonTip :
Slectionnez
notifyIcon1->ShowBalloonTip(2000, "titre", "text", ToolTipIcon::Info);
Le dernier paramtre correspond l'icne qui sera affiche dans la bulle. On la trouve
dans une numration qui contient entres autres : Error, Info, None et Warning.
On peut ensuite ajouter trs facilement un menu contextuel qui s'affichera
automatiquement lors d'un click droit sur l'icne dans la barre des taches.
Pour ce faire, il suffit de dposer sur la form un contrle ContextMenuStrip. Un
menu apparat sur la form que l'on peut soit remplir directement, soit depuis la
fentre de proprits.
26/10/2015 10:27
http://nico-pyright.developpez.com/tutoriel/vc2005/winforms2/
4 sur 10
Slectionnez
private: System::Void contextMenuStrip1_ItemClicked(System::Object^ sender,
System::Windows::Forms::ToolStripItemClickedEventArgs^ e)
{
if (e->ClickedItem->Text == "Ouvrir")
MessageBox::Show("Ouvrir");
else
MessageBox::Show("Quitter");
}
On renseigne dans cette proprit le texte que l'on souhaite voir affich, et le tour est
jou.
Ici, la photo d'cran ne prend pas le curseur de la souris, il est bien sr positionn sur
le bouton.
Une autre mthode pour implmenter une bulle d'aide est d'intercepter l'vnement
MouseHover du bouton, et d'utiliser la mthode Show d'un objet ToolTip. Cette
mthode prend le texte en paramtre ainsi que le contrle sur lequel va se mettre la
bulle d'aide.
Slectionnez
monToolTip->Show("Le message en question", this->button1);
26/10/2015 10:27
http://nico-pyright.developpez.com/tutoriel/vc2005/winforms2/
5 sur 10
grce celui-ci crer une barre d'outils entirement personnalisable, avec des
boutons (avec image), du texte, des zones de saisies, des combo box, des menus, et
j'en passe ... En termes d'objets, ces contrles sont des ToolStripButton, des
ToolStripLabels, etc ...
Tout ce que vous avez faire, est de dposer le contrle ToolStrip sur la form et
personnaliser votre barre directement sur la form, comme ci-dessous :
Evidement, on peut associer des vnements chacun des contrles ajouts grce
l'IDE, comme l'vnement Click, ou TextChanged pour un contrle ditable.
Encore une fois, l'IDE nous fournit une aide considrable pour crer ce genre de
composant qui s'avreraient plus laborieux crer dynamiquement.
Pour crer une barre d'outils dynamiquement, il faut dj crer les contrles un par
un.
Slectionnez
myToolStripComboBox->Items->AddRange(
gcnew cli::array< System::Object^ >(3) {"Elt 1", "Elt 2", "elt 3"});
myToolStripComboBox->toolStripComboBox1->Name = "Ma Combo";
myToolStripComboBox->toolStripComboBox1->Size = System::Drawing::Size
Puis utiliser la mthode AddRange (ou Add) de l'objet ToolStrip pour ajouter les
contrles.
Slectionnez
monToolStrip->Items->AddRange(
gcnew cli::array< System::Windows::Forms::ToolStripItem^
{monToolStripButton, monToolStripLabel});
>(2)
Slectionnez
folderBrowserDialog1->Description = "Choisissez le rpertoire";
folderBrowserDialog1->ShowNewFolderButton = true;
folderBrowserDialog1->RootFolder = Environment::SpecialFolder::Desktop;
folderBrowserDialog1->ShowDialog();
if (folderBrowserDialog1->SelectedPath != String::Empty)
MessageBox::Show("Rpertoire slectionn : " + folderBrowserDialog1->SelectedPath);
Slectionnez
openFileDialog1->Title = "Slectionnez un fichier";
openFileDialog1->FileName = nullptr;
openFileDialog1->DefaultExt = "txt";
openFileDialog1->Filter = "Fichiers Texte (*.txt)|*.txt|Tous (*.*)|*.*";
26/10/2015 10:27
6 sur 10
http://nico-pyright.developpez.com/tutoriel/vc2005/winforms2/
openFileDialog1->CheckFileExists = true;
if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
Stream ^s = openFileDialog1->OpenFile();
// ...
}
Slectionnez
private: System::Void Form1_Load(System::Object^
{
timer1->Interval = 1000;
timer1->Start();
}
sender, System::EventArgs^
e)
e)
Slectionnez
pictureBox1->Image = imageList1->Images["arbre"];
Comme je le disais, outre cette accessibilit vidente, un autre intrt est son
26/10/2015 10:27
7 sur 10
http://nico-pyright.developpez.com/tutoriel/vc2005/winforms2/
8.Les tabControl
Le contrle tabControl permet de crer ce que l'on appelle communment des
onglets.
Il s'agit d'un contrle trs simple utiliser. Dposez le contrle sur la form et ajoutez
les contrles directement sur chacune des pages des onglets. On ajoute un onglet
grce la proprit tabPages.
On peut contrler le positionnement des onglets grce la proprit alignment.
Ainsi, il est possible de les positionner en haut, droite, gauche ou en bas.
Slectionnez
private: System::Void tabControl1_SelectedIndexChanged(System::Object^
{
sender, System::
26/10/2015 10:27
8 sur 10
http://nico-pyright.developpez.com/tutoriel/vc2005/winforms2/
9.Les splitContainer
On peut utiliser le contrle splitContainer pour crer un splitter, qui permet de
partager une fentre en deux parties redimensionnables.
Sur l'image ci-dessous, on observe 2 splitContainer, le deuxime tant contenu dans
la partie droite du premier.
On constate ici que l'on peut changer l'orientation du splitter. Ceci est faisable grce
la proprit Orientation. J'ai aussi positionn la proprit BorderStyle
Fixed3D. Il existe d'autres styles pour cette proprit (FixedSingle et None). Je
trouve cependant que Fixed3D est le style qui se voit le plus et qui facilite le
redimensionnement.
Il est possible de dfinir l'paisseur de la barre qui sert au redimensionnement grce
la proprit SplitterWidth. Si l'on veut fixer la barre, on utilise alors la proprit
IsSplitterFixed.
Le splitContainer est compos de deux panels. Il s'agit des contrles panels standards
(System::Windows::Forms::Panel) qui se comportent donc de manire standards.
Cela veut dire qu'ils se comportent en tant que container de contrles et donc que
l'on peut ajouter des contrles dedans, comme le button ou le textbox que l'on voit
sur l'image.
On intercepte le redimensionnement d'un splitter grce l'vnement
SplitterMoved. L'argument SplitterEventArgs nous permet d'obtenir des
renseignements sur le redimensionnement. Notamment les attributs X et Y qui nous
permettent de connatre la taille des nouveaux panels.
10.Les StatusStrip
Le contrle StatusStrip reprsente la barre d'tat que l'on peut voir dans certaines
applications. Elle est gnralement ancre dans la partie basse d'une fentre.
De la mme faon que pour le contrle ToolStrip, il est possible de rajouter des
contrles dans la barre. La diffrence ici est que l'on peut ajouter uniquement des
labels, des progressbar, des dropdownbuttons ou des splitbuttons.
On utilise la proprit Dock avec les valeurs Bottom, Left, Right ou Top pour
ancrer la barre respectivement en bas, gauche, droite ou en haut de la fentre.
On utilise la proprit RightToLeft si l'on veut voir commencer s'afficher les
contrles depuis la droite de la barre. On peut galement changer le style de la barre
avec la proprit RenderMode, le style par dfaut tant le style System. Un autre
proprit intressante est la possibilit de choisir l'orientation du texte avec la
proprit TextDirection. Il peut ainsi tre Horizontal, Vertical90 ou Vertical270.
Comme d'autres contrles, il est facile d'associer un menu contextuel grce la
proprit ContextMenuStrip.
26/10/2015 10:27
9 sur 10
http://nico-pyright.developpez.com/tutoriel/vc2005/winforms2/
entre deux contrles PictureBox sur une form, qui va permettre l'change des
contenus des images.
Faites glisser 2 pictureBox et choisissez une image par PictureBox. Autorisez la
rception de donnes "dposes", en mettant true la proprit AllowDrop (ceci ne
pouvant se faire que par code, dans le form_load par exemple).
Slectionnez
pictureBox1->AllowDrop = true;
pictureBox2->AllowDrop = true;
Slectionnez
if (e->Button == System::Windows::Forms::MouseButtons::Left)
pictureBox1->DoDragDrop(pictureBox1->Image, DragDropEffects::All );
Dans le DragEnter de l'image destination (ici pictureBox2), on vrifie que ce qui est
envoy est bien une image, dans ce cas, on effectue une copie :
Slectionnez
if (e->Data->GetDataPresent(DataFormats::Bitmap))
e->Effect = DragDropEffects::Copy;
else
e->Effect = DragDropEffects::None;
Slectionnez
if ( e->Data->GetDataPresent(DataFormats::Bitmap))
{
pictureBox1->Image = pictureBox2->Image;
pictureBox2->Image = safe_cast<Image ^>(e->Data->GetData(DataFormats::Bitmap));
}
Il ne reste plus qu' faire la mme chose pour grer le drag and drop de l'image 2
vers l'image 1.
Remarque : Ceci est une mthode applique aux images, en effet, on contrle la
validit de l'envoi avec le type DataFormats::Bitmap.
Il est bien sur possible de faire transiter autre chose que des images entre des
contrles, par exemple du texte. Il suffirait d'utiliser le type DataFormats::Text.
L o cela se corse, c'est lorsqu'on veut faire transiter des objets personnels. Ceci est
quand mme possible en changeant un peu la mthode de reception.
Imaginons que nous voulions envoyer un objet MonObjet.
Il faut commencer par envoyer l'objet en lui mme.(Dans mon exemple, j'ai stock
mon objet MonObjet dans la proprit Tag de la pictureBox. C'est lui que je vais
envoyer).
Slectionnez
private: System::Void PictureMouseMove(System::Object^ sender, MouseEventArgs^
{
if (e->Button == System::Windows::Forms::MouseButtons::Left)
safe_cast<PictureBox ^>(sender)->DoDragDrop(
safe_cast<MonObjet^>(safe_cast<PictureBox ^>
(sender)->Tag), DragDropEffects::All );
}
e)
Ensuite, on ne peut pas tester le format de l'objet envoy, comme c'tait le cas pour
un Bitmap. Une solution consiste parcourir un tableau des formats disponibles et de
le comparer notre objet pass.
Slectionnez
private: System::Void PictureDragEnter(System::Object^ sender, DragEventArgs^
{
array<String ^> ^formats = e->Data->GetFormats();
if (formats->Length >0)
if (formats[0] == "MonObjet")
e->Effect = DragDropEffects::Copy;
else
e->Effect = DragDropEffects::None;
else
e->Effect = DragDropEffects::None;
}
e)
26/10/2015 10:27
10 sur 10
http://nico-pyright.developpez.com/tutoriel/vc2005/winforms2/
Slectionnez
private: System::Void PictureDragDrop(System::Object^ sender, DragEventArgs^ e)
{
MonObjet ^org = safe_cast<MonObjet^>(safe_cast<PictureBox ^>(sender)->Tag);
MonObjet ^dest = safe_cast<MonObjet^>(e->Data->GetData("MonObjet"));
// ...
}
Pour illustrer cette mthode, j'ai labor un petit jeu trs connu, dont le principe est
de rorganiser une image dont les morceaux se sont mlangs en faisant glisser une
case vide. (Ce jeu s'appelle dans mon tlphone "image magique", mais peut-tre
a-t-il un vrai nom ...). Vous pouvez tlcharger les sources ainsi qu'une version
compile : Tlcharger ici (55 Ko).
4.Conclusion
Voil, travers ce tutoriel vous avez pu dcouvrir un peu plus prcisment certains
contrles des winforms.
Bien sur, je n'ai pas rpertori toutes les proprits de chaque contrle, mais j'espre
vous avoir permis de dmarrer un peu plus sereinement et j'espre vous avoir aussi
donn envie d'aller plus loin dans la dcouverte du monde merveilleux des Winforms.
Remerciements
Je remercie toute l'quipe C++ et Dotnet pour leur relecture attentive du document.
Contact
Si vous constatez une erreur dans le tutorial, dans le source, dans la programmation
ou pour toutes informations, n'hsitez pas me contacter par mail, ou par le forum.
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre
convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge
par les droits d'auteur. Copyright 2006 Nico-pyright(c). Aucune reproduction, mme
partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'
trois ans de prison et jusqu' 300 000 de dommages et intrts.
Participez
Hbergement
Informations lgales
26/10/2015 10:27