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

Problème de TOPMOST (correction)

2 réponses
Avatar
Brice
Ce post fait suite à l'aide que j'ai demandé il y a une petite semaine.
N'ayant pas mon code sous les yeux, je me suis un peu embrouillé...

Mais mon problème reste le même :

Mon logiciel, un editeur MDI affiche de nombreuses fenêtres filles, des
boites d'outils ou d'aide à l'édition (mdichild=false).

Au début, je mettais systématiquement toutes ces boites en TOPMOST afin
qu'elles restent au dessus de mom formulaire principal (ma feuille
MDI).

L'inconvénient majeur dans ce cas, c'est que ces boites restent aussi
au dessus de TOUTES les autres application du bureau... Et en fait le
problème va bien plus loin, puisque que par exemple je suis obligé
d'ouvrir les msgbox en VbSystemModal pour que ces boites de texte
s'affichent au dessus des boites d'outils ouvertes (qui, si ces
dernières se trouvent au milieu de l'écran, empêchent l'accès aux
msgbox) ; pire : les boites de sélection de fichiers s'affichent elles
aussi sous les boites d'outils topmost, et se retrouvent donc en partie
cachées !

Le TOPMOST absolu n'est donc pas une solution idéale.

Mais si mes boites d'outils ne sont plus TOPMOST, elles passent
derrière ma form MDI et c'est elles qui deviennent innaccessibles si ma
mdi est maximisée... Dilemme !

Pour l'instant, j'ai laissé le choix à l'utilisateur, en mettant dans
les options la possibilité de garder les fenêtres filles au dessus ou
non. Ce qui est sûr, c'est que dans une utilisation en jonglant avec
d'autres applications ou fenêtres du bureau, ces boites d'outils
toujours au dessus deviennent vraiment indésirables !

J'avais cru trouver une solution avec l'api SetWindowWord, employé avec
l'argument SWW_HPARENT :

Private Declare Function SetWindowWord Lib "user32" (ByVal hWnd As
Long, ByVal nIndex As Long, ByVal wNewWord As Long) As Long Private
Const SWW_HPARENT = -8

puis

SetWindowWord(Boite_Outils.hWnd, SWW_HPARENT, form_MDI.hWnd)

Mais je me suis rendu compte que cet API ne sert à rien dans mon cas.
J'en vient même à me demander à quoi il sert ? (pour info je suis sous
VB6 initiation, je n'ai donc pas toute l'aide sur les apis dont
disposent apparement les autres versions)

Quant à la solution SetParent, les boites d'outils s'affichent à
l'intérieur de la MDI. Ca pourrait être une solution, mais ce n'est pas
ce que je veux, de plus j'ai de nombreux effets secondaires ; ca
parasite beaucoup trop tout le code que j'ai deja en place et sur
lequel je ne peux pas revenir.

Voilà...

Quelle est donc la solution pour que mes boites d'outils restent au
dessus de la form MDI, mais pas de tout le bureau quand une autre
application est active, ou quand mon app est minimizée (un peu à la
facon de photoshop) ?

Merci d'avance pour votre aide ou début de piste !
Brice

2 réponses

Avatar
Bismark Prods
A mon avis tu devrais télécharger à l'adresse www.allapi.net le programme
API-Guide qui recense toutes les documentations d'API (il y en a bcp).
Depuis là tu vas voir GetWindow et SetWindowPos et je pense qu'il te serait
pas trop dur de jouer avec le Z Order pour placer tes fenetres d'options sur
un Z Order juste supérieur a ta MDI ainsi elles se retrouveraient entre ta
MDI et les autres fenetres topmost ou de Z Order superieur !

"Brice" a écrit dans le message de
news:
Ce post fait suite à l'aide que j'ai demandé il y a une petite semaine.
N'ayant pas mon code sous les yeux, je me suis un peu embrouillé...

Mais mon problème reste le même :

Mon logiciel, un editeur MDI affiche de nombreuses fenêtres filles, des
boites d'outils ou d'aide à l'édition (mdichildúlse).

Au début, je mettais systématiquement toutes ces boites en TOPMOST afin
qu'elles restent au dessus de mom formulaire principal (ma feuille
MDI).

L'inconvénient majeur dans ce cas, c'est que ces boites restent aussi
au dessus de TOUTES les autres application du bureau... Et en fait le
problème va bien plus loin, puisque que par exemple je suis obligé
d'ouvrir les msgbox en VbSystemModal pour que ces boites de texte
s'affichent au dessus des boites d'outils ouvertes (qui, si ces
dernières se trouvent au milieu de l'écran, empêchent l'accès aux
msgbox) ; pire : les boites de sélection de fichiers s'affichent elles
aussi sous les boites d'outils topmost, et se retrouvent donc en partie
cachées !

Le TOPMOST absolu n'est donc pas une solution idéale.

Mais si mes boites d'outils ne sont plus TOPMOST, elles passent
derrière ma form MDI et c'est elles qui deviennent innaccessibles si ma
mdi est maximisée... Dilemme !

Pour l'instant, j'ai laissé le choix à l'utilisateur, en mettant dans
les options la possibilité de garder les fenêtres filles au dessus ou
non. Ce qui est sûr, c'est que dans une utilisation en jonglant avec
d'autres applications ou fenêtres du bureau, ces boites d'outils
toujours au dessus deviennent vraiment indésirables !

J'avais cru trouver une solution avec l'api SetWindowWord, employé avec
l'argument SWW_HPARENT :

Private Declare Function SetWindowWord Lib "user32" (ByVal hWnd As
Long, ByVal nIndex As Long, ByVal wNewWord As Long) As Long Private
Const SWW_HPARENT = -8

puis

SetWindowWord(Boite_Outils.hWnd, SWW_HPARENT, form_MDI.hWnd)

Mais je me suis rendu compte que cet API ne sert à rien dans mon cas.
J'en vient même à me demander à quoi il sert ? (pour info je suis sous
VB6 initiation, je n'ai donc pas toute l'aide sur les apis dont
disposent apparement les autres versions)

Quant à la solution SetParent, les boites d'outils s'affichent à
l'intérieur de la MDI. Ca pourrait être une solution, mais ce n'est pas
ce que je veux, de plus j'ai de nombreux effets secondaires ; ca
parasite beaucoup trop tout le code que j'ai deja en place et sur
lequel je ne peux pas revenir.

Voilà...

Quelle est donc la solution pour que mes boites d'outils restent au
dessus de la form MDI, mais pas de tout le bureau quand une autre
application est active, ou quand mon app est minimizée (un peu à la
facon de photoshop) ?

Merci d'avance pour votre aide ou début de piste !
Brice



Avatar
Brice
Merci pour l'addresse, j'ai pu trouver pas mal de doc sur les APIs en
effet, mais je ne sais pas si je vais y trouver une solution pour
problème.