Browse thread
[Caml-list] probleme de liaison avec un canvas
-
Sebastien Gandia - maitrise
- Michaël_Grünewald
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2003-01-09 (06:43) |
From: | Michaël_Grünewald <michael-grunewald@w...> |
Subject: | [Caml-list] Re: probleme de liaison avec un canvas |
Sebastien Gandia - maitrise <gandias@ifsic.univ-rennes1.fr> writes: > Bonjour, je travaille avec la librairie LablTK, et je desire associer a > un canvas un evenement. > Cet evenement est par exemple : > > -quand on clique dans le canvas , on recupere les coordonnées de la zone > cliquée > > ça peut-etre aussi une action associée. > > J'ai essayé avec canvas.bind mais ça n'a aucun effet. > Ainsi pourriez vous me donner un exemple de code utilisant canvas.bind > pour que je puisse comparer son implementation avec la mienne, car je > pense que la solution est là. Avec plaisir, dans la distribution de Tk il y a une floppée d'exemples, pour faire connaissance avec ocamltk, je me suis entraîné à les traduire. Exercice recommandé, il me semble. Je me suis arrêté à un, le voici : (* simple_graph *) open Tk;; let font_label = "arial";; let font_plot = "Helvetica 18";; let toplevel = opentk ();; let w_msg = Label.create ~font:font_label ~justify:`Left ~takefocus:false ~text:("This windows displays a canvas widget containing" ^" a simple two dimensional plot." toplevel) ;; pack [w_msg];; (* frame and buttons *) let w_frame = Frame.create toplevel;; let b_dismiss = Button.create ~text:"Dismiss" w_frame;; let b_seecode = Button.create ~text:"See Code" w_frame;; pack ~side:`Bottom ~fill:`X [w_frame];; pack ~side:`Left ~fill:`X [b_seecode; b_dismiss];; (* canvas *) let canvas = Canvas.create ~relief:`Raised ~width:450 ~height:450 toplevel;; pack ~side:`Top [canvas];; (* oh le joli dessin *) (* les axes *) Canvas.create_line ~width:2 ~xys:[100,250; 400,250] canvas;; Canvas.create_line ~width:2 ~xys:[100,250; 100,50] canvas;; for k = 0 to 10 do ignore(Canvas.create_line ~width:2 ~xys:[100+k*30,250;100+k*30,245] canvas) done;; for k = 0 to 5 do ignore(Canvas.create_line ~width:2 ~xys:[100,250-k*40;105,250-k*40] canvas) done;; let point_list = [12,56;20,94;33,98;32,120;61,180;75,160;98,223];; let place_point (x,y) = let true_x = 100 + 3 * x in let true_y = 250 - (4*y)/5 in let r = 6 in let item = Canvas.create_oval ~x1:(true_x - r) ~x2:(true_x + r) ~y1:(true_y - r) ~y2:(true_y + r) ~width:1 ~fill:(`Color "Orange") ~outline:(`Color "Black") canvas in Canvas.addtag canvas ~tag:"point" ~specs:[`Withtag item] in List.iter place_point point_list;; (* Note: le tag "current" est géré par Tk, c'est l'objet en cours, par exemple, celui sous le pointeur. *) let change_color color = Canvas.configure_oval ~fill:(`Color color) canvas (`Tag "current") ;; type plot_t = {mutable lastX:int; mutable lastY:int; } ;; let plot = {lastX = 0; lastY = 0; } ;; let plot_down x y = begin Canvas.dtag canvas (`Tag "selected" ) "selected"; Canvas.addtag canvas ~tag:"selected" ~specs:[`Withtag (`Tag "current")]; Canvas.raise canvas (`Tag "current"); plot.lastX <- x; plot.lastY <- y; end ;; let plot_move x y = begin Canvas.move canvas (`Tag "selected") (x - plot.lastX) (y - plot.lastY); plot.lastX <- x; plot.lastY <- y; end ;; Canvas.bind ~events:[`Enter] ~fields:[] ~action:(function x -> change_color "Red"; () ) canvas (`Tag "point");; Canvas.bind ~events:[`Leave] ~fields:[] ~action:(function x -> change_color "Orange"; () ) canvas (`Tag "point");; Canvas.bind ~events:[`ButtonPressDetail 1] ~fields:[`MouseX;`MouseY] ~action:(function x -> plot_down x.ev_MouseX x.ev_MouseY) canvas (`Tag "point") ;; Canvas.bind ~events:[`ButtonReleaseDetail 1] ~fields:[`MouseX;`MouseY] ~action:(function x -> Canvas.dtag canvas (`Tag "selected") "selected") canvas (`Tag "point") ;; Canvas.bind ~events:[`Motion] ~fields:[`MouseX;`MouseY] ~action:(function x -> plot_move x.ev_MouseX x.ev_MouseY) canvas (`Tag "point") ;; mainLoop();; -- Michaël Grünewald <michael-grunewald@wanadoo.fr> - RSA PGP Key ID: 0x20D90C12 ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners