Fenêtre comme formulaire

Signaler
Messages postés
107
Date d'inscription
lundi 7 février 2011
Statut
Membre
Dernière intervention
17 février 2018
-
Messages postés
15102
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
27 juillet 2021
-
Bonjour,
Je cherche à faire en C/C++ une fenêtre en 3 parties (comme un formulaire avec une entête, le corps de la fenêtre et un pied) y a-t-il une solution standard pour faire ceci ?
- 1.- J'ai pensé à faire une fenêtre mère avec à l'intérieur 3 fenêtres filles sans titre qui se juxtaposent
- 2.- J'ai pensé à une seule fenêtre avec comme entête et comme pied de fenêtre un contrôle statique de hauteur suffisante et ayant comme largeur la largeur totale de la fenêtre (à tenir à jour en fonction des redimensionnements)
- 3.- J'ai pensé à utiliser comme entête une tool barre et comme pied une status barre.
Dans la solution 2, je me demande si c'est gérable dans la mesure où dans l'entête j'aurai aussi des boutons, ce qui revient à superposer des contrôles
Dans la solution 3, l'avantage c'est que le redimensionnement en largeur est facile, par contre, il ne me semble pas que je sois maître de la hauteur, ni de la forme des boutons que je veux y mettre (prévu pour des onglets) et je ne vois pas comment gérer la couleur du fond, ni du texte de la toolbar ou de la status barre.
A votre avis quelle est la moins mauvaise solution, où en existe-t-il une 4ème plus standard pour ce genre de problème ?

5 réponses

Messages postés
15102
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
27 juillet 2021
97
Hello,
Réponse 2.
1. C'est à oublier: inutile d'aller s'embêter avec des sous-fenêtres
3. Effectivement, tu n'as pas la main sur la hauteur de la toolbar (qui est sensé afficher des "outils") ni de la statusbar (qui est là pour afficher l'état courant de l'appli)

En fait, ce n'est ni plus ni moins qu'une fenêtre classique avec des composants dessus


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
107
Date d'inscription
lundi 7 février 2011
Statut
Membre
Dernière intervention
17 février 2018

Merci pour la réponse, effectivement la solution 2 paraît plus simple sauf que je n'ai pas testé si je pouvais superposer des boutons sur le contrôle statique qui me servirait de header et si c'est gérable de modifier la taille de ce contrôle statique servant de header ainsi que le cadrage du texte chaque fois que l'utilisateur redimensionne la fenêtre.
Entre-temps j'ai continué à chercher et j'ai trouvé une 4ème solution avec WC_HEADER (le header control), j'ai commencé à tester et j'ai vu qu'avec ça je pouvais régler à loisir la hauteur du header. Maintenant, je n'ai pas encore trouvé comment forcer la couleur de ce contrôle, du texte et du fond que je suis sensé y insérer et comment y introduire des boutons. Je ne sais pas non plus encore s'il existe un équivalent "footer" pour le bas de fenêtre ou si on doit se resservir du header en modifiant son implantation ?
As-tu un avis sur cette 4ème solution ?
Merci
Messages postés
15102
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
27 juillet 2021
97
Tiens, je ne connais pas le "header control". Mais, à mon avis, ta nouvelle solution n'est qu'une "surcouche" de la 2e. Avec la 2e, tu as la main sur tout et tu fais ce que tu veux: resize, superposition,...


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
107
Date d'inscription
lundi 7 février 2011
Statut
Membre
Dernière intervention
17 février 2018

Salut
Bon, entre-temps j'ai approfondi le header control, voilà ce que j'ai fait.
1.- J'ai créé un header control par hheader=CreateWindow(WC_HEADER,...) pas de problème
2.- J'ai récupéré sa taille par SendMessage(hheader, HDM_LAYOUT...) pas de problème
3.- J'ai modifié sa taille par SetWindowPos(hheader,...) pas de problème
4.- J'ai modifié la couleur de fond du header par SetClassLong(hheader, GCL_HBRBACKGROUND,...) pas de problème
5.- J'ai créé un contrôle statique (du texte) à l'intérieur du header comme contrôle enfant du header. pas de problème
6.- J'ai créé un bouton à l'intérieur du header comme contrôle enfant du header. pas de problème.
7.-Comme je veux en plus gérer la police du texte, sa couleur et son fond, gérer la forme et la couleur du bouton, j'ai sous-classé la WindowProc du header par SetWindowLong(hheader, GWL_WNDPROC...).
Dans la procédure de sous-classement, je récupère le message WM_DRAWITEM sous lequel je change la couleur du texte, du bouton, etc... pas de problème
8.- comme je veux récupérer la main dans la fenêtre mère du header quand l'utilisateur clique sur le bouton, je profite de la procédure de sous-classement pour y tester aussi le message WM_COMMAND associé à l'identificateur du bouton et si c'est le cas j'envoie un message WM_NOTIFY avec les codes appropriés à la fenêtre parente. Pas de problème: quand l'utilisateur clique sur le bouton qui est un enfant du header, je récupère bien la main au niveau du message WM_NOTIFY de la fenêtre parente du header.
A noter que je n'ai pas de WM_PAINT à gérer, j'ajuste juste la largeur du header à celle de sa fenêtre mère lors du message WM_SIZE.

Donc tout baigne,

Il me reste à tester un footer, je pense que je dois pouvoir soit utiliser la statusbar en la sous-classant éventuellement aussi pour gérer la couleur du texte que je veux y mettre dedans, soit un autre header control, je n'ai pas testé mais si on peut modifier sa taille, on doit pouvoir aussi modifier son implantation pour le positionner en fin de fenêtre, soit encore la solution 2.

En fait, le header control n'est pas à l'origine exactement prévu pour cette utilisation, il est prévu pour mettre des titres aux colonnes qui sont en dessous comme ça existe par exemple dans l'explorateur et lorsqu'on clique sur le titre de la colonne ça trie les données qui sont en dessous selon le critère du titre (par exemple: "nom" ou "date de modification", etc...).
Maintenant, il va me falloir choisir une solution en fait il y en avait même une 5ème qui consistait simplement à peindre un rectangle de couleur différente à l'emplacement du header, mais là il faut gérer le WM_PAINT.
Merci pour tes conseils.
Messages postés
15102
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
27 juillet 2021
97
Je constate que tu t'en sors très bien...


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...