/**************************************************************** Uebungen zur Vorlesung "Graphische Datenverarbeitung" Sommersemester 1996 Programm: drawkarte.c Autor: Xiaowei Xu Programm zeichnet LandKarte von EU. ****************************************************************/ # include # include # include # include # include "Landkarte.h" #define MAX_WIDTH 5069 #define MAX_HIGTH 5069 #define MIN_WIDTH 6 #define MIN_HIGTH 6 Widget DrawAr; /* Drawing Area */ XtAppContext kontext; /* Applikations-Umgebung */ GC fensterGC, pixmapGC; /* Graphik-Kontext fuer XDrawLine...*/ Display* display; Pixmap GraphikPixmap = 0; static char * fallbackRessourcen [] = { "Drawkarte.geometry: 750x500", "*drawingarea.background: white", "*drawingarea.foreground: black", NULL } ; void DrawLandkarte (int n, struct linesegment *segs, double s, Drawable w, GC g) { int i ; for (i=0 ; ievent->xexpose.x, DAinfos->event->xexpose.y, DAinfos->event->xexpose.width, DAinfos->event->xexpose.height, DAinfos->event->xexpose.x, DAinfos->event->xexpose.y, 1); } void ZoomPlusCB (Widget widget, XtPointer dum2, XtPointer dum3) { Dimension w, h; double scale ; XtVaGetValues (DrawAr, XmNheight, &h, XmNwidth, &w, NULL) ; if ( ( w < MAX_WIDTH ) && ( h < MAX_HIGTH ) ) { XtVaSetValues (DrawAr, XmNx, 0, XmNy, 0, NULL) ; w = w+w/2; h = h+h/2; XtVaSetValues (DrawAr, XmNheight, h, XmNwidth, w, NULL) ; initGraphik (DrawAr); scale = (double) ( w < h )? w : h ; DrawLandkarte (AnzahlLinien, lines, scale, GraphikPixmap, pixmapGC) ; XClearArea (display, XtWindow (DrawAr), 0, 0, w, h, 0) ; } else XtAppWarning (kontext, "upper bound for zoom is reached!"); } void ZoomMinusCB (Widget widget, XtPointer dum2, XtPointer dum3) { Dimension w, h; double scale ; XtVaGetValues (DrawAr, XmNheight, &h, XmNwidth, &w, NULL) ; if ( ( w > MIN_WIDTH ) && ( h > MIN_HIGTH ) ) { XtVaSetValues (DrawAr, XmNx, 0, XmNy, 0, NULL) ; w = w/2; h = h/2; XtVaSetValues (DrawAr, XmNheight, h, XmNwidth, w, NULL) ; initGraphik (DrawAr); scale = (double) ( w < h )? w : h ; DrawLandkarte (AnzahlLinien, lines, scale, GraphikPixmap, pixmapGC) ; XClearArea (display, XtWindow (DrawAr), 0, 0, w, h, 0) ; } else XtAppWarning (kontext, "lower bound for zoom is reached!"); } void initAttributeBoxWidgets (Widget elternWidget) { Widget Zoom; Widget ZoomPlus; Widget ZoomMinus; Zoom = XtVaCreateManagedWidget ("Zoom", xmRowColumnWidgetClass, elternWidget, XmNpacking, XmPACK_COLUMN, XmNnumColumns, 3, XmNorientation, XmVERTICAL, NULL); XtVaCreateManagedWidget ("Zoom:", xmLabelGadgetClass, Zoom, NULL); ZoomPlus = XtCreateManagedWidget ("Zoom +",xmPushButtonWidgetClass, Zoom, (Arg*)NULL, 0); ZoomMinus = XtCreateManagedWidget ("Zoom -",xmPushButtonWidgetClass, Zoom, (Arg*)NULL, 0); XtAddCallback (ZoomPlus, XmNactivateCallback, ZoomPlusCB, (XtPointer)NULL); XtAddCallback (ZoomMinus, XmNactivateCallback, ZoomMinusCB, (XtPointer)NULL); } void initGraphikWidget (Widget elternWidget) { XGCValues werte; DrawAr = XtVaCreateManagedWidget("drawingarea", xmDrawingAreaWidgetClass, elternWidget, XmNwidth, 500, XmNheight, 500, NULL) ; /* Fuer die Graphik-Ausgabe wird ein Graphik-Kontext (GC) erzeugt und mit den Vorder- und Hintergrundfarben der Drawing-Area-Widget besetzt. */ XtVaGetValues (DrawAr, XmNforeground, &(werte.foreground), XmNbackground, &(werte.background), NULL) ; fensterGC = XCreateGC (display, XtWindow (DrawAr), GCForeground | GCBackground, &werte) ; /* Callbacks registrieren. Der Resize-Callback darf erst nach XtRealizeWidget registriert werden */ XtAddCallback (DrawAr, XmNexposeCallback, exposeCB, (XtPointer)NULL); XtAddCallback (DrawAr, XmNresizeCallback, resizeCB, (XtPointer)NULL); } Widget initForm (Widget elternWidget) { Widget formW; Widget attributeBoxW; Widget scrollW; Arg args[10]; Cardinal n; formW = XtCreateManagedWidget ("form", xmFormWidgetClass, elternWidget, (Arg*)NULL, 0); n = 0; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; attributeBoxW = XtCreateManagedWidget ("attributeBox", xmRowColumnWidgetClass, formW, args, n); initAttributeBoxWidgets (attributeBoxW); n = 0; XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg (args[n], XmNleftWidget, attributeBoxW); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNwidth, 500); n++; XtSetArg (args[n], XmNheight, 500); n++; XtSetArg (args[n], XmNscrollingPolicy, XmAUTOMATIC); n++; scrollW = XtCreateManagedWidget ("scrolledGraphik", xmScrolledWindowWidgetClass, formW, args, n); initGraphikWidget (scrollW); return formW; } void initWidgets (Widget rtW) { Widget mainW; Widget formW; XGCValues werte; /* Struktur zum Setzen von GC-Attributen */ mainW = XtCreateManagedWidget ("main", xmMainWindowWidgetClass, rtW, (Arg*)NULL, 0); formW = initForm (mainW); XmMainWindowSetAreas (mainW, (Widget)NULL, (Widget)NULL, (Widget)NULL, (Widget)NULL, formW); } main (int argc, char ** argv) { Widget applShell; applShell = XtAppInitialize (&kontext, "Drawkarte", (XrmOptionDescRec*)NULL, 0, &argc, argv, fallbackRessourcen, (Arg*)NULL, 0); display = XtDisplay (applShell); XtRealizeWidget (applShell); initWidgets (applShell); XtAppMainLoop (kontext); }