Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Linux-UNIX-Programmierung von Jürgen Wolf
Das umfassende Handbuch – 2., aktualisierte und erweiterte Auflage 2006
Buch: Linux-UNIX-Programmierung

Linux-UNIX-Programmierung
1216 S., mit CD, 49,90 Euro
Rheinwerk Computing
ISBN 3-89842-749-8
gp Kapitel 14 Xlib – X Window-Programmierung
  gp 14.1 Architektur von X
    gp 14.1.1 Pufferung
    gp 14.1.2 Ressourcen
  gp 14.2 X Toolkit
  gp 14.3 Der Window-Manager
  gp 14.4 Fenster mit X
    gp 14.4.1 Verbindung herstellen
    gp 14.4.2 Fenster definieren
    gp 14.4.3 Informationen für den Window-Manager
    gp 14.4.4 Fenster anzeigen
    gp 14.4.5 Fenster und X-Verbindung beenden
    gp 14.4.6 Das Grundgerüst als Quellcode
  gp 14.5 Events
    gp 14.5.1 Event-Maske setzen
    gp 14.5.2 Event-Bearbeitungsschleife
    gp 14.5.3 Abarbeitung der Events
    gp 14.5.4 Tastatur-Event
    gp 14.5.5 Mausbutton-Event
    gp 14.5.6 Expose-Event
    gp 14.5.7 EnterWindowMask – LeaveWindowMask
    gp 14.5.8 Listing zu den Events
  gp 14.6 Grafik mit X
    gp 14.6.1 Grafikprimitive – Zeichenfunktionen
  gp 14.7 Text mit X
    gp 14.7.1 Fonts benutzen
    gp 14.7.2 Übersicht zu den Fonts
    gp 14.7.3 Höhe und Breite ermitteln
    gp 14.7.4 Listing mit Textausgabe
  gp 14.8 Farben mit X
  gp 14.9 Beispiel – ein Button mit X
  gp 14.10 Wozu kann ich denn nun die Xlib in der Praxis verwenden?
  gp 14.11 X und X-Toolkits – Einführung
  gp 14.12 Toolkit-Programmierung
    gp 14.12.1 Widgets
  gp 14.13 Ein einfaches Fenster mit einem Button
    gp 14.13.1 Ressourcen
  gp 14.14 Zwei Buttons in Box- und Form-Widget mit Textausgabe (Label-Widget)
  gp 14.15 editres – Widget-Hierarchie
  gp 14.16 Texteingabe mit Dialog-Widget
  gp 14.17 X-Toolkits meets Xlib
  gp 14.18 Zusammenfassung


Rheinwerk Computing

14.14 Zwei Buttons in Box- und Form-Widget mit Textausgabe (Label-Widget)  toptop

Das Beispiel von eben wird um einen weiteren Button und eine Textausgabe erweitert. Es soll dabei eine Stoppuhr erstellt werden – wenn auch die zurückgegebene Zeit nur für Sekunden genaue Zwecke ausreicht. Genauere Zeiten können Sie ja z. B. mit gettimeofday() selbst implementieren. Sie werden im folgenden Beispiel erkennen, dass im Prinzip nicht viel Neues hinzukommt. Dem Listing werden zwar weitere Widgets, wie ein zweiter Button, ein Label und eine Box hinzugefügt, dennoch werden diese Widgets ebenfalls mit der bereits bekannten Funktion XtVaCreateManagedWidget() erstellt. Daran lässt sich schon der Vorteil eines Toolkits erkennen. Im Prinzip müssen Sie nur die einzelnen Widgets kennen, die es gibt, und deren Ressourcen setzen. Dem Listing wird neben dem Form-Widget, womit Sie die Buttons recht einfach platzieren können, noch ein Box-Widget hinzugefügt. Mit dem Box-Widget erfolgt die Anordnung der beiden Buttons innerhalb des Feldes bzw. Fensters automatisch je nach Größe des Textes.

Neu hingegen im Listing sind die Funktionen XtVaSetValues() und XtVaGetValues(), mit denen Sie die Ressourcen eines Widgets verändern (Set) (z. B. den Titel des Buttons) bzw. erfragen (Get) können.

void XtVaSetValues(Widget w, ArgList args, Cardinal num_args);
void XtVaGetValues(Widget w, ArgList args, Cardinal num_args);

Der erste Parameter bezieht sich auf das Widget, von dem die Ressourcen geändert bzw. ermittelt werden sollen. Mit dem zweiten Parameter werden die einzelnen Ressourcen gesetzt bzw. bei XtVaGetValues() in eine char-Adresse geschrieben. Den dritten Parameter benötigen Sie hier nicht, und daher wird hierfür NULL angegeben. Hier das Listing dazu:

/* toolkit2.c */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Xaw/Command. h.>   /* Command-Widget */
#include <X11/Xaw/Box.h>       /* Box-Widget     */
#include <X11/Xaw/Form.h>      /* Form-Widget    */
#include <X11/Xaw/Label.h>     /* Label Widget   */
static Widget w_label, w_pressme;
/* Callback für den Button 'Ende' */
static void
Quit (Widget w, XtPointer client_data, XtPointer call_data) {
  exit (EXIT_SUCCESS);
}
/* Callback-Funktionen für den 'Start'- bzw. 'Stopp'-Button */
static void
Pressme (Widget w, XtPointer client_data, XtPointer call_data) {
  char string1[50], string2[50];   /* Hilfsstrings */
  char *ptr;
  static time_t start, stop;
  static int gedrueckt = 0;
  if (!gedrueckt) {
    start = time (NULL);
    gedrueckt = 1;
    sprintf (string1, "Gestartet ...");
    strcpy (string2, "Stop");
  } 
  else {
    gedrueckt = 0;
    stop = time (NULL);
    sprintf (string1, "Gestoppt nach %.0f Sek.",
       difftime (stop, start));
    strcpy (string2, "Start");
  }
  /* Beschriftung des Buttons w_pressme verändern */
  XtVaSetValues (w_pressme, XtNlabel, string2, NULL);
  /* Beschriftung des Labels w_label verändern */
  XtVaSetValues (
             w_label,
             XtNwidth, 250,
             XtNlabel, string1,
             NULL );
  /* Zur Demonstration => wird auf der Konsole ausgegeben ... */
  /* Hole Ressource Label von w_label                         */
  XtVaGetValues (w_label,
             XtNlabel,
             &ptr,
             NULL );
  printf("Der Inhalt des Labels: %s\n", ptr);
}
int main (int argc, char **argv) {
  XtAppContext app_context;
  Widget w_parent, w_box,
  w_form, w_quit;
  w_parent = XtVaAppInitialize (
             &app_context, NULL,
             NULL, 0, &argc, argv,
             NULL, NULL);
  /* Box-Widget um alle 3 Elemente herum */
  w_box = XtVaCreateManagedWidget (
             "box",
             boxWidgetClass,  /* Widget-Klasse von Box.h   */
             w_parent,        /* Eltern-Widget = w_parent! */
             NULL );
  /* das eigentliche Label-Widget */
  w_label = XtVaCreateManagedWidget (
             "label",
             labelWidgetClass,   /* widget class von Label.h  */
             w_box,              /* Eltern-Widget = box!      */
             XtNlabel, (XtArgVal) "Warte auf 'Start'",
             XtNwidth, (XtArgVal) 200,
             NULL);
  /* Form-Widget fuer die beiden Buttons */
  w_form = XtVaCreateManagedWidget (
             "form",
             formWidgetClass,   /* widget class von Form.h  */
             w_box,             /* Eltern-Widget = box!     */
             NULL);
  /* Command-Widget Quit */
  w_quit = XtVaCreateManagedWidget (
             "quit",
             commandWidgetClass, /* widget class von Command. h. */
             w_form,             /* Eltern-Widget = form!      */
             XtNlabel, (XtArgVal) "Ende",
             NULL);
  /* Command-Widget Pressme */
  w_pressme = XtVaCreateManagedWidget (
             "pressme",
             commandWidgetClass, /* widget class von Command. h. */
             w_form,             /* Eltern-Widget = form!      */
             XtNlabel, (XtArgVal) "Start",
             XtNhorizDistance, (XtArgVal) 50,
             NULL );
  /* Callback-Funktionen */
  XtAddCallback (w_quit, XtNcallback, Quit, 0);
  XtAddCallback (w_pressme, XtNcallback, Pressme, 0);
  /*  Stellt Fenster und Widgets dar   */
  XtRealizeWidget (w_parent);
  /*  Schleife fuer Events             */
  XtAppMainLoop (app_context);
  return EXIT_SUCCESS;
}

Das Programm bei der Ausführung:

$ gcc -o toolkit2 toolkit2.c -L/usr/X11R6/lib -lX11 -lXaw -lXt
$ ./toolkit2

Abbildung
Hier klicken, um das Bild zu vergrößern

Abbildung 14.6    Eine simple Stoppuhr-Funktion


 << zurück
  
  Zum Rheinwerk-Shop
Neuauflage: Linux-UNIX-Programmierung
Neuauflage:
Linux-UNIX-
Programmierung

bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-
 Programmierung


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
Info





Copyright © Rheinwerk Verlag GmbH 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern