Les widgets de type Scale permettent à l'utilisateur d'entrer des valeurs numériques dans un programme à l'aide d'ascenseurs. Voici un exemple de Scale widget :
Pour créer un Scale widget on utilisera par exemple une de ces fonctions : XmCreateScale() ou encore XtVaCreateManagedWidget() avec comme classe de widget xmScaleWidgetClass. Il existe encore d'autres manières mais à ce stade du cours vous devriez les connaîtres ou mieux les deviner.
Les ressources les plus intéressantes des Scale widgets sont :
Il existe deux types de callback pour les Scale widgets :
La fonction de callback d'un Scale widget est standard :
L'exécutable se trouve dans :
Le document The MOTIF Style Guide suggère d'utiliser des petits marqueurs pour décorer l'echelle des valeurs des Scale widgets et ainsi leur donner l'allure de "règles". Voici un exemple :
Chaque marqueur est un widget de type Separator qui aura pour père le Scale widget. Voici les modifications que l'on pourrait apporter au programme d'exemple précédent pour qúil ressemble à la figure ci-dessus :
Bases d'utilisation des widgets de type Scale
C'est au programmeur de faire attention à effectuer la division
par 100 et la conversion int -> float ou double.
Fonctions de callback des Scale widgets
Le champ value de la structure XmScaleCallbackStruct *cbk contient la valeur courante (un int) correspondant à la position du curseur.
scale_cbk(Widget w, XtPointerData data, XmScaleCallbackStruct *cbk)
Petit programme d'exemple : scale.c
ce petit programme simule une interface pour règler le volume sonore d'une quelconque application musicale du type xaudio, etc...
/home/profs/cours/minfo/motif/scale/scale
#include <Xm/Xm.h>
#include <Xm/Scale.h>
/*--------------------------*/
main(int argc, char **argv)
/*--------------------------*/
{
Widget top_wid, scale;
XmString title;
XtAppContext app;
void scale_cbk();
top_wid = XtVaAppInitialize(&app, "Scale", NULL, 0,
&argc, argv, NULL, NULL);
title = XmStringCreateSimple("Volume sonore");
scale = XtVaCreateManagedWidget("scale",
xmScaleWidgetClass, top_wid,
XmNtitleString, title,
XmNorientation, XmHORIZONTAL,
XmNmaximum, 11,
XmNdecimalPoints, 0,
XmNshowValue, True,
XmNwidth, 200,
XmNheight, 100,
NULL);
XtAddCallback(scale,XmNvalueChangedCallback, scale_cbk,
NULL);
XtRealizeWidget(top_wid);
XtAppMainLoop(app);
}
/*--------------------------------------------------*/
void scale_cbk(Widget widget, int data,
XmScaleCallbackStruct *scale_struct)
/*--------------------------------------------------*/
{
if (scale_struct->value < 4)
printf("Le volume sonore est trop bas (%d)\n",
scale_struct->value);
else if (scale_struct->value < 7)
printf("le volume sonore est Ok (%d)\n",
scale_struct->value);
else
if (scale_struct->value < 10)
printf("Le volume sonore est fort (%d)\n",
scale_struct->value);
else /* Volume == 11 */
printf("le volume sonore est vraiment trop fort (%d)\n",
scale_struct->value);
}
Changer le look d'un Scale widget
L'exécutable correspondant à cette modification se trouve dans :
#include <Xm/SeparatoG.h>
Widget ...,tics[11];
.
.
/* Création des marqueurs le long de l'axe horizontal */
for (i=0; i < 11; ++i ) {
n=0;
XtSetArg(args[n], XmNseparatorType, XmSINGLE_LINE); n++;
XtSetArg(args[n], XmNorientation, XmVERTICAL); n++;
XtSetArg(args[n], XmNwidth, 10); n++;
XtSetArg(args[n], XmNheight, 5); n++;
tics[i] = XmCreateSeparatorGadget(scale, "|",
args, n);
}
XtManageChildren(tics, 11);
.
.
/home/profs/cours/minfo/motif/scale/scale1
michel.buffa@essi.fr