-
GridLayout et API Win32
Bonjour a tous,
je cherche a implémenter une classe (équivalente aux QGridLayout de QT) en win 32, cependant je galère un peu.
J'utilise CreateRectRgn pour créer des régions rectangulaire et SetWindowRgn pour mettre un widget a l'intérieur d'une région.
Si toute les region sont de la même taille, ce n'est pas trop dur cependant il faut tenir compte de pleins de paramètres :
- Certain "Widget" ont une taille minimale et / ou maximal (d'autre une taille fixe)
- Certain "Widget" ont un colspan et / ou rowspan different de 1.
J'avais implementer la version ou tous les block étaient de la même taille, mais la c'est plus dur. J'ai du mal a écrire l'algo en "francais".
Dans la classe,
+ je stock un vecteur de structure contenant pour chaque widget : (VEC)
----> un HWND du widget
----> la position vertical
----> la position horizontal
----> le colspan
----> le rowspan
----->region associee (HRGN) initialement a NULL
+ le nombre max de colonne (MX)
+ le nombre max de ligne (MY)
+ La marge entre chaque widget verticalement
+ La marge entre chaque widget horizontalement
+ la taille du widget parent
----------------
Ajout d'un widget : (on passe en parametre un HWND, positionX, positionY, colspan, rowspan
// on calcul si le nombre max de col et de ligne n'a pas change
Si PositionX > MX
MX = PositionX
Si PositionY > MY
MY = PositionY
On declare une map de unsigned int pour les col et les lignes
// On a ainsi le nombre max de widget verticalement et horizontalement
On push dans VEC un nouvelle struct avec les parametre de cette fonction)
On parcours VEC
Si le composant a une taille minimal horizontalement
alors Map[index de la colonne] = cette taille minimale (on decremente egalement cette taille de la taille du widget parent)
Ou Si ... (De meme verticalement)
Sinon on incrémente le nombre de widget restant (ceux qui non pas de taille minimal et on divise la taille du widget parent restant par le nombre on a ainsi la taille de toute les colonne)
On parcourt le VEC pour créer les région et y mettre les widget
----------------
Ce code est plus ou moins fonctionnelle cependant ca ne tient pas en compte des colspan et rowspan ...
Si vous pouviez m'éclairer pour implémenter ceci ou si vous avez un meilleur algo en tête que celui que j'ai utilise,
N'hésitez pas.
Cordialement,
Toams
-
J'ai du mal à voir pourquoi tu trifouilles la région des fenêtres et contrôles. Généralement, on ne fait ça que pour donner à une fenêtre une forme non-rectangulaire...
-
Cela dans le but de positionner les widgets facilement dans une fenetre et faciliter le redimensionnement.
Un petit shcema plutot qu'un long dialogue :
http://img213.imageshack.us/img213/5917/testlu.jpg
Chaque bloque représentant un widget.
Codrialement,
Toams
-
Mais je ne vois pas ce que les régions viennent y faire.
C'est clairement un terme GDI, alors que là on ne devrait pas descendre plus bas que le niveau USER (donc, MoveWindow() / SetWindowPos() OK, mais inutile de toucher aux régions).
-
Je vois, tu me suggères juste de déplacer les widget au sein de la classe sans passer par des régions, en effet ca évite d'utiliser les régions pour rien. Cependant ca ne règle pas le problème d'algo de positionnement si tu as une idée.
Merci encore