1 #include <fstream>
2 #include <iostream>
3 #include <memory>
4 #include <sstream>
5 #include <string>
6
7 #include "dlib/image_io.h"
8 #include "dlib/array2d.h"
9 #include "dlib/gui_core.h"
10 #include "dlib/assert.h"
11 #include "dlib/misc_api.h"
12
13 #include "dlib/image_transforms.h"
14
15 #include "dlib/timer.h"
16
17 #include "dlib/gui_widgets.h"
18 #include "dlib/queue.h"
19
20 using namespace dlib;
21 using namespace std;
22
23
24 typedef dlib::array2d<hsi_pixel> image;
25
26
27
28
29 #include "dlib/base64.h"
30
31
32
33
34 class color_box : public draggable
35 {
36 unsigned char red, green,blue;
37
38 public:
color_box(drawable_window & w,rectangle area,unsigned char red_,unsigned char green_,unsigned char blue_)39 color_box (
40 drawable_window& w,
41 rectangle area,
42 unsigned char red_,
43 unsigned char green_,
44 unsigned char blue_
45 ) :
46 draggable(w, MOUSE_WHEEL),
47 red(red_),
48 green(green_),
49 blue(blue_),
50 t(*this,&color_box::action)
51 {
52 rect = area;
53
54 t.set_delay_time(4);
55 // t.start();
56
57 set_draggable_area(rectangle(10,10,500,500));
58
59 enable_events();
60 }
61
~color_box()62 ~color_box()
63 {
64 disable_events();
65 }
66
67 private:
68
action()69 void action (
70 )
71 {
72 ++red;
73 parent.invalidate_rectangle(rect);
74 }
75
draw(const canvas & c) const76 void draw (
77 const canvas& c
78 ) const
79 {
80 if (hidden == false )
81 {
82 fill_rect(c,rect,rgb_pixel(red,green,blue));
83 std::vector<point> poly;
84 poly.push_back((rect.tl_corner()+rect.tr_corner())/2);
85 poly.push_back((rect.tr_corner()+rect.br_corner())/2);
86 poly.push_back((rect.br_corner()+rect.bl_corner())/2);
87 poly.push_back((rect.bl_corner()+rect.tl_corner())/2);
88 draw_solid_convex_polygon(c,poly,rgb_alpha_pixel(0,0,0,70));
89 }
90 }
91
on_wheel_up(unsigned long state)92 void on_wheel_up(
93 unsigned long state
94 )
95 {
96 if (state == base_window::NONE)
97 cout << "up scroll, NONE" << endl;
98 else if (state&base_window::LEFT)
99 cout << "up scroll, LEFT" << endl;
100 else if (state&base_window::RIGHT)
101 cout << "up scroll, RIGHT" << endl;
102 else if (state&base_window::MIDDLE)
103 cout << "up scroll, MIDDLE" << endl;
104 else if (state&base_window::SHIFT)
105 cout << "up scroll, SHIFT" << endl;
106 else if (state&base_window::CONTROL)
107 cout << "up scroll, CONTROL" << endl;
108
109 }
110
on_wheel_down(unsigned long state)111 void on_wheel_down(
112 unsigned long state
113 )
114 {
115
116 if (state == base_window::NONE)
117 cout << "down scroll, NONE" << endl;
118 else if (state&base_window::LEFT)
119 cout << "down scroll, LEFT" << endl;
120 else if (state&base_window::RIGHT)
121 cout << "down scroll, RIGHT" << endl;
122 else if (state&base_window::MIDDLE)
123 cout << "down scroll, MIDDLE" << endl;
124 else if (state&base_window::SHIFT)
125 cout << "down scroll, SHIFT" << endl;
126 else if (state&base_window::CONTROL)
127 cout << "down scroll, CONTROL" << endl;
128
129 }
130
131
on_window_resized()132 void on_window_resized ()
133 {
134 draggable::on_window_resized();
135 }
136 timer<color_box> t;
137 };
138
139
140
141
142
143
144 class win : public drawable_window
145 {
146
147 label lbl_last_keydown;
148 label lbl_mod_shift;
149 label lbl_mod_control;
150 label lbl_mod_alt;
151 label lbl_mod_meta;
152 label lbl_mod_caps_lock;
153 label lbl_mod_num_lock;
154 label lbl_mod_scroll_lock;
on_keydown(unsigned long key,bool is_printable,unsigned long state)155 void on_keydown (
156 unsigned long key,
157 bool is_printable,
158 unsigned long state
159 )
160 {
161 if (is_printable)
162 lbl_last_keydown.set_text(string("last keydown: ") + (char)key);
163 else
164 lbl_last_keydown.set_text(string("last keydown: nonprintable"));
165
166 if (state&base_window::KBD_MOD_SHIFT)
167 lbl_mod_shift.set_text("shift is on");
168 else
169 lbl_mod_shift.set_text("shift is off");
170
171 if (state&base_window::KBD_MOD_CONTROL)
172 lbl_mod_control.set_text("control is on");
173 else
174 lbl_mod_control.set_text("control is off");
175
176 if (state&base_window::KBD_MOD_ALT)
177 lbl_mod_alt.set_text("alt is on");
178 else
179 lbl_mod_alt.set_text("alt is off");
180
181
182 if (state&base_window::KBD_MOD_META)
183 lbl_mod_meta.set_text("meta is on");
184 else
185 lbl_mod_meta.set_text("meta is off");
186
187 if (state&base_window::KBD_MOD_CAPS_LOCK)
188 lbl_mod_caps_lock.set_text("caps_lock is on");
189 else
190 lbl_mod_caps_lock.set_text("caps_lock is off");
191
192 if (state&base_window::KBD_MOD_NUM_LOCK)
193 lbl_mod_num_lock.set_text("num_lock is on");
194 else
195 lbl_mod_num_lock.set_text("num_lock is off");
196
197
198 if (state&base_window::KBD_MOD_SCROLL_LOCK)
199 lbl_mod_scroll_lock.set_text("scroll_lock is on");
200 else
201 lbl_mod_scroll_lock.set_text("scroll_lock is off");
202
203 drawable_window::on_keydown(key,is_printable,state);
204 }
205
rb_click()206 void rb_click (
207 )
208 {
209 if (rb.is_checked())
210 rb.set_name("radio button checked");
211 else
212 rb.set_name("radio button");
213 rb.set_checked();
214 }
215
cb_sb_enabled(toggle_button &)216 void cb_sb_enabled (
217 toggle_button&
218 )
219 {
220 if (sb_enabled.is_checked())
221 {
222 sb.enable();
223 lb.enable();
224 b.enable();
225 }
226 else
227 {
228 lb.disable();
229 sb.disable();
230 b.disable();
231 }
232
233 if (sb_enabled.is_checked())
234 rb.enable();
235 else
236 rb.disable();
237
238 if (sb_enabled.is_checked())
239 tabs.enable();
240 else
241 tabs.disable();
242
243 if (sb_enabled.is_checked())
244 tf.enable();
245 else
246 tf.disable();
247
248 if (sb_enabled.is_checked())
249 tb.enable();
250 else
251 tb.disable();
252
253 }
254
cb_sb_shown()255 void cb_sb_shown (
256 )
257 {
258 if (sb_shown.is_checked())
259 {
260 sb.show();
261 tabs.show();
262 lb.show();
263 }
264 else
265 {
266 sb.hide();
267 tabs.hide();
268 lb.hide();
269 }
270 }
271
272
tab_change(unsigned long new_idx,unsigned long)273 void tab_change (
274 unsigned long new_idx,
275 unsigned long
276 )
277 {
278 tab_label.set_text(tabs.tab_name(new_idx));
279 }
280
scroll_handler()281 void scroll_handler (
282 )
283 {
284 ostringstream sout;
285 sout << "scroll bar pos: " << sb.slider_pos();
286 sbl.set_text(sout.str());
287 }
288
scroll2_handler()289 void scroll2_handler (
290 )
291 {
292 sb.set_length(sb2.slider_pos());
293 ostringstream sout;
294 sout << "scroll bar2 pos: " << sb2.slider_pos();
295 sbl2.set_text(sout.str());
296 scroll_handler();
297 }
298
scroll3_handler()299 void scroll3_handler (
300 )
301 {
302 sb.set_max_slider_pos(sb3.slider_pos());
303 ostringstream sout;
304 sout << "scroll bar3 pos: " << sb3.slider_pos();
305 sbl3.set_text(sout.str());
306 scroll_handler();
307 }
308
lb_double_click(unsigned long)309 void lb_double_click (
310 unsigned long
311 )
312 {
313 dlib::queue<unsigned long>::kernel_2a_c sel;
314 lb.get_selected(sel);
315 sel.reset();
316 while (sel.move_next())
317 {
318 cout << lb[sel.element()] << endl;
319 }
320 //message_box("list_box",lb[idx]);
321 }
322
msg_box()323 void msg_box (
324 )
325 {
326 message_box("title","you clicked the ok button!\n HURRAY!");
327 }
328
try_this_junk(void * param)329 static void try_this_junk (
330 void* param
331 )
332 {
333 win& p = *reinterpret_cast<win*>(param);
334 put_on_clipboard(p.tf.text() + "\nfoobar");
335
336
337 }
338
on_set_clipboard()339 void on_set_clipboard (
340 )
341 {
342 create_new_thread(try_this_junk,this);
343 //try_this_junk(this);
344 }
345
try_this_junk2(void *)346 static void try_this_junk2 (
347 void*
348 )
349 {
350
351 string temp;
352 get_from_clipboard(temp);
353 message_box("clipboard",temp);
354
355 }
on_get_clipboard()356 void on_get_clipboard (
357 )
358 {
359 create_new_thread(try_this_junk2,this);
360 }
361
362
on_show_msg_click()363 void on_show_msg_click (
364 )
365 {
366 message_box("title","This is a test message.",*this,&win::msg_box);
367 }
368
on_menu_help()369 void on_menu_help (
370 )
371 {
372 message_box("About","This is the messy dlib gui regression test program");
373 }
374
375 public:
376
~win()377 ~win()
378 {
379 close_window();
380 }
381
cbox_clicked()382 void cbox_clicked (
383 )
384 {
385 if (cbox.is_checked())
386 cbl.set_text(cbox.name() + " box is checked");
387 else
388 cbl.set_text("box NOT is checked");
389 }
390
win()391 win (
392 ):
393 drawable_window(true),
394 lbl_last_keydown(*this),
395 lbl_mod_shift(*this),
396 lbl_mod_control(*this),
397 lbl_mod_alt(*this),
398 lbl_mod_meta(*this),
399 lbl_mod_caps_lock(*this),
400 lbl_mod_num_lock(*this),
401 lbl_mod_scroll_lock(*this),
402 b(*this),
403 btn_count(*this),
404 btn_get_clipboard(*this),
405 btn_set_clipboard(*this),
406 btn_show_message(*this),
407 cb1(*this,rectangle(100,100,200,200),255,0,0),
408 cb2(*this,rectangle(150,150,250,240),0,255,0),
409 cbl(*this),
410 cbox(*this),
411 group1(*this),
412 group2(*this),
413 group3(*this),
414 keyboard_count(1),
415 keydown(*this),
416 keyup(*this),
417 l1(*this),
418 l2(*this),
419 l3(*this),
420 lb(*this),
421 leave_count(*this),
422 left_down(*this),
423 left_up(*this),
424 middle_down(*this),
425 middle_up(*this),
426 mouse_state(*this),
427 mt(*this),
428 nrect(*this),
429 pos(*this),
430 rb(*this),
431 right_down(*this),
432 right_up(*this),
433 sb2(*this,scroll_bar::VERTICAL),
434 sb3(*this,scroll_bar::VERTICAL),
435 sb_enabled(*this),
436 sbl2(*this),
437 sbl3(*this),
438 sbl(*this),
439 sb_shown(*this),
440 sb(*this,scroll_bar::HORIZONTAL),
441 scroll(*this),
442 tab_label(*this),
443 tabs(*this),
444 tf(*this),
445 tb(*this),
446 mbar(*this)
447 {
448 bool use_bdf_fonts = false;
449
450 std::shared_ptr<bdf_font> f(new bdf_font);
451
452 if (use_bdf_fonts)
453 {
454
455 ifstream fin("/home/davis/source/10x20.bdf");
456 f->read_bdf_file(fin,0xFFFF);
457
458 mt.set_main_font(f);
459 }
460 //mt.hide();
461 mt.set_pos(5,200);
462
463
464 lbl_last_keydown.set_text("?");
465 lbl_mod_shift.set_text("?");
466 lbl_mod_control.set_text("?");
467 lbl_mod_alt.set_text("?");
468 lbl_mod_meta.set_text("?");
469 lbl_mod_caps_lock.set_text("?");
470 lbl_mod_num_lock.set_text("?");
471 lbl_mod_scroll_lock.set_text("?");
472
473 lbl_last_keydown.set_pos(20,420);
474 lbl_mod_shift.set_pos(20,lbl_last_keydown.bottom()+5);
475 lbl_mod_control.set_pos(20,lbl_mod_shift.bottom()+5);
476 lbl_mod_alt.set_pos(20,lbl_mod_control.bottom()+5);
477 lbl_mod_meta.set_pos(20,lbl_mod_alt.bottom()+5);
478 lbl_mod_caps_lock.set_pos(20,lbl_mod_meta.bottom()+5);
479 lbl_mod_num_lock.set_pos(20,lbl_mod_caps_lock.bottom()+5);
480 lbl_mod_scroll_lock.set_pos(20,lbl_mod_num_lock.bottom()+5);
481
482 lb.set_pos(580,200);
483 lb.set_size(200,300);
484 if (use_bdf_fonts)
485 lb.set_main_font(f);
486
487 dlib::queue<string>::kernel_2a_c qos;
488 string a;
489 a = "Davis"; qos.enqueue(a);
490 a = "king"; qos.enqueue(a);
491 a = "one"; qos.enqueue(a);
492 a = "two"; qos.enqueue(a);
493 a = "three"; qos.enqueue(a);
494 a = "yo yo yo alsdkjf asfj lsa jfsf\n this is a long phrase"; qos.enqueue(a);
495 a = "four"; qos.enqueue(a);
496 a = "five"; qos.enqueue(a);
497 a = "six"; qos.enqueue(a);
498 a = "seven"; qos.enqueue(a);
499 a = "eight"; qos.enqueue(a);
500 a = "nine"; qos.enqueue(a);
501 a = "ten"; qos.enqueue(a);
502 a = "eleven"; qos.enqueue(a);
503 a = "twelve"; qos.enqueue(a);
504 for (int i = 0; i < 1000; ++i)
505 {
506 a = "thirteen"; qos.enqueue(a);
507 }
508 lb.load(qos);
509 lb.select(1);
510 lb.select(2);
511 lb.select(3);
512 lb.select(5);
513 lb.enable_multiple_select();
514 lb.set_double_click_handler(*this,&win::lb_double_click);
515 // lb.disable_multiple_select();
516
517 btn_show_message.set_pos(50,350);
518 btn_show_message.set_name("message_box()");
519 mbar.set_number_of_menus(2);
520 mbar.set_menu_name(0,"File",'F');
521 mbar.set_menu_name(1,"Help",'H');
522 mbar.menu(0).add_menu_item(menu_item_text("show msg click",*this,&win::on_show_msg_click,'s'));
523 mbar.menu(0).add_menu_item(menu_item_text("get clipboard",*this,&win::on_get_clipboard,'g'));
524 mbar.menu(0).add_menu_item(menu_item_text("set clipboard",*this,&win::on_set_clipboard,'c'));
525 mbar.menu(0).add_menu_item(menu_item_separator());
526 mbar.menu(0).add_submenu(menu_item_submenu("submenu",'m'), submenu);
527 submenu.add_menu_item(menu_item_separator());
528 submenu.add_menu_item(menu_item_separator());
529 submenu.add_menu_item(menu_item_text("show msg click",*this,&win::on_show_msg_click,'s'));
530 submenu.add_menu_item(menu_item_text("get clipboard",*this,&win::on_get_clipboard,'g'));
531 submenu.add_menu_item(menu_item_text("set clipboard",*this,&win::on_set_clipboard,'c'));
532 submenu.add_menu_item(menu_item_separator());
533 submenu.add_menu_item(menu_item_separator());
534 mbar.menu(1).add_menu_item(menu_item_text("About",*this,&win::on_menu_help,'A'));
535
536 btn_show_message.set_click_handler(*this,&win::on_show_msg_click);
537 btn_get_clipboard.set_pos(btn_show_message.right()+5,btn_show_message.top());
538 btn_get_clipboard.set_name("get_from_clipboard()");
539 btn_get_clipboard.set_click_handler(*this,&win::on_get_clipboard);
540
541 btn_get_clipboard.set_style(button_style_toolbar1());
542 btn_set_clipboard.set_pos(btn_get_clipboard.right()+5,btn_get_clipboard.top());
543 btn_set_clipboard.set_name("put_on_clipboard()");
544 btn_set_clipboard.set_click_handler(*this,&win::on_set_clipboard);
545
546 nrect.set_size(700,500);
547 nrect.set_name("test widgets");
548 nrect.set_pos(2,mbar.bottom()+2);
549
550 //throw dlib::error("holy crap batman");
551 tab_label.set_pos(10,440);
552
553 tabs.set_click_handler(*this,&win::tab_change);
554 tabs.set_pos(5,mbar.bottom()+10);
555 tabs.set_size(280,100);
556 tabs.set_number_of_tabs(3);
557 tabs.set_tab_name(0,"davis");
558 tabs.set_tab_name(1,"edward");
559 tabs.set_tab_name(2,"king alsklsdkfj asfd");
560 tabs.set_tab_group(0,group1);
561 tabs.set_tab_group(1,group2);
562 tabs.set_tab_group(2,group3);
563
564 l1.set_text("group one");
565 l2.set_text("group two");
566 l3.set_text("group three");
567
568 group1.add(l1,0,0);
569 group2.add(l2,20,10);
570 group3.add(l3,0,0);
571
572
573
574 sb_enabled.set_name("enabled");
575 sb_shown.set_name("shown");
576 sb_shown.set_checked();
577 sb_enabled.set_checked();
578 sb_shown.set_click_handler(*this,&win::cb_sb_shown);
579 sb_enabled.set_click_handler(*this,&win::cb_sb_enabled);
580
581 sb_shown.set_tooltip_text("I'm a checkbox");
582
583 rb.set_click_handler(*this,&win::rb_click);
584
585
586 sb3.set_pos(440,mbar.bottom()+10);
587 sb3.set_max_slider_pos(300);
588 sb3.set_slider_pos(150);
589 sb3.set_length(300);
590 sb2.set_pos(470,mbar.bottom()+10);
591 sb2.set_max_slider_pos(300);
592 sb2.set_length(300);
593 sb.set_pos(500,mbar.bottom()+10);
594 sb.set_max_slider_pos(30);
595 sb.set_length(300);
596
597
598 sb.set_scroll_handler(*this,&win::scroll_handler);
599 sb2.set_scroll_handler(*this,&win::scroll2_handler);
600 sb3.set_scroll_handler(*this,&win::scroll3_handler);
601 sbl.set_pos(540,mbar.bottom()+20);
602 sbl2.set_pos(540,mbar.bottom()+40);
603 sbl3.set_pos(540,mbar.bottom()+60);
604
605 cbox.set_pos(300,mbar.bottom()+30);
606 cbox.set_name("davis king");
607 cbox.set_click_handler(*this,&win::cbox_clicked);
608
609 cbl.set_pos(300,cbox.get_rect().bottom()+1);
610 cbox.set_checked();
611 sb_enabled.set_pos(cbox.get_rect().left(),cbox.get_rect().bottom()+20);
612 sb_shown.set_pos(sb_enabled.get_rect().left(),sb_enabled.get_rect().bottom()+2);
613
614
615
616 if (use_bdf_fonts)
617 rb.set_main_font(f);
618 rb.set_name("radio button");
619 rb.set_pos(sb_shown.get_rect().left(),sb_shown.get_rect().bottom()+2);
620
621
622 cb1.set_z_order(10);
623 cb2.set_z_order(20);
624
625 pos.set_pos(50,50);
626 left_up.set_pos(50,70);
627 left_down.set_pos(50,90);
628 middle_up.set_pos(50,110);
629 middle_down.set_pos(50,130);
630 right_up.set_pos(50,150);
631 right_down.set_pos(50,170);
632
633 mouse_state.set_pos(50,190);
634
635 leave_count.set_pos(50,210);
636
637 scroll_count = 0;
638 scroll.set_pos(50,230);
639
640 btn_count.set_pos(50,250);
641
642
643 keydown.set_pos(50,270);
644 keyup.set_pos(50,290);
645
646 tf.set_pos(50,310);
647 tf.set_text("Davis685g@");
648 tf.set_width(500);
649 tf.set_text_color(rgb_pixel(255,0,0));
650 tf.set_enter_key_handler(*this,&win::on_enter_key);
651 tf.set_focus_lost_handler(*this,&win::on_tf_focus_lost);
652
653 tb.set_pos(250,400);
654 tb.set_text("initial test\nstring");
655 tb.set_size(300,300);
656 tb.set_text_color(rgb_pixel(255,0,0));
657 tb.set_enter_key_handler(*this,&win::on_enter_key);
658 tb.set_focus_lost_handler(*this,&win::on_tf_focus_lost);
659
660
661 button_count = 0;
662 count = 0;
663 b.set_name("button");
664 b.set_pos(540,100);
665 b.set_click_handler(*this,&win::on_click);
666 b.set_tooltip_text("hurray i'm a button!");
667 if (use_bdf_fonts)
668 b.set_main_font(f);
669
670
671 set_size(815,730);
672
673 nrect.wrap_around(
674 cbox.get_rect() +
675 rb.get_rect() +
676 sb_enabled.get_rect() +
677 sb_shown.get_rect());
678
679 flip = 0;
680 open_file_box(*this,&win::on_open_file);
681 open_existing_file_box(*this,&win::on_open_file);
682 save_file_box(*this,&win::on_open_file);
683
684 if (use_bdf_fonts)
685 {
686 tf.set_main_font(f);
687 tb.set_main_font(f);
688 }
689 if (use_bdf_fonts)
690 tabs.set_main_font(f);
691
692 }
693
694 private:
695
696
on_enter_key()697 void on_enter_key()
698 {
699 cout << "enter key pressed" << endl;
700 }
701
on_tf_focus_lost()702 void on_tf_focus_lost()
703 {
704 cout << "text field/box lost focus" << endl;
705 }
706
707
on_open_file(const std::string & file)708 void on_open_file (const std::string& file)
709 {
710 message_box("file opened",file);
711 }
712
713
714
715
on_click()716 void on_click (
717 )
718 {
719 ostringstream sout;
720 sout << "text field: " << tf.text();
721 ++button_count;
722 btn_count.set_text(sout.str());
723
724 if (flip == 0)
725 {
726 flip = 1;
727 lb.set_size(200,200);
728 }
729 else if (flip == 1)
730 {
731 flip = 2;
732 lb.set_size(150,200);
733 }
734 else if (flip == 2)
735 {
736 flip = 3;
737 lb.set_size(150,300);
738 }
739 else
740 {
741 flip = 0;
742 lb.set_size(200,300);
743 }
744 }
745
746
747 button b;
748 label btn_count;
749 button btn_get_clipboard;
750 button btn_set_clipboard;
751 button btn_show_message;
752 int button_count;
753 color_box cb1;
754 color_box cb2;
755 label cbl;
756 check_box cbox;
757 int count;
758 int flip;
759 widget_group group1;
760 widget_group group2;
761 widget_group group3;
762 int keyboard_count;
763 label keydown;
764 label keyup;
765 label l1;
766 label l2;
767 label l3;
768 list_box lb;
769 label leave_count;
770 label left_down;
771 label left_up;
772 label middle_down;
773 label middle_up;
774 label mouse_state;
775 mouse_tracker mt;
776 named_rectangle nrect;
777 label pos;
778 radio_button rb;
779 label right_down;
780 label right_up;
781 scroll_bar sb2;
782 scroll_bar sb3;
783 check_box sb_enabled;
784 label sbl2;
785 label sbl3;
786 label sbl;
787 check_box sb_shown;
788 scroll_bar sb;
789 int scroll_count;
790 label scroll;
791 label tab_label;
792 tabbed_display tabs;
793 text_field tf;
794 text_box tb;
795 menu_bar mbar;
796 popup_menu submenu;
797
798 };
799
800
801 win w;
802
main()803 int main()
804 {
805
806 try
807 {
808
809 image_window win;
810
811 array2d<unsigned char> img;
812 img.set_size(100,100);
813 assign_all_pixels(img,0);
814
815 fill_rect(img, rectangle(1,1,1,1), 255);
816 fill_rect(img, rectangle(1,3,2,5), 255);
817 fill_rect(img, rectangle(4,3,5,4), 255);
818 fill_rect(img, rectangle(9,9,13,10), 255);
819
820 win.set_image(img);
821
822 win.add_overlay(image_display::overlay_rect(rectangle(1,1,1,1), rgb_pixel(255,0,0)));
823 win.add_overlay(image_display::overlay_rect(rectangle(1,3,2,5), rgb_pixel(255,0,0)));
824 win.add_overlay(image_display::overlay_rect(rectangle(4,3,5,4), rgb_pixel(255,0,0)));
825 win.add_overlay(image_display::overlay_rect(rectangle(9,9,13,10), rgb_pixel(255,0,0)));
826
827
828
829 w.set_pos (100,200);
830 w.set_title("test window");
831 w.show();
832
833 w.wait_until_closed();
834 }
835 catch (exception& e)
836 {
837 cout << e.what() << endl;
838 }
839
840 }
841