Sistemas de Interfaces
com o Usuário
e
Glut/OpenGL
Objetos de comuns interface
Modelo de Programação
Toolkit de
Interface
(GLUT,
SDK, ... )
Dispositivos
Usuário
Sistema
Gráfico
(OpenGL,
Direct3D, ...)
Computador
Programa
GráficoInterativo
Programação Convencional
Programação
Convencional
Os comandos
são
executados
segundo uma
ordem préestabelecida e
seqüêncial.
inicio
captura
dados
processa
dados
fim
Eventos típicos (WIMP)
KeyPress
KeyRelease
ButtonPress
ButtonRelease
Motion
LeaveNotify
EnterNotify
WindowExposure
Resize
Timer
Idle
Janela A
Janela B
Janela C
Modelo de Call Backs
Processa Evento
Tipo 1
Eventos
Examina eventos,
chama os módulos
de processamento
Motif
Visual Basic
Glut
IUP
...
Processa Evento
Tipo 2
Processa Evento
Tipo 3
Programa de
Aplicação
Visual Basic
Ponteiro para Função em C

Na linguagem C você pode criar e
manipular ponteiros para funções.
– Isso permite escolher qual função a ser usada
em tempo de execução.
– O ponteiro para uma função pode ser passado
como parâmetro para outra função.
Exemplo 1 de Function Pointer
int func1(int arg)
{
return(2 * arg);
}
int func2(int arg)
{
return(10 * arg);
}
void func3(int (*func_ptr)(int))
{
int i = 10, j;
j = func_ptr(i);
printf("\n%d",j);
}
void main(void)
{
func3(func1);
func3(func2);
}
Exemplo 2 (QuickSort)
void qsort (void* base, int nel, int width, int (*CPtr)(void*, void*));
Para comparar caracteres, deve ser criada uma função de comparação:
int CmpChar ( char* a, char* b)
{
if ( *a == *b )
return 0;
else
return ( *a > *b ? 1 : -1 );
}
int (*CmpPtr)(); // declare a function pointer
CmpPtr = CmpChar; // initialize it
qsort ( buffer, 32, sizeof(char), CmpPtr );
Exemplo 3 (CallBack IUP)
typedef int (*Icallback)(Ihandle *, ...);
Icallback IupSetFunction (char *ação, Icallback função) ;
static int iup_CbFechaTodos( void );
static int iup_CbAbreTodos( void );
static int iup_CbMousePress (Ihandle* self,int botao,int
estado,int x,int y,char* r);
static int iup_CbMouseMove(Ihandle *self, int x, int y, char*r);
static int iup_CbMouseEnter (Ihandle *self);
IupSetFunction("cb_FechaTodos", (Icallback) iup_CbFechaTodos);
IupSetFunction("cb_AbreTodos", (Icallback) iup_CbAbreTodos);
IupSetFunction("cb_MousePress", (Icallback) iup_CbMousePress);
IupSetFunction("cb_MouseMove", (Icallback) iup_CbMouseMove);
IupSetFunction("cb_MouseEnter", (Icallback) iup_CbMouseEnter);
OpenGL/GLUT
#include <glut.h>
#include <image.h>
/* Variaveis globais */
typedef struct window_impl { int width; int height;} Window;
Window window;
IMAGE pic;
int main(int argc, char **argv) {
pic = imgReadBMP(filename);
imgGetDimensions(pic, &window.width, &window.height);
/* GLUT - Initialization */
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(window.width, window.height);
glutCreateWindow("CG2001-T1");
/* Registrando callbacks */
glutDisplayFunc(displayCall);
glutReshapeFunc(reshapeCall);
glutMouseFunc(mouseCall);
glutMotionFunc(motionCall);
glutKeyboardFunc(keyboardCall);
glutIdleFunc(idleCall);
/* GLUT main loop */
glutMainLoop();
return 0;
}
Exemplo simples da GLUT
void displayCall(void) {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
imgDraw(pic);
glFlush();
glutSwapBuffers();
}
void reshapeCall(int width, int height) {
glViewport(0, 0, (GLsizei)width, (GLsizei)height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D (0.0, (GLsizei)width, 0.0, (GLsizei)height);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
window.width = width;
window.height = height;
}
Download

Interfaces Gráficas