Il s'agit du plus simple des "container widgets" car il permet aisément de gèrer le positionnement de ses widgets fils, en lignes et/ou en colonnes. Il est également utilisé par Motif sous divers déguisements pour implanter les menus ou les RadioBox. Certaines ressources des RowColumns sont spécifiques à ces déguisements, et sont en général positionnées automatiquement lors de la création de ces objets déguisés à l'aide de fonctions Motif telles que XmCreateMenuBar() ou XmCreateRadioBox().Nous ne parlerons pas ici de ces ressources très spéciales, nous nous contenterons de décrire les ressources les plus usuelles des RowColumns.
Dans un RowColumn, les widgets sont positionnés de la manière suivante :
Lignes ou colonnes ? Les widgets peuvent être alignés sur plusieurs lignes ou colonnes selon la valeur de XmNorientation. Avec une orientation verticale, la ressource XmNnumColumns spécifie le nombre de colonnes . Si XmNorientation vaut XmHORIZONTAL, la valeur de XmNnumColumns indique le nombre de lignes.
Par exemple, si XmNorientation vaut XmVERTICAL, et si XmnumColumns vaut 10, les objets seront rangés en colonnes, de haut en bas et de gauche à droite. Lorsque la première colonne est pleine (ça dépend de la taille de la RowColumn), on passe à la colonne suivante et ainsi de suite. Si il y a suffisamment d'objets pour remplir 10 colonnes, la largeur de chaque objet est ajustée en fonction de la largeur de la RowColumn et chaque objet a la même taille. Si on a 10 colonnes et 8 lignes, et si on élargit la RowColumn, tous les objets s'élargissent aussi (uniquement si la ressource XmNpacking vaut XmPACK_COLUMNS).
Examinons maintenant quelques exemples...
Ces deux programmes créent une petite boîte qui contient 4 boutons poussoirs (alignés verticalement dans rowcol1.c et horizontalement dans rowcol2.c). Le résultat est le suivant :
Les exécutables se trouvent dans :
~buffa/cours/minfo/motif/rowcol/rowcol1 et
~buffa/cours/minfo/motif/rowcol/rowcol2
Essayez donc de changer la taille des fenêtres de rowcol1 et rowcol2.
#include <Xm/Xm.h> #include <Xm/PushB.h> #include <Xm/RowColumn.h> main(argc, argv) int argc; char *argv[]; { Widget top_widget, row_column, button1, button2, button3, button4; XtAppContext app; int n; Arg args[10]; top_widget = XtVaAppInitialize(&app, "rowcol1", NULL, 0, &argc, argv, NULL, NULL); n=0; row_column = XmCreateRowColumn (top_widget, "row_column", args, n); XtManageChild(row_column); n=0; button1 = XmCreatePushButton(row_column, "button1", args, n); XtManageChild(button1); n=0; button2 = XmCreatePushButton(row_column, "button2", args, n); XtManageChild(button2); n=0; button3 = XmCreatePushButton(row_column, "button3", args, n); XtManageChild(button3); n=0; button4 = XmCreatePushButton(row_column, "button4", args, n); XtManageChild(button4); XtRealizeWidget(top_widget); XtAppMainLoop(app); }
![]()
Remplacer juste les lignes de création du RowColumn par :
n=0; XtSetArg(args[n], XmNorientation, XmHORIZONTAL); n++; row_column = XmCreateRowColumn (top_widget, "row_column", args, n); XtManageChild(row_column);
![]()
Seule la valeur de la ressource XmNorientation a changé. Au lieu de valoir XmVERTICAL qui est la valeur par défaut, comme dans rowcol1.c, elle vaut ici XmHORIZONTAL. Le reste du code est le même.
Remarque : pour compiler sans erreur, nous avons inclu le fichier <Xm/RowColumn.h>
Il existe bien d'autres ressources pour les widgets de type RowColumn, mais nous avons vu les trois plus importantes : XmNorientation, XmNpacking et XmNnumColumns.