IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Empêcher les Form secondaires de minimiser lorsque la MainForm est minimisée


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    tlt
    tlt est déconnecté
    Membre confirmé Avatar de tlt
    Homme Profil pro
    Programmeur
    Inscrit en
    Juillet 2004
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Programmeur
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 205
    Par défaut Empêcher les Form secondaires de minimiser lorsque la MainForm est minimisée
    Bonjour

    J'ai un projet avec plusieurs Form en auto-create dont une est la MainForm.
    Comment empêcher les Form secondaires de minimiser lorsque la MainForm est minimisée?
    Ou bien dois-je les créer autrement (dynamiquement avec d'autres parametres) ?
    J'ai déjà essayé de les créer dynamiquement mais c'est toujours la même réaction: quand la MainForm est minimisée, toutes les autres fenêtres sont minimisés.

  2. #2
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 20
    Par défaut
    Hello. Crée-la non-modale

  3. #3
    tlt
    tlt est déconnecté
    Membre confirmé Avatar de tlt
    Homme Profil pro
    Programmeur
    Inscrit en
    Juillet 2004
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Programmeur
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 205
    Par défaut
    Citation Envoyé par Kianii Voir le message
    Hello. Crée-la non-modale
    La MainForm? Elle n'est pas modale

    Une solution pourrait être aussi de faire une "vraie fausse" fenêtre principale : après lancement de l'appli et activation de la MainForm vous faites apparaître une nouvelle Form qui sera utilisée comme fenêtre principale dans la logique de votre appli (sans la déclarer comme telle) et vous cachez la MainForm system par un Hide().
    Je vais essayer ça si c'est possible

  4. #4
    tlt
    tlt est déconnecté
    Membre confirmé Avatar de tlt
    Homme Profil pro
    Programmeur
    Inscrit en
    Juillet 2004
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Programmeur
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 205
    Par défaut
    Après une petite nuit blanche, j'ai trouvé une manière élégante de le faire:

    • lorsque'on veut minimiser la MainForm, on ne doit ni appeler Hide() , ni Application->Minimize(). On doit plûtot mettre la propriété Visible de la MainForm à false et le Windowstate à wsMinimized. Les autres fenêtres resteront visible et ne seront pas minimisées avec la MainForm.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      Visible = false;
      WindowState = wsMinimized;
      J'en ai profité pour utiliser un TTrayIcon car une fois la MainForm invisible, il n'y a plus de moyen de la restaurer puisqu'elle est invisible, à part depuis les autres fenetres biensûr. Je contrôle la restauration depuis le TTrayIcon.


    • Lorsqu'on veut réduire la MainForm (un TMainWindow pour mon cas) , on n'execute pas la procédure normale de réduction de fenêtre , on doit changer le comportement de la fenêtre.
      On intercepte le message système WM_SYSCOMMAND , on teste si le WPARAM est à SC_MINIMIZE. On redéfinit le comportement du bouton réduire grace à un BEGIN_MESSAGE_MAP et en mettant le TMessage.result à 0 pour dire qu'on a réçu a commande mais qu'on ne l'execute pas. C'est à ce moment là aussi qu'on met la propriété Visible à false et le Windowstate à wsMinimized

      En gros,
      Ajouter ce code dans l'en-tête de MainForm
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      ...
      private:	// User declarations
          void __fastcall WMSysCommand(TMessage &Msg);
          BEGIN_MESSAGE_MAP
      		MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, WMSysCommand)
      	END_MESSAGE_MAP(TForm)
      ...
      Déclarer le fonctionnement du code dans la source de MainForm
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      ...
      void __fastcall TMainWindow::WMSysCommand(TMessage &Msg)
      {
          unsigned int const sys_code = Msg.WParam & 0xFFF0;
          switch (sys_code)
          {
              case SC_MINIMIZE:
              {
       
      			Msg.Result = 0;
      			Visible = false;
      			WindowState = wsMinimized;
      			return;
       
                  break;
              }       
          }
          TForm::Dispatch(&Msg);
      }
      ...

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    Mars 2003
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur multiplateformes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 277
    Par défaut
    Merci pour ce retour tlt.
    Je suppose que vous êtes là aussi sous VCL.
    Sous FMX, ayant été déjà confronté au même problème, je préfère le première méthode, plus simple.
    Perso, par principe je n'ai recours à l'interception d’événements qu'en dernier recours.
    Mais c'est une belle astuce à retenir en tout cas.

    Yves

  6. #6
    tlt
    tlt est déconnecté
    Membre confirmé Avatar de tlt
    Homme Profil pro
    Programmeur
    Inscrit en
    Juillet 2004
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Programmeur
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 205
    Par défaut
    Oui, je suis majoritairement sous VCL. Je ne me suis pas encore trop penché sur FMX mais je vais tenter aussi pour voir.

    Une petite curiosité. Pour la "vraie fausse" fenêtre principale, comment gérer vous l'inter-communication entre Form sous FMX?
    D'ailleurs comment gérer vous l'intercommunication entre Form en général, que ce soit sous FMX ou VCL ?

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    Mars 2003
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur multiplateformes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 277
    Par défaut
    Bonjour,

    Une solution pourrait être aussi de faire une "vraie fausse" fenêtre principale : après lancement de l'appli et activation de la MainForm vous faites apparaître une nouvelle Form qui sera utilisée comme fenêtre principale dans la logique de votre appli (sans la déclarer comme telle) et vous cachez la MainForm system par un Hide().

    Yves

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/12/2013, 09h09
  2. Réponses: 0
    Dernier message: 15/09/2009, 18h46
  3. Réponses: 3
    Dernier message: 14/03/2009, 09h44
  4. chercher les contrôles dans un usf lorsque son nom est dans une variable
    Par Jean-Pierre49 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 22/04/2008, 08h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo