FAQ C++ BuilderConsultez toutes les FAQ

Nombre d'auteurs : 60, nombre de questions : 670, dernière mise à jour : 21 novembre 2010  Ajouter une question

 

Cette F.A.Q. a été réalisée à partir des questions fréquemment posées sur le forum C++ Builder de developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette F.A.Q. ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette F.A.Q. ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, contactez pottiez

Nous espérons que cette F.A.Q. saura répondre à un maximum de vos questions. Nous vous souhaitons une bonne lecture.

L'équipe C++ Builder de Developpez.

Commentez cette FAQ : Commentez


SommaireInterface bisApplications GUIInterface (11)
précédent sommaire suivant
 

Le menu système est le menu accessible en cliquant sur l'icône en haut à gauche d'une fenêtre. Il est possible de modifier ce menu . Pour lui ajouter un élément, deux phases sont nécessaires : tout d'abord, ajouter a proprement parler un élément au menu système, ensuite lui attribuer un gestionnaire d'évènements.

Voici donc le code qui va créer un nouvel élément de menu :

Code c++ : Sélectionner tout
1
2
3
4
5
// Obtention du Handle du menu système 
HMENU HandleMenuSysteme = GetSystemMenu(Handle, FALSE); 
  
// Insertion de l'élément dans le menu 
AppendMenu(HandleMenuSysteme, MF_STRING, MON_ELEMENT_MENU, "Mon élément personnalisé");
Avec ce code, nous allons ajouter cet élément au menu. Pour cela, nous avons besoin du Handle du menu système (un pointeur sur ce menu). Nous faisons donc appel à la fonction GetSystemMenu. Pour l'ajouter au menu, nous utilisons la fonction AppendMenu, qui ajoute un élément à la fin d'un menu. En premier argument, nous lui passons le Handle du menu système, en second, le type d'élément qui va être rajouté : une chaîne. Notez seulement que le troisième argument est une constante, MON_ELEMENT_MENU, que vous définissez, par exemple dans votre classe fiche :

Code c++ : Sélectionner tout
const int MON_ELEMENT_MENU = 1;
Remarquez que nous aurions pu utiliser également un #define MON_ELEMENT_MENU 1 mais que notre code à l'avantage de s'intégrer totalement dans le C++.

A ce stade, si vous lancez le programme, vous pourrez constater qu'un nouvel élément apparait dans le menu système. Il s'agit maintenant de savoir quand l'utilisateur clique sur cet élément et de gérer ce clic. Pour cela, nous allons créer une fonction-gestionnaire d'évènements qui sera appelée lorsque le message WM_SYSCOMMAND sera déclenché par Windows, c'est-à-dire quand l'utilisateur cliquera sur un élément du menu système. Il faut donc déclarer notre fonction comme gestionnaire de messages WM_SYSCOMMAND, grâce au code suivant qu'il faut placer dans la classe TForm1, dans la section public :

Code c++ : Sélectionner tout
1
2
3
BEGIN_MESSAGE_MAP 
      VCL_MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, WMCommandeMenuSysteme) 
END_MESSAGE_MAP(TForm)
Grâce à ce code, la fonction WMCommandeMenuSysteme sera appelée lorsque l'utilisateur cliquera sur un élément du menu système. Créons donc cette fonction, sans oublier de la déclarer dans le fichier en-tête, le code précédent ne faisant pas office de déclaration :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
void TForm1::WMCommandeMenuSysteme(TMessage & Msg) 
{ 
    if (Msg.WParam == MON_ELEMENT_MENU) 
    { 
      ShowMessage("On a cliqué sur notre élément de menu"); 
      Msg.Result = true; 
    } 
    else 
    { 
        TForm::Dispatch(&Msg); 
    } 
}
Dans cette fonction, deux cas se présentent : soit le message provient de notre élément menu système et nous devons le gérer, soit c'est un autre élément : dans ce cas, nous passons la main à la fonction Dispatch de la classe TForm afin qu'elle le gère. Si nous oublions ce second cas, seul notre élément fonctionnera. La différenciation des deux cas se fait grâce à notre constante MON_ELEMENT_MENU.

Mis à jour le 1er septembre 2004 Geronimo

Pour changer l'icône de votre programme, utilisez Projet/Options.... Allez dans l'onglet Application et en cliquant sur le bouton Charger icône..., vous pourrez charger une nouvelle icône qui doit être au format.ico. Si vous souhaitez dessiner une nouvelle icône, utilisez l'éditeur d'images disponible dans le menu Outils de l'IDE.

Mis à jour le 1er septembre 2004 Geronimo

Le code suivant permet de désactiver le bouton Close d'une fenêtre, en retirant le menu correspondant du menu système.
L'appel à SetWindowPos permet de prendre en charge les modifications apportées à la fiche.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
HMENU hmenu; 
hmenu = GetSystemMenu(this->Handle, false); 
if (hmenu != NULL) 
  
   RemoveMenu(hmenu, SC_CLOSE, NULL); 
} 
SetWindowPos(this->Handle, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_DRAWFRAME);
Toutefois faites attention au fait que cette méthode n'empêche pas la fermeture de la fenêtre avec la combinaison ALT+F4 ou l'option Fermer (clic droit sur l'icône de la fiche dans la barre de tâches). Pour empêcher la fermeture d'une fenêtre, voyez le lien donné ci-dessous.

Mis à jour le 25 avril 2005 Neo41

Le code suivant permet d'empêcher qu'une TForm soit déplacée avec la souris en cliquant sur la barre de titre, en retirant la commande Déplacer du menu système de la fiche. L'appel à SetWindowPos permet de prendre en charge les modifications apportées à ce menu.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
HMENU hmenu; 
hmenu = GetSystemMenu(this->Handle, false); 
if (hmenu != NULL) 
{ 
   RemoveMenu(hmenu, SC_MOVE, NULL); 
} 
SetWindowPos(this->Handle, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_DRAWFRAME);

Mis à jour le 25 avril 2005 Neo41

Cette solution permet d'empêcher la fermeture d'une fiche via les moyens classiques (bouton Close dans la barre de titre, option Fermer dans le menu système de la fenêtre). C'est ainsi à l'utilisateur d'implémenter son propre code et sa propre gestion pour autoriser cette fermeture (par exemple, saisie d'un mot de passe avant de pouvoir fermer).

Lorsqu'une fenêtre est fermée, les évènements suivants sont appelés dans l'ordre:

  • OnCloseQuery
  • OnClose
  • OnDestroy

L'évènement OnDestroy n'est appelé que lorsque la fenêtre est détruite réellement. En fait, appeler la méthode Close sur une fiche ne la détruit pas mais la cache uniquement. Pour détruire la fenêtre il faut agir sur le paramètre Action dans l'évènement OnClose.

Pour intercepter la demande de fermeture d'une fiche il faut implémenter l'évènement OnCloseQuery de la façon suivante:

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose) 
{ 
   // Série de vérifications pour savoir si la fermeture est autorisée 
   // Par exemple afficher une fiche demadant la saisie d'un mot de passe 
   ... 
  
   // Le mot de passe est erroné, alors pas de fermeture 
   if (condition) 
   { 
      CanClose = false; // Empêcher la fermeture 
   } 
}

Mis à jour le 25 avril 2005 JEG Neo41

Pour supprimer les boutons Maximize, Minimize ou Close d'une fenêtre, il faut agir sur la propriété BorderIcons de la forme.

  • Pour supprimer les trois boutons et le menu système, il faut mettre biSystemMenu à false
  • Pour désactiver seulement le bouton Maximize, il faut mettre biMaximize à false
  • Pour désactiver seulement le bouton Minimize, il faut mettre biMinimize à false

Il n'est pas possible de supprimer le bouton Close indépendamment des autres. En revanche, il est possible de le désactiver (lien ci-dessous).

Mis à jour le 25 avril 2005 Neo41

Un splash screen est un écran qui est affiché pendant le chargement d'un logiciel (l'image que vous voyez quand vous démarrez C++Builder par exemple).
Pour en afficher un pendant le démarrage de votre programme, créez une nouvelle fiche (Fichier | Nouvelle fiche), positionnez sa propriété BorderStyle à bsNone et FormStyle à fsStayOnTop. Nommez votre fiche Splash_dlg. Utilisez les options (Projet | Options) pour ne pas créer la fiche automatiquement au démarrage. Ensuite, affichez la fonction WinMain de votre projet (Fichier | Voir le source). Avant les instructions Application->CreateForm(/*...*/), placez le code suivant :

Code c++ : Sélectionner tout
1
2
3
Splash_dlg=new TSplash_dlg(NULL); // Crée la fiche dynamiquement 
Splash_dlg->Show(); // Affiche la fiche 
Splash_dlg->Repaint(); // Pour afficher son contenu
Après les instructions Application->CreateForm(/*...*/), placez le code suivant :

Code c++ : Sélectionner tout
delete Splash_dlg; // Supprime la fiche et libère la mémoire utilisée
Ainsi, la fiche splash screen sera affichée pendant la création des autres fiches.

N.B. N'oubliez évidemment pas d'inclure le .h de votre Splash_Form dans le module principal de votre application.

Mis à jour le 1er septembre 2004 Geronimo

Utilisez le code suivant :

Code c++ : Sélectionner tout
1
2
3
4
5
BorderStyle = bsNone;  
Left = 0;  
Top = 0;  
Width = Screen->Width;  
Height = Screen->Height;
BorderStyle = bsNone permet de faire disparaître la barre de titre. Les deux lignes suivantes sont aisément compréhensibles, n'oubliez pas que nous sommes dans une classe fiche, donc que Left et Top sont les positions de la fiche. Enfin, il suffit de faire coïncider la largeur et la hauteur de la fiche avec celle de l'écran, ce que font nos deux dernières lignes. Bien sûr, ce code se place dans le constructeur de votre fiche, ou dans l'évènement OnCreate.
Évitez tout de même de mettre une application qui n'en a pas besoin en plein écran !

Mis à jour le 1er septembre 2004 Geronimo

Utilisez la fonction ShellExecute de la manière suivante :

Code c++ : Sélectionner tout
ShellExecute (Handle, "open", "mailto:adresse@provider.ex?subject=Titre_du_message&body=Corps du message", 0, 0, SW_SHOWNORMAL);

Mis à jour le 1er septembre 2004 Geronimo

Utilisez la fonction ShellExecute de la manière suivante :

Code c++ : Sélectionner tout
ShellExecute (Handle, "open", "http://www.google.com", 0, 0, SW_SHOWNORMAL);

Mis à jour le 1er septembre 2004 Geronimo

Pour animer l'apparition d'une fenêtre, il faut utiliser la méthode AnimateWindow :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
int typeAnimate = 1; 
TForm* Form2 = new TForm(NULL); 
Form2->Show(); 
Form2->Hide(); 
// Animation de la fenêtre 
AnimateWindow(Form2->Handle, 1000, typeAnimate); 
Form2->Close(); 
delete Form2;
Voici la liste des codes d'animation :
  • 0 => rien ;
  • 1 => de Gauche à droite ;
  • 2 => de droite à gauche ;
  • 3 => de Gauche à droite ;
  • 4 => de haut en bas ;
  • 5 => du coin haut gauche ;
  • 6 => du coin haut droit ;
  • 7 => du coin haut gauche ;
  • 8 => du bas vers le haut ;
  • 9 => du coin bas gauche ;
  • 10 => du coin bas droit ;
  • 11 => du coin bas gauche ;
  • 12 => du haut vers le bas ;
  • 13 => du coin haut gauche ;
  • 14 => du coin haut droit ;
  • 15 => du coin haut gauche.

Mis à jour le 21 novembre 2010 blondelle Nono40

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2020 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.