canvas.pp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. { Demo showing the use of canvas object. V0.75
  2. }
  3. uses xforms,x,xlib;
  4. {*** Forms and Objects ***}
  5. type TFD_canvasform = record
  6. canvasform : PFL_FORM;
  7. vdata : pointer;
  8. ldata : longint;
  9. canvas,
  10. br,
  11. keyboard,
  12. mouse,
  13. done,
  14. misc,
  15. menu : PFL_OBJECT;
  16. end;
  17. PFD_canvasform = ^TFD_canvasform;
  18. Var canvasGC : TGC;
  19. function canvas_expose(ob : PFL_OBJECT;win : TWindow; w,h : longint; ev : PXEvent;d : Pointer) : longint;cdecl;
  20. var ui : PFD_CANVASFORM;
  21. begin
  22. ui := d;
  23. XFillRectangle(PDisplay(fl_display), TDRAWABLE(win), canvasGC, 0, 0,cardinal( w), cardinal(h));
  24. fl_addto_browser(ui^.br, 'Expose');
  25. end;
  26. function canvas_key(ob : PFL_OBJECT; win : TWindow; w,h : Longint; ev : PXEvent; d: pointer) : longint;cdecl;
  27. var
  28. ui :PFD_canvasform;
  29. buf : string[128];
  30. begin
  31. ui := d;
  32. str (XKeycodeToKeysym(PDisplay(fl_display),ev^.xkey.keycode, TkeyCode(#0)),buf);
  33. buf:= 'KeyPress: keysym='+buf+#0;
  34. fl_addto_browser(ui^.br, @buf[1]);
  35. return 0;
  36. end;
  37. function canvas_but(ob : PFL_OBJECT; win : TWindow; w,h : longint, ev : PXEvent;d : pointer) : longint;cdecl;
  38. var
  39. ui : PFD_canvasform;
  40. buf : string[128];
  41. begin
  42. ui := d;
  43. str(ev^.xbutton.button,buf);
  44. if ev^.eventtype=ButtonPress then
  45. buf:='Press '+buf
  46. else
  47. buf:='Release '+buf;
  48. buf:='Button '+buf+#0;
  49. fl_addto_browser(ui^.br, @buf[1]);
  50. end;
  51. function canvas_misc(ob : PFL_OBJECT; win : TWindow; w,h : longint, ev : PXEvent;d : pointer) : longint;cdecl;
  52. var
  53. ui : PFD_canvasform;
  54. begin
  55. ui := d;
  56. if ev^.xcrossing.eventtype=EnterNotify then
  57. fl_addto_browser(ui^.br, 'Enter Canvas')
  58. else
  59. fl_addto_browser(ui^.br, 'Leave Canvas')
  60. end;
  61. procedure init_canvas(FD_canvasform *fdui)
  62. begin
  63. fl_add_canvas_handler(fdui^.canvas, Expose, PFL_HANDLE_CANVAS(@canvas_expose), fdui);
  64. fl_add_canvas_handler(fdui^.canvas, KeyPress, PFL_HANDLE_CANVAS(@canvas_key), fdui);
  65. fl_add_canvas_handler(fdui^.canvas, ButtonPress,PFL_HANDLE_CANVAS(@canvas_but),fdui);
  66. fl_add_canvas_handler(fdui^.canvas, ButtonRelease,PFL_HANDLE_CANVAS(canvas_but),fdui);
  67. fl_set_button(fdui^.mouse, 1);
  68. fl_set_button(fdui^.keyboard, 1);
  69. canvasGC := XCreateGC(fl_get_display(),fl_state[fl_vmode].trailblazer,0,0);
  70. XSetForeground(fl_get_display(), canvasGC, fl_get_flcolor(FL_BLACK));
  71. end;
  72. var
  73. fd_canvasform : PFD_canvasform;
  74. procedure sensitive_setting(ob : PFL_OBJECT ; event : longint); cdecl;
  75. var
  76. hc : PFL_HANDLE_CANVAS;
  77. begin
  78. if event=Keypress then
  79. hc := PFL_HANDLE_CANVAS(@canvas_key)
  80. else
  81. hc := PFL_HANDLE_CANVAS(@canvas_but);
  82. if(fl_get_button(ob)<>0) then
  83. fl_add_canvas_handler(fd_canvasform^.canvas, event, hc, fd_canvasform);
  84. else
  85. fl_remove_canvas_handler(fd_canvasform^.canvas, event, hc);
  86. end;
  87. procedure disable_it(ob : PFL_OBJECT; data : longint);cdecl;
  88. begin
  89. if fl_get_button(ob)<>0 then
  90. fl_deactivate_object(fd_canvasform^.canvas)
  91. else
  92. fl_activate_object (fd_canvasform^.canvas);
  93. end;
  94. procedure hide_it(ob : PFL_OBJECT; all : longint);cdecl;
  95. begin
  96. if(all<>0) then
  97. begin
  98. fl_hide_form(fd_canvasform^.canvasform);
  99. fl_show_form(fd_canvasform^.canvasform,
  100. FL_PLACE_CENTER, FL_TRANSIENT, 'canvas');
  101. {$ifdef nevertrue}
  102. fl_remove_selected_xevent(fd_canvasform^.canvasform^.window,
  103. OwnerGrabButtonMask);
  104. {$endif }
  105. end
  106. else
  107. begin
  108. if(fd_canvasform^.canvas^.visible)<>0 then
  109. begin
  110. fl_hide_object(fd_canvasform^.canvas);
  111. fl_set_object_label(ob,'ShowCanvas');
  112. end
  113. else
  114. begin
  115. fl_show_object(fd_canvasform^.canvas);
  116. fl_set_object_label(ob,'HideCanvas');
  117. end
  118. end;
  119. end;
  120. procedure misc_cb(ob : PFL_OBJECT; data : longint); cdecl;
  121. begin
  122. if(fl_get_button(ob)<>0) then
  123. begin
  124. fl_add_canvas_handler(fd_canvasform^.canvas, EnterNotify,
  125. PFL_HANDLE_CANVAS(@canvas_misc), fd_canvasform);
  126. fl_add_canvas_handler(fd_canvasform^.canvas, LeaveNotify,
  127. PFL_HANDLE_CANVAS(@canvas_misc), fd_canvasform);
  128. end
  129. else
  130. begin
  131. fl_remove_canvas_handler(fd_canvasform^.canvas,
  132. EnterNotify, PFL_HANDLE_CANVAS(@canvas_misc));
  133. fl_remove_canvas_handler(fd_canvasform^.canvas,
  134. LeaveNotify, PFL_HANDLE_CANVAS(@canvas_misc));
  135. end;
  136. end;
  137. {*****************}
  138. function create_form_canvasform : PFD_canvasform;
  139. var
  140. obj :=PFL_OBJECT;
  141. fdui : PFD_canvasform;
  142. begin
  143. new(fdui);
  144. fdui^.canvasform := fl_bgn_form(FL_NO_BOX, 450, 280);
  145. obj := fl_add_box(FL_UP_BOX,0,0,450,280,'');
  146. obj:= fl_add_canvas(FL_NORMAL_CANVAS,20,40,155,187,'');
  147. fdui^.canvas := obj ;
  148. obj := fl_add_browser(FL_NORMAL_BROWSER,188,40,152,187,'');
  149. fdui^.br := obj ;
  150. obj := fl_add_button(FL_PUSH_BUTTON,30,236,90,27,'Deactivate');
  151. fl_set_object_callback(obj,disable_it,0);
  152. obj := fl_add_button(FL_NORMAL_BUTTON,120,236,90,27,'HideCanvas');
  153. fl_set_object_callback(obj, hide_it, 0);
  154. obj := fl_add_button(FL_NORMAL_BUTTON,210,236,90,27,'HideForm');
  155. fl_set_object_callback(obj, hide_it, 1);
  156. obj := fl_add_button(FL_NORMAL_BUTTON,300,236,90,27,'Done');
  157. fdui^.done := obj ;
  158. obj := fl_add_text(FL_NORMAL_TEXT,130,10,120,20,'Canvas');
  159. fl_set_object_lsize(obj,FL_MEDIUM_SIZE);
  160. fl_set_object_lalign(obj,FL_ALIGN_CENTER);
  161. fl_set_object_lstyle(obj,FL_BOLD_STYLE);
  162. obj:= fl_add_menu(FL_PULLDOWN_MENU, 20,10, 45,22,'Menu');
  163. fdui^.menu := obj ;
  164. fl_set_object_shortcut(obj,'#m', 1);
  165. fl_set_object_lstyle(obj, FL_BOLD_STYLE);
  166. obj := fl_add_checkbutton(FL_PUSH_BUTTON,345,40,76,26,'Keyboard');
  167. fdui^.keyboard := obj ;
  168. fl_set_object_color(obj,FL_COL1,FL_BLUE);
  169. fl_set_object_callback(obj,sensitive_setting,KeyPress);
  170. obj := fl_add_checkbutton(FL_PUSH_BUTTON,345,70,76,26,'Mouse');
  171. fdui^.mouse := obj ;
  172. fl_set_object_color(obj,FL_COL1,FL_BLUE);
  173. fl_set_object_callback(obj,sensitive_setting,ButtonPress);
  174. obj := fl_add_checkbutton(FL_PUSH_BUTTON,345,100,74,26,'Enter/Leave');
  175. fdui^.misc := obj;
  176. fl_set_object_color(obj,FL_COL1,FL_BLUE);
  177. fl_set_object_callback(obj,misc_cb,ButtonPress);
  178. fl_end_form();
  179. create_form_canvasform :=fdui;
  180. end;
  181. begin
  182. fl_set_border_width(-2);
  183. fl_initialize(@argc, argv, 'FormDemo', nil, 0);
  184. fd_canvasform := create_form_canvasform;
  185. { fill-in form initialization code }
  186. fl_set_object_dblbuffer(fd_canvasform^.br, 1); { looks better }
  187. init_canvas (fd_canvasform);
  188. fl_addto_menu(fd_canvasform^.menu,'Item1|Item2|Item3|Item4');
  189. fl_show_form(fd_canvasform^.canvasform,
  190. FL_PLACE_FREE,FL_FULLBORDER,'canvasform');
  191. {$ifdef nevertrue}
  192. fl_remove_selected_xevent(fd_canvasform^.canvasform^.window,
  193. OwnerGrabButtonMask);
  194. {$endif}
  195. while (fl_do_forms() <> fd_canvasform^.done) do ;
  196. end.