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 :

Affichage d'une seule fenetre en premier plan sans les autres fenetres de mon application


Sujet :

C++Builder

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut Affichage d'une seule fenetre en premier plan sans les autres fenetres de mon application
    Bonjour,

    J'ai une application avec une Form principale Form1. Depuis cette Form, j'ouvre d'autres Forms en dynamique (form2, form3, form4, etc...). En fait je developpe un post-it virtuel.
    Sur ces forms, il y a une alarme. Quand cette alarme se declenche cela affiche la form correspondante a l'ecran par dessus toutes les autres fenetres de mon bureau. Jusque la pas de probleme, j'utilise SetWindowPos() et SetForegroundWindow().
    Mais quand la fenetre s'affiche au premier plan, ca affiche egalement toutes les fenetres de mon application. Ou quand je clique sur une des fenetres, cela affiche egalement toutes les fenetres de mon application.

    Donc ma question est : Comment faire pour avoir seulement ma form selectionnee qui s'affiche en premier plan (soit en l'activant ou soit par l'alarme) sans que les autres fenetres de mon application s'affichent egalement au premier par rapport aux autres fenetres du bureau ?

    Merci
    Fred

  2. #2
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Je ne vois qu'une seule solution :

    1- Mettre << Visible >> de toutes les fiches de ton application à << false >>,

    2- Tu ne fais activer que celle qui t'intéresse.

    Je pense à deux fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    HideAll() 
    {
       Form1 -> Visible = false ;
       ...
       ...
    }
     
    ShowOne(TForm *pForm) 
    {
       pForm -> Visible = true ;
    }
    Sinon, regarde dans les propriété de TApplication si il existe une méthode qui permet de te retourner la liste des forms utilisées dans ton projet, là c'est encore plus simple
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    J'y est pense, mais je ne veux pas cacher mes autres fenetres. Car se sont des post-it sur le bureau.

  4. #4
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Est-ce que tu utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    taForm -> ShowModal() ;
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Non, toutes mes forms sont ouvertes avec form->Show();
    Ce doit etre possible a faire, car j'ai deja vu une application faire ceci.
    J'ai meme essaye de mettre NULL en parametre au lieu de Application quand je cree ma form, mais sans succes.

  6. #6
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Je pense que c'est due à barre des taches. Si tu clique sur une fenêtre, c'est l'ensemble de ton application qui est activée.

    Je me rappelle d'un code dans la FAQ ou sur la page source, qui permet de faire afficher pour chaque fenêtre de ton application, son icône respective dans la barre des tâches.

    Regarde l'exemple, peut être ça pourra marcher !
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Desole, mais je n'ai rien trouve dans la FAQ ou dans les sources.
    C'est bien dans la FAQ / Sources pour builder ?
    Est-ce que tu te rappelles du nom du code ?

  8. #8
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Genre, comment affiche les fenêtre du projet sur la barre des taches ?
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Une simple idée ... sans avoir creusé d'avantage !

    Soient deux exécutables : un principal qui génère autant de secondaires que nécessaire.
    Sans doute avec ShellExecute.

    A plus !

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Salut,

    henderson, cela peut etre une bonne idee. Je vais approfondir....

  11. #11
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Dans ce cas, utilise plutôt des fiches déclarées dans un fichier DLL, et tu fais l'appelle directement de ton fichier principale

    Une idée à développer >>
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  12. #12
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Salut,

    Exact kmaniche, je vais approfondir cette idee.
    Merci a tous les deux pour vos idees.

    Mais cela doit etre faisable dans la meme application. Le logiciel de 3M, le fait. Je ne pense pas qu'ils utilisent une dll ou appli externe.
    (http://www.3m.com/us/office/postit/d...tal_notes.html)
    Comment ont-ils fait ca ?

  13. #13
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Ils définissent pour chaque fenêtre de l'application un bouton dans la barre des tâches de Windows. J'ai pas eux pour faire une recherche avec l'api de Windows, surement la solution est quelque part par là
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  14. #14
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Salut,

    Bon, j'ai enfin reussi a faire ce que je voulais. J'ai refait mon projet avec une dll pour afficher mes fenetres, et du coup elles sont bien independantes. J'ai rajoute dans le OnCreate de la fiche ceci pour enlever les boutons de la barre des taches :
    SetWindowLong(Application->Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);

    Mais j'ai encre un petit truc. Du coup ma form n'est plus transparente,
    malgre TransparentColor a true de la form. Je pense que c'est a cause de WS_EX_TOOLWINDOW.
    Une idee pour avoir la couleur de transparence sur la form ?

  15. #15
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Le fait que tu redéfinisse par toi même les propriétés de la fiche que tu crée directement de la DLL moyennant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SetWindowLong(Application->Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
    Cependant, il est logique que tu redéfinisse la propriété de transparence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define LWA_ALPHA 2
    typedef BOOL (WINAPI* SLWA)(HWND, COLORREF, BYTE, DWORD);


    Le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SLWA SetLayeredWindowAttributes = 0;
    HMODULE hDLL = GetModuleHandle("USER32.DLL");
    SetLayeredWindowAttributes = (SLWA)GetProcAddress(hDLL, "SetLayeredWindowAttributes");
    if(SetLayeredWindowAttributes == 0) ;
     
    DWORD dwStyle = GetWindowLong(Handle, GWL_EXSTYLE);
     
    dwStyle = dwStyle | WS_EX_LAYERED;
     
    SetWindowLong(Handle, GWL_EXSTYLE, dwStyle);
     
     SetLayeredWindowAttributes(Handle, 0, 128 /*degré de transparence */, LWA_ALPHA);
    Handle est celui de la fenêtre que u viens de créer.
    Tu peux le replacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    laForm -> Handle ;
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  16. #16
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Salut,

    Merci pour ton code, c'est parfait.
    Encore une derniere question si tu peux m'aider.
    Avant j'utilisais la fonction Application->OnDeactivate pour savoir quand ma fenetre n'avait plus le focus. Maintenant que j'utilise mes forms dans une dll, je n'ai plus access a cette fonction et donc je n'arrive plus a detecter la perte du focus quand je passe de ma form a une autre fenetre par exemple Word ou Excel.
    Une idee ?

    Merci

  17. #17
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Quand tu crée une fiche à partir du fichier dll, tu sauvegarde son Handle dans une variable. Le mieux serait de la mettre dans un vecteur, où le nombre d'éléments du vecteur est celui du nombre de fenêtres crées.

    Maintenant, tu ajoutes par exemple un TTimer qui vérifie chaque composante du vecteur, donc le Handle de chaque fenêtre si elle a le focus .

    Je ne sais pas si j'étais assez claire
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  18. #18
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Salut,

    J'ai enfin resolu mon probleme.
    Merci beaucoup du coup de main.

  19. #19
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Qu'as-tu fais pour résoudre ton dernier problème ? Cela pourra peut être aider d'autres développeurs dans le future.
    Il faut veiller à laisser une trace
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  20. #20
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Salut,

    Pour savoir si je perd le focus en changeant d'application, j'ai mis ce code dans le constructeur de l'application principale (alors qu'avant ce code etait dans les forms qui etaient appelles par la dll) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application->OnDeactivate = AppDeactivate;
    et dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void __fastcall TFrm_Main::AppDeactivate(TObject *Sender)
    {
       //ici je fais mon traitement
    }

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/10/2012, 16h19
  2. Réponses: 2
    Dernier message: 07/05/2010, 11h42
  3. Réponses: 8
    Dernier message: 19/06/2008, 21h54
  4. Mettre une fenetre au premier plan
    Par madislak dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 14/02/2006, 00h32
  5. [C#][.Net] Affichage d'une appli toujours au premier plan
    Par alncool dans le forum Windows Forms
    Réponses: 9
    Dernier message: 13/07/2005, 12h30

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