Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Fenêtres filles topmost mais pas dessus du bureau ?!

4 réponses
Avatar
Brice
Bonjour à tous,

j'ai un petit souci qui me bouffe la vie.
Je travaille depuis des mois sur un logiciel qui arrivge à terme, mais
je me rend compte d'un hic qui pourri la vie de l'utilisateur.

Mon application est multi-documents mais avec de nombreuses fenêtres
filles, des boites d'édition et des boites d'outils.

Je souhaite que ces fenêtres filles restent au dessus de mon
application, mais restent en arrière quand l'application perd le
focus. Un peu à la facon de photoshop et de ses nombreuses boites
d'outils. Elles restent au dessus, mais si vous ouvrez ou travaillez
dans un autre programme, elles suivent photoshop et restent en arrière
plan du logiciel qui a le focus. Est-ce clair ?


Pour que toutes mes fenêtres filles restent au dessus de mon
programme, j'ai appliqué l'api 'setwindowspos' en topmost sur chacune
d'entres elles.
Le problème, c'est qu'elles restent aussi au dessus de toutes les
autres applications du bureau... C'est là mon problème et c'est très
génant.

J'ai essayé d'uniquement les mettre filles de lla fenêtre principale
avec une api "set parent" (je n'ai pas mon code sous les yeux et je ne
sais par coeur le nom et définition des apis, mais vous devez voir de
quoi je parle).
Cet api utilisé sans "setwindowspos topmost" est pas mal, les fenêtres
filles suivent en effet la fenêtre mère, mais l'inconvénient c'est
qu'elle ne restent pas devant la fenêtre mère.
Et si mon programme est maximisé, impossible de les atteindre...

Voilà mon dilemme.
J'ai essayé de mettre en oeuvre des solutions incroyables pour arriver
à mes fins, mais elles sont beaucoup trop lourdes, et ne sont pas
vraiment satisfaisantes.

Je suis certain qu'il doit exister une solution simple qui m'échappe.
Si vous pouviez m'indiquer le moyen, ou me donner un début de piste,
je serai le plus heureux.

Merci d'avance,
Brice

4 réponses

Avatar
LE CARRE Yannick
Salut Brice,

ton formulaire principal est-il modal ?

Dans l'affirmative, les formulaires fils que tu affiches ne peuvent masquer
le formulaire principal !

Yannick
Brice a écrit dans le message :

Bonjour à tous,

j'ai un petit souci qui me bouffe la vie.
Je travaille depuis des mois sur un logiciel qui arrivge à terme, mais
je me rend compte d'un hic qui pourri la vie de l'utilisateur.

Mon application est multi-documents mais avec de nombreuses fenêtres
filles, des boites d'édition et des boites d'outils.

Je souhaite que ces fenêtres filles restent au dessus de mon
application, mais restent en arrière quand l'application perd le
focus. Un peu à la facon de photoshop et de ses nombreuses boites
d'outils. Elles restent au dessus, mais si vous ouvrez ou travaillez
dans un autre programme, elles suivent photoshop et restent en arrière
plan du logiciel qui a le focus. Est-ce clair ?


Pour que toutes mes fenêtres filles restent au dessus de mon
programme, j'ai appliqué l'api 'setwindowspos' en topmost sur chacune
d'entres elles.
Le problème, c'est qu'elles restent aussi au dessus de toutes les
autres applications du bureau... C'est là mon problème et c'est très
génant.

J'ai essayé d'uniquement les mettre filles de lla fenêtre principale
avec une api "set parent" (je n'ai pas mon code sous les yeux et je ne
sais par coeur le nom et définition des apis, mais vous devez voir de
quoi je parle).
Cet api utilisé sans "setwindowspos topmost" est pas mal, les fenêtres
filles suivent en effet la fenêtre mère, mais l'inconvénient c'est
qu'elle ne restent pas devant la fenêtre mère.
Et si mon programme est maximisé, impossible de les atteindre...

Voilà mon dilemme.
J'ai essayé de mettre en oeuvre des solutions incroyables pour arriver
à mes fins, mais elles sont beaucoup trop lourdes, et ne sont pas
vraiment satisfaisantes.

Je suis certain qu'il doit exister une solution simple qui m'échappe.
Si vous pouviez m'indiquer le moyen, ou me donner un début de piste,
je serai le plus heureux.

Merci d'avance,
Brice




Avatar
Brice
Salut Yannick,
merci de ta réponse.

Je ne cerne pas trop ta question peut-être,
ma form principal est une feuille MDI appellé en fait par un submain.
En effet mon prog démarre sur une submain, qui déclare ma feuille mdi
"fmain" et la lance.

Les documents sont internes à cette feuilles mdi.

Mes boites d'outils sont externes, sur le bureu en fait.


Pour répondre à ta question, ma feuille mdi n'est pas modale, puisque
c'est la feuille principale, elle ne peut être modale à rien...

Mes boites d'édition et d'outils ne sont (en général) pas non plus
modales à ma feuille mdi, puisque je veux pouvoir avoir accès à ces
boites d'outils et en même temps à ma feuille mdi et les documents
qu'elle contient.

Voilà pourquoi je suis obligé de les mettre topmost si je veux
qu'elles restent au dessus de ma feuille mdi. Le hic c'est qu'elles
cachent aussi toutes les autres applications, même si ma feuilles mdi
est minimisée.
Ca engendre aussi d'autre soucis, par exemple, je suis obligé dans la
plupart des cas, d'afficher des boites de message modales (msgox
modal) sinon elle restent coincées sous mes boites d'outils si ces
dernières ont le malheurs d'être au milieu de l'ecran.
Idem pour les boites de sélection de fichier, elle restent derrière
mes boites d'outils, et deviennent parfois innaccessibles...

Comment garder mes boites d'outils devant ma feuille mdi, sans les
mettre topmost (ni modale) ? ce serait ma solution idéale...
Photoshop et la plupart des logiciel réussissent, comment faire ?

Brice

Salut Brice,

ton formulaire principal est-il modal ?

Dans l'affirmative, les formulaires fils que tu affiches ne peuvent masquer
le formulaire principal !

Yannick


Avatar
Christophe QUEVAL
Bonjour,

Il est préférable d'utiliser l'API SetParent plutôt que SetWindowsPos.
Voici un petit exemple de code pour comprendre :

Créez une appli avec une MDIForm et 2 Forms dont l'une sera en MDIChild False (Form1) et l'autre MDIChild = True (Form2).
Déclarez l'api suivante : Private Declare Function SetParent Lib "user32"
(ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long

Et insérez ce code :
Private Sub MDIForm_Load()
Form1.Show
Call SetParent(Form1.hWnd, MDIForm1.hWnd)
Form2.Show
End Sub

Résultat : Form1 reste toujours en avant plan dans l'appli seulement.

Bon courage... :-)

Christophe


"Brice" a écrit dans le message de
news:
Bonjour à tous,

j'ai un petit souci qui me bouffe la vie.
Je travaille depuis des mois sur un logiciel qui arrivge à terme, mais
je me rend compte d'un hic qui pourri la vie de l'utilisateur.

Mon application est multi-documents mais avec de nombreuses fenêtres
filles, des boites d'édition et des boites d'outils.

Je souhaite que ces fenêtres filles restent au dessus de mon
application, mais restent en arrière quand l'application perd le
focus. Un peu à la facon de photoshop et de ses nombreuses boites
d'outils. Elles restent au dessus, mais si vous ouvrez ou travaillez
dans un autre programme, elles suivent photoshop et restent en arrière
plan du logiciel qui a le focus. Est-ce clair ?


Pour que toutes mes fenêtres filles restent au dessus de mon
programme, j'ai appliqué l'api 'setwindowspos' en topmost sur chacune
d'entres elles.
Le problème, c'est qu'elles restent aussi au dessus de toutes les
autres applications du bureau... C'est là mon problème et c'est très
génant.

J'ai essayé d'uniquement les mettre filles de lla fenêtre principale
avec une api "set parent" (je n'ai pas mon code sous les yeux et je ne
sais par coeur le nom et définition des apis, mais vous devez voir de
quoi je parle).
Cet api utilisé sans "setwindowspos topmost" est pas mal, les fenêtres
filles suivent en effet la fenêtre mère, mais l'inconvénient c'est
qu'elle ne restent pas devant la fenêtre mère.
Et si mon programme est maximisé, impossible de les atteindre...

Voilà mon dilemme.
J'ai essayé de mettre en oeuvre des solutions incroyables pour arriver
à mes fins, mais elles sont beaucoup trop lourdes, et ne sont pas
vraiment satisfaisantes.

Je suis certain qu'il doit exister une solution simple qui m'échappe.
Si vous pouviez m'indiquer le moyen, ou me donner un début de piste,
je serai le plus heureux.

Merci d'avance,
Brice




Avatar
dolham
Il me semble que SetParent fait que la form fille "suivra" la feuille
MDI, si l'appli n'est plus active, mais qu'elle ne reste pas en avant
plan de la MDI.

Pour ne pas dire de bétise, je vais rééssayé cette solution (une fois
chez moi, je suis dans un cyber-café), et je donnerai des nouvelles :)

Merci,
Brice