caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] probleme de liaison avec un canvas
@ 2003-01-08 11:01 Sebastien Gandia - maitrise
  2003-01-09  5:37 ` [Caml-list] " Michaël Grünewald
  0 siblings, 1 reply; 2+ messages in thread
From: Sebastien Gandia - maitrise @ 2003-01-08 11:01 UTC (permalink / raw)
  To: caml-list

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à.

Merci
-------------------
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


^ permalink raw reply	[flat|nested] 2+ messages in thread

* [Caml-list] Re: probleme de liaison avec un canvas
  2003-01-08 11:01 [Caml-list] probleme de liaison avec un canvas Sebastien Gandia - maitrise
@ 2003-01-09  5:37 ` Michaël Grünewald
  0 siblings, 0 replies; 2+ messages in thread
From: Michaël Grünewald @ 2003-01-09  5:37 UTC (permalink / raw)
  To: caml-list

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


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2003-01-09  6:43 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-01-08 11:01 [Caml-list] probleme de liaison avec un canvas Sebastien Gandia - maitrise
2003-01-09  5:37 ` [Caml-list] " Michaël Grünewald

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).