4.4.2 ΟΙ ΠΑΡΑΜΕΤΡΟΙ (RESOURCES) ΤΩΝ WIDGETS


Η δομή Arg αποτελείται από δύο μέρη, μια συμβολοσειρά και μια τιμή τύπου XtArgVal (long όπως ορίζεται προηγουμένως). Η συμβολοσειρά name καθορίζει την παράμετρο της οποίας θέτουμε την τιμή ενώ το δεύτερο πεδίο (value) καθορίζει την τιμή της παραμέτρου. Η συμβολοσειρά name λαμβάνει προκαθορισμένες τιμές, οι οποίες ορίζονται στα include files του Xtoolkit και του Motif. Οι τιμές αυτές αρχίζουν πάντα από XtN και XmN αντίστοιχα. Το δεύτερο πεδίο της Arg μπορεί να λάβει αριθμητικές τιμές, συμβολοσειρές ή προκαθορισμένες τιμές, οι οποίες ορίζονται και αυτές στα include files.

Οι παράμετροι που ορίζονται με την δομή Arg μπορούν να είναι η θέση, το μέγεθος ή άλλα ιδιαίτερα χαρακτηριστικά του widget. Υπάρχουν δύο τρόποι για την ανάθεση των τιμών στην δομή Arg, ο στατικός και ο δυναμικός. Ο στατικός είναι να οριστούν οι τιμές της δομής εξαρχής με μια δήλωση της μορφής:

    Arg wargs[] = {
            { XtNx,      10 },
            { XtNy,      20 },
            { XtNwidth,  80 },
            { XtNheight, 40 }
        };
Ο παραπάνω τρόπος είναι βολικός όταν οι τιμές των παραμέτρων σταθερές (αριθμοί ή defines αριθμών). Υπάρχουν όμως περιπτώσεις που είναι δείκτες (pointers). Τότε απαιτείται η απόδωση των τιμών στη δομή Arg να γίνει δυναμικά κατά την λειτουργία του προγράμματος. Για το σκοπό αυτό υπάρχει η μακροεντολή XtSetArg, η οποία παίρνει τρεις παραμέτρους, τη δομή Arg και τις τιμές των δύο μελών της:

    XtSetArg( Arg arg, String name, XtArgVal value );
Ένα παράδειγμα χρήσης της XtSetArg φαίνεται στο επόμενο παράδειγμα:

    Arg wargs[3];
    .
    .
    .
    XtSetArg(wargs[0], XtNx , 80);
    XtSetArg(wargs[1], XtNy , 40);
    XtSetArg(wargs[2], XmNentryClass , xmToggleButtonWidgetClass);
Έχοντας ορίσει τις τιμές της δομής Arg μπορούμε να καλέσουμε την XtCreateWidget για την δημιουργία του widget. Η συμπλήρωση της δομής Arg δεν είναι απαραίτητη, αν δεν περαστεί στην XtCreateWidget τότε το widget δημιουργείται χρησιμοποιώντας τις τυπικές τιμές. Στο παρακάτω παράδειγμα χρησιμοποιούμε την XtCreateWidget για τη δημιουργία ενός push button. Θεωρούμε ότι έχουμε ήδη ορίσει την wargs (όπως παραπάνω):

    Widget widget;

    widget = XtCreateWidget(
                         toplevel,
                         xmPushButtonWidgetClass,
                         wargs,
                         XtNumber(wargs));
Στην παραπάνω κλήση της XtCreateWidget χρησιμοποιούμε και την μακροεντολή XtNumber η οποία επιστρέφει το πλήθος των δομών Arg που περνάμε στην XtCreateWidget. Η XtNumber είναι ιδιαίτερα χρήσιμη γιατί μας απαλλάσσει από την ανάγκη να θυμόμαστε το μέγεθος του πίνακα δομών Arg που εισάγουμε στην XtCreateWidget.

Το Xtoolkit προσφέρει δύο ακόμα συναρτήσεις που σχετίζονται με τη δομή Arg, τις XtSetValues και XtGetValues που ορίζονται ως εξής:

    XtSetValues( Widget widget, Arg *wargs, int nargs);
    XtGetValues( Widget widget, Arg *wargs, int nargs);
Και οι δύο συναρτήσεις λαμβάνουν ως ορίσματα ένα widget, ένα δείκτη σε μια δομή Arg (ή πίνακα δομών Arg) και το πλήθος των δομών Arg. Χρησιμοποιούνται να αλλάξουν (η XtSetValues) ή να πάρουν (η XtGetValues) τα χαρακτηριστικά ενός widget που έχει ήδη δημιουργηθεί. Για να πάρουμε τα χαρακτηριστικά που θέλουμε από ένα widget, με τη χρήση της XtGetValues, βάζουμε στο πεδίο name της δομής Arg το όνομα του χαρακτηριστικού που θέλουμε να ελέγξουμε, ενώ στο πεδίο value το δεικτή σε μια μεταβλητή στην οποία θέλουμε να γραφεί το αποτέλεσμα. Στο επόμενο παράδειγμα χρησιμοποιούμε την XtGetValues για να μάθουμε τη θέση ενός widget:

    Arg wargs[2];
    int xpos, ypos;
    .
    .
    .
    XtSetArg(wargs[0], XtNx , &xpos);
    XtSetArg(wargs[1], XtNy , &ypos);
    XtGetValues(widget, wargs, XtNumber(wargs));
    printf("Widget is located at position x=%d, y=%d\n", x,y);

[prev] [up] [next] [contents] [index]