Title: Gestione degli eventi
1Gestione degli eventi
Corso Di Programmazione Grafica e Laboratorio
2Eventi principali
- Move (passive) event - con (senza) bottone, mouse
event - glutMouseFunc(mouse_callback)
- Window event - resize, reshape, move window
- glutDisplayFunc(display_callback)
- Keyboard event
- glutKeyboardFunc(keyboard_callback)
- Window management
- glutCreateWindow(window_name)
- glutSetWindow(window_id)
3Eventi principali (cont.)
- Display event - per animazione
- glutPpostDisplay()
- Idle callback - es. di animazione
- glutIdleFunc(idle_callback)
- Menu events
- glutCreateMenu(menu_callback)
4Esempio completo programma di paint elementare
5/ Costanti /
define NULL 0 define LINE 1 define RECTANGLE
2 define TRIANGLE 3 define POINTS 4 define
TEXT 5 / libreria di interfaccia col window
manager / include ltGL/glut.hgt
6/ callback principali / void mouse(int, int,
int, int) void key(unsigned char, int,
int) void display(void) void drawSquare(int,
int) void myReshape(GLsizei, GLsizei) void
myinit(void) void screen_box(int, int,
int) void right_menu(int) void
middle_menu(int) void color_menu(int) void
pixel_menu(int) void fill_menu(int) int
pick(int, int)
7/ variabili globali / GLsizei wh 500, ww
500 / dimensione window/ GLfloat size
3.0 / semilato del quadrato / int
draw_mode 0 / modalità disegno
/ int rx, ry /coordinate pixel
(SC)/ GLfloat r 1.0, g 1.0, b 1.0/
colore del disegno / int fill 0 / flag
per fillling/
8/ main / int main(int argc, char argv)
int c_menu, p_menu, f_menu
glutInit(argc,argv) glutInitDisplayMode
(GLUT_SINGLE GLUT_RGB) glutInitWindowSize(5
00, 500) glutCreateWindow("square")
glutDisplayFunc(display)
9/ creazione Menu pop-up gerarchico /
c_menu glutCreateMenu(color_menu)
glutAddMenuEntry("Red",1)
glutAddMenuEntry("Green",2)
glutAddMenuEntry("Blue",3)
glutAddMenuEntry("Cyan",4)
glutAddMenuEntry("Magenta",5)
glutAddMenuEntry("Yellow",6)
glutAddMenuEntry("White",7)
glutAddMenuEntry("Black",8) p_menu
glutCreateMenu(pixel_menu)
glutAddMenuEntry("increase pixel size", 1)
glutAddMenuEntry("decrease pixel size", 2)
f_menu glutCreateMenu(fill_menu)
glutAddMenuEntry("fill on", 1)
glutAddMenuEntry("fill off", 2) glutCreateMenu(r
ight_menu) glutAddMenuEntry("quit",1)
glutAddMenuEntry("clear",2) glutAttachMenu(GLUT
_RIGHT_BUTTON) glutCreateMenu(middle_menu)
glutAddSubMenu("Colors", c_menu)
glutAddSubMenu("Pixel Size", p_menu)
glutAddSubMenu("Fill", f_menu)
glutAttachMenu(GLUT_MIDDLE_BUTTON)
10 myinit () glutReshapeFunc (myReshape)
glutKeyboardFunc(key) glutMouseFunc
(mouse) glutMainLoop() / fine main /
11/ callback per la modifica della window/ void
myReshape(GLsizei w, GLsizei h) / ridefinisci
clipping box / glMatrixMode(GL_PROJECTION)
glLoadIdentity() glOrtho(0.0,(GLdouble)w
, 0.0,(GLdouble)h, -1.0, 1.0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity() / ridefinisci viewport
pulisci spazio / glViewport(0,0,w,h)
glClearColor (0.8, 0.8, 0.8, 1.0)
glClear(GL_COLOR_BUFFER_BIT) display()
glFlush() / assegna estremi WC per il
disegno / ww w wh h
12void myinit(void) glViewport(0,0,ww,wh) glMa
trixMode(GL_PROJECTION) glLoadIdentity()
glOrtho(0.0,(GLdouble)ww,0.0,(GLdouble)wh,-1.0,1
.0) / colore di sfondo grigio chiaro clear
window / glClearColor (0.8, 0.8, 0.8,
1.0) glClear(GL_COLOR_BUFFER_BIT)
glFlush()
13/ disegno di un quadrato / void drawSquare(int
x, int y) ywh-y glColor3ub(
(char) random()256, (char) random()256,
(char) random()256)
glBegin(GL_POLYGON)
glVertex2f(xsize, ysize)
glVertex2f(x-size, ysize)
glVertex2f(x-size, y-size)
glVertex2f(xsize, y-size) glEnd()
14/ callback per disegnare bottoni e icone di
scelta / void display(void) int shift0
glPushAttrib(GL_ALL_ATTRIB_BITS)
glClearColor (0.8, 0.8, 0.8, 1.0)
glClear(GL_COLOR_BUFFER_BIT)
15Menu di scelta delloggetto da tracciare
Disegnamo prima i bottoni, poi le icone che
rappresentano i possibili oggetti
/ disegna bottoni colorati / glColor3f(1.0,
1.0, 1.0) screen_box(0,wh-ww/10,ww/10)
glColor3f(1.0, 0.0, 0.0) screen_box(ww/10,wh-
ww/10,ww/10) glColor3f(0.0, 1.0, 0.0)
screen_box(ww/5,wh-ww/10,ww/10)
glColor3f(0.0, 0.0, 1.0) screen_box(3ww/10,w
h-ww/10,ww/10) glColor3f(1.0, 1.0, 0.0)
screen_box(2ww/5,wh-ww/10,ww/10)
glColor3f(0.0, 0.0, 0.0) screen_box(ww/10ww/
40,wh-ww/10ww/40,ww/20)
16/ disegna icone / glBegin(GL_LINES)
glVertex2i(wh/40,wh-ww/20)
glVertex2i(wh/40ww/20,wh-ww/20) glEnd()
glBegin(GL_TRIANGLES)
glVertex2i(ww/5ww/40,wh-ww/10ww/40)
glVertex2i(ww/5ww/20,wh-ww/40)
glVertex2i(ww/53ww/40,wh-ww/10ww/40)
glEnd() glPointSize(3.0)
glBegin(GL_POINTS) glVertex2i(3ww/10ww/2
0, wh-ww/20) glEnd()
17/ disegna caratteri per icona selezione testo
/ glRasterPos2i(2ww/5,wh-ww/20) glutBitmapCha
racter(GLUT_BITMAP_9_BY_15, 'A') shiftglutBitma
pWidth(GLUT_BITMAP_9_BY_15, 'A') glRasterPos2i(2
ww/5shift,wh-ww/20) glutBitmapCharacter(GLUT_B
ITMAP_9_BY_15, 'B') shiftglutBitmapWidth(GLUT_
BITMAP_9_BY_15, 'B') glRasterPos2i(2ww/5shift,
wh-ww/20) glutBitmapCharacter(GLUT_BITMAP_9_BY_1
5, 'C') glFlush() glPopAttrib() /
fine display /
18/ callback gestione mouse/ void mouse(int btn,
int state, int x, int y) static int count
int where static int xp2,yp2
if(btnGLUT_LEFT_BUTTON stateGLUT_DOWN)
glPushAttrib(GL_ALL_ATTRIB_BITS) /
scelta sul menu di icone / where
pick(x,y) glColor3f(r, g, b)
if(where ! 0) count 0
draw_mode where else
switch(draw_mode)
19 case(LINE) if(count0)
count
xp0 x yp0 y
else
glBegin(GL_LINES)
glVertex2i(x,wh-y)
glVertex2i(xp0,wh-yp0)
glEnd() draw_mode0
count0 break
20 case(RECTANGLE) if(count 0)
count xp0
x yp0 y
else if(fill)
glBegin(GL_POLYGON) else
glBegin(GL_LINE_LOOP)
glVertex2i(x,wh-y)
glVertex2i(x,wh-yp0)
glVertex2i(xp0,wh-yp0)
glVertex2i(xp0,wh-y) glEnd()
draw_mode0 count0
break
21 case (TRIANGLE) switch(count)
case(0) count
xp0 x yp0 y
break case(1)
count xp1 x
yp1 y break
case(2) if(fill)
glBegin(GL_POLYGON) else
glBegin(GL_LINE_LOOP)
glVertex2i(xp0,wh-yp0)
glVertex2i(xp1,wh-yp1)
glVertex2i(x,wh-y) glEnd()
draw_mode0 count0
break
22 case(POINTS)
drawSquare(x,y) count
break case(TEXT) rxx
rywh-y glRasterPos2i(rx,ry)
count0 / fine mouse call back
/
23/ rilevazione della scelta nel menu di
bottoni/ int pick(int x, int y) y wh -
y if(y lt wh-ww/10) return 0 else if(x lt
ww/10) return LINE else if(x lt ww/5) return
RECTANGLE else if(x lt 3ww/10) return
TRIANGLE else if(x lt 2ww/5) return POINTS
else if(x lt ww/2) return TEXT else return
0
24/ creazione bottoni per icone di scelta / void
screen_box(int x, int y, int s )
glBegin(GL_QUADS) glVertex2i(x, y)
glVertex2i(xs, y) glVertex2i(xs, ys)
glVertex2i(x, ys) glEnd()
25/ callback per i menu pop-up / void
right_menu(int id) / attivato dal
bottone destro del mouse / if(id 1)
exit() else display() void
middle_menu(int id) / attivato dal
bottone intermedio del mouse /
26 void color_menu(int id) / sub-menu del tasto
medio / if(id 1) r 1.0 g 0.0 b
0.0 else if(id 2) r 0.0 g 1.0 b
0.0 else if(id 3) r 0.0 g 0.0 b
1.0 else if(id 4) r 0.0 g 1.0 b
1.0 else if(id 5) r 1.0 g 0.0 b
1.0 else if(id 6) r 1.0 g 1.0 b
0.0 else if(id 7) r 1.0 g 1.0 b
1.0 else if(id 8) r 0.0 g 0.0 b
0.0
27void pixel_menu(int id) / sub-menu del tasto
medio / if (id 1) size 2 size
else if (size gt 1) size size/2 void
fill_menu(int id) / sub-menu del tasto medio
/ if (id 1) fill 1 else fill
0
28/ callback per gestione tastiera / void
key(unsigned char k, int xx, int yy)
if(draw_mode!TEXT) return glColor3f(0.0,0.0,0.0
) glRasterPos2i(rx,ry) glutBitmapCharacter
(GLUT_BITMAP_9_BY_15, k) /glutStrokeCharacter(G
LUT_STROKE_ROMAN,i) / rxglutBitmapWidth(GLU
T_BITMAP_9_BY_15,k)