vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 2010
-
1 mai 2006 à 16:09
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 2010
-
4 mai 2006 à 12:45
C'est un problème assez compliqué a expliquer...
J'ai remarqué que les menus (obtenus par exemple avec TrackPopupMenu) sont des fenêtre popup (avec le style WS_POPUP).
Ce que je ne comprends pas, c'est que malgré tout la fenêtre parente garde le focus alors qu'une fenêtre popup a été créée (la Title Bar reste bleue);
J'essaie de faire la même chose (mais sans TrackPopupMenu car ce n'est pas un menu que je fais), mais dès que je crée une fenêtre popup, la fenêtre principale perd le focus (sa barre de titre devient grise).
Je cherche donc le moyen de faire comme TrackPopupMenu
Si quelqu'un a déja fait ca, merci de m'aider
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 1 mai 2006 à 18:56
Ben dès que je clique a nouveau sur la fenêtre popup, elle perd à nouveau le focus...
Ce que je veux faire, c'est comme dans Office, le menu qui apparait dans la commande Undo/Redo de la barre d'outils
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 1 mai 2006 à 19:01
Oui j'ai essayé ca, et pas mal d'autres trucs.
Le seul truc que j'ai c'est de donner le focus a la fenêtre parente et d'enpêcher la popup de devenir active (je retourne MA_NOACTIVATE quand je recois WM_ACTIVATE). Par contre ca pose d'autres problèmes que j'ai du mal à régler
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 1 mai 2006 à 19:10
Le code interne de TrackPopupMenu est assez compliqué (je viens d'aller voir).
La fenêtre mère est illico sous classée, pointeur sur le menu lui est refilé, remise de la bonne proc quand suppression du menu.
C'est un énorme souk alors pas le temps d'en faire le détail.
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 1 mai 2006 à 19:25
Salut,
vecchio56 >> Tu ne veux pas utiliser une petite boite de dialogue créée avec CreateDialog()? La fenêtre mère peut garder le focus et la boite reste toujours visible.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 1 mai 2006 à 19:39
CreateDialog semble une bonne piste.
vecchio > semble bien mais vraiment pas le temps de lire tous les fichiers sources. Note tout ce que tu voudrais consulter et on fera cela une autre fois.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 1 mai 2006 à 22:52
J'ai pas l'habitude d'utiliser CreateDialog(), mais quelle différence avec un CreateWindow exactement?
Le problème, c'est que:
-la fenêtre mère doit garder le focus, et même capturer la souris
-l'autre fenêtre contient éventuellement des controles (une scrollbar) que je dois pouvoir utiliser
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 2 mai 2006 à 04:42
La je pense avoir compris ce que tu veux faire exactement. Une boite de dialogue créée avec CreateDialog() ne conviendra pas quand celle-ci doit contenir des controles pouvant avoir besoin du focus comme un Edit ou une ScrollBar. Car cela fait perdre le focus à la fenêtre principale.
La solution est de créer une fenêtre fille. Celle-ci contiendra l'Edit ou la ScrollBar. La fenêtre principale ne perdra pas le focus suite au clic sur l'un des deux controles. J'ai déjà utilisé cette méthode sans problème.
Voici un petit exemple complet:
Dans cet exemple, la fenêtre principale et la fenêtre fille sont de la même classe. Elles partagent donc la même procédure WNDPROC. Cela permet de traiter les messages (générés par l'utilisation des controles de la fenêtre fille) dans une seule procédure.
La variable "création" permet de ne créer la fenêtre fille et ses controles que pendant la création de la fenêtre principale.
Dans ton programme, tu pourras cacher ou montrer la fenêtre fille quand tu veux.
Voilà, j'espère que cette solution te conviendra.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 2 mai 2006 à 11:39
Merci de ton aide
J'avais bien pensé à la fenêtre fille, mais je ne comprends pas pourquoi, je n'arrive pas à l'amener au permier plan (j'ai déja plein de fenêtres filles partout).
Pourtant j'ai mis celle ci en WS_EX_TOPMOST, et j'ai fait un SetWindowPos avec HWND_TOP, mais elle disparait tout de suite derrière les autres
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 2 mai 2006 à 13:56
Voici un exemple de code qui illustre le problème.
On appuie sur une touche pour créer la nouvelle fenêtre
-Si la fenêtre est popup, la fenêtre mère perd le focus, ce que je ne veux pas
-Si la fenêtre est fille, ca ne marche pas bien du tout
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 2 mai 2006 à 15:05
Cette fois j'y suis presque. Le seul problème est que l'edit ne recoit pas les événements du clavier (car il n'a pas le focus, et on ne peut pas le lui donner)
L'astuce était de faire SetParent(hPopup, HWND_DESKTOP);
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 3 mai 2006 à 16:56
Salut,
Dans le cas de plusieurs fenêtres filles, c'est vrai que le problème d'activation des fenêtres se pose. Il parait que SetWindowsPos() et SetForegroundWindow() ne fonctionnent que pour le bureau comme fenêtre mère. Il faudra penser à des solutions plus compliquées permettant le redessin et l'activation des fenêtres filles.
Ton astuce est intéressante mais semble insuffisante.
J'aurai certainement un jour besoin d'un truc pareil. Je m'y pencherai quand j'aurai du temps si personne ne trouve de solution avant.
Bonne chance.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 3 mai 2006 à 16:59
J'ai totalement réussi a faire ce que je voulais au début, mais c'est vrai qu'a certains endroits ils faut bidouiller, et j'y suis arrivé car c'était finalement assez simple