/* examples/canvas/echelle.c */ #include He_node *princ, *canvas; int old_width = 1, old_height = 1; #define SMAX 1000 int Sx[SMAX], Sy[SMAX], Sn = 0; void dessin_segment (Window win, int i) { if (i == 0) XDrawPoint (he_display, win, he_gc, Sx[0], Sy[0]); else XDrawLine (he_display, win, he_gc, Sx[i-1], Sy[i-1], Sx[i], Sy[i]); } void princ_resize_proc (He_node *hn, int width, int height) { HeExpand (canvas, NULL, HE_BOTTOM_RIGHT); } void canvas_resize_proc (He_node *hn, int width, int height) { int i; for (i = 0; i < Sn; i++) { Sx[i] = Sx[i] * width / old_width; Sy[i] = Sy[i] * height / old_height; } old_width = width; old_height = height; } void canvas_repaint_proc (He_node *hn, Window win) { int i; XSetForeground (he_display, he_gc, he_black); for (i = 0; i < Sn; i++) dessin_segment (win, i); } void canvas_event_proc (He_node *hn, He_event *hev) { switch (hev->type) { case ButtonPress : HeDrawBg (hn, he_white); Sn = 0; Sx[Sn] = hev->sx; Sy[Sn] = hev->sy; dessin_segment (hev->win, Sn++); break; case MotionNotify : if (hev->sb > 0 && Sn < SMAX) { Sx[Sn] = hev->sx; Sy[Sn] = hev->sy; dessin_segment (hev->win, Sn++); } break; } } int main (int argc, char *argv[]) { HeInit (&argc, &argv); princ = HeCreateFrame(); HeSetFrameLabel (princ, "Mise ŕ l'échelle"); HeSetFrameResizeProc (princ, princ_resize_proc); canvas = HeCreateCanvas (princ); HeSetWidth (canvas, 300); HeSetHeight (canvas, 300); HeSetCanvasResizeProc (canvas, canvas_resize_proc); HeSetCanvasRepaintProc (canvas, canvas_repaint_proc); HeSetCanvasEventProc (canvas, canvas_event_proc); HeFit (princ); return HeMainLoop (princ); }