#include #include #include #include #include "dg.h" #include "listobj.h" #include "app.h" struct POINT { int x,y; POINT( int x1 = 10, int y1= 10 ) { x=x1; y=y1; }; }; // // Class ObjGraf - Imovel usado para Botoes // class Canvas; class ObjGraf : public Obj { public: virtual void click1(int, int, Canvas *cvAtivo) {};// Tratadores de Evento virtual void unclick1(int, int, Canvas *cvAtivo){};// de cada Objeto Grafico virtual void click2(int, int, Canvas *cvAtivo) {}; virtual void unclick2(int, int, Canvas *cvAtivo){}; virtual void move(int, int, Canvas *cvAtivo) {}; virtual void draw(void) = 0; // Obgriga a definicao das virtual int pick(int, int) = 0; // Funcoes comuns de Todos // os Objetos Graficos }; // // Class Canvas // class Canvas : public List { DgColor cor; ObjGraf *objGrafGrabbed; // Objeto Grafico bloqueado para receber Eventos ObjGraf *find(int, int); public: Canvas( DgColor c=dgLIGHT_GRAY ) { cor = c; objGrafGrabbed = NULL; } void grab( ObjGraf *objGraf) { objGrafGrabbed = objGraf; } void draw(void); void redrawAll(void); void click1(int x, int y); void unclick1(int x, int y); void move(int x, int y); void insert(Obj*o) { List::insert(o); ((ObjGraf*)o)->draw(); } }; void Canvas::draw( void ) { dgSetColor(cor); dgFill(0,0,dgWidth(),dgHeight()); } void Canvas::redrawAll( void ) { ListIter *it = new ListIter( this ); draw(); it->last(); while( ! it->end() ) { ((ObjGraf *)(it->prev()))->draw(); } } ObjGraf* Canvas::find( int x, int y ) { ListIter *it = new ListIter( this ); ObjGraf *objGraf; it->first(); while( ! it->end() ) { objGraf = (ObjGraf *)(it->next()); if( objGraf->pick(x,y) ) return( objGraf ); } return NULL; } void Canvas :: click1(int x, int y) { if( ! objGrafGrabbed ) { ObjGraf *objGraf = find(x,y); if( objGraf ) objGraf->click1(x, y, this); } else { objGrafGrabbed->click1(x, y, this); } } void Canvas :: unclick1(int x, int y) { if( ! objGrafGrabbed ) { ObjGraf *objGraf = find(x,y); if( objGraf ) objGraf->unclick1(x, y, this); } else { objGrafGrabbed->unclick1(x, y, this); } } void Canvas :: move(int x, int y) { if( ! objGrafGrabbed ) { ObjGraf *objGraf = find(x,y); if( objGraf ) objGraf->move(x, y, this); } else { objGrafGrabbed->move(x, y, this); } } // // Class Botao // class Botao : public ObjGraf { DgColor cor; POINT p1,p2; // Extremos do Rectangulo public: Botao(POINT x, POINT y, DgColor c) { p1=x; p2=y; cor=c; }; virtual void click1(int x, int y, Canvas *cvAtivo) { action(cvAtivo); }; virtual void draw(void); virtual int pick(int x, int y); virtual void action(Canvas *) = 0; }; void Botao :: draw(void) { dgSetColor(dgYELLOW); dgSetMode(dgCOPY); dgFill(p1.x,p1.y,p2.x,p2.y); dgSetColor(cor); dgFill(p1.x+1,p1.y+1,p2.x-1,p2.y-1); } int Botao :: pick(int x, int y) { if( (x >= p1.x) && (x <= p2.x ) && (y >= p1.y) && (y <= p2.y ) ) return 1; else return 0; } // // Class BotaoOK // class BotaoOK : public Botao { public: BotaoOK(POINT x, POINT y, DgColor c=dgLIGHT_CIAN) :Botao(x, y, c) {}; virtual void action(Canvas *); }; void BotaoOK :: action(Canvas *cvAtivo) { printf( "\n\n Botao OK selecionado !!! "); } // // Class BotaoCANCEL // class BotaoCANCEL : public Botao { public: BotaoCANCEL(POINT x, POINT y, DgColor c=dgLIGHT_CIAN) :Botao(x, y, c) {}; virtual void action(Canvas *); }; void BotaoCANCEL :: action(Canvas *cvAtivo) { printf( "\n\n Botao CANCEL selecionado !!! "); } // // Class ObjGrafM - Moveis usado para Retangulos, Triangulos, etc. // class ObjGrafM : public ObjGraf { int arraste; int xAnt, yAnt; public: ObjGrafM() { arraste=0; } virtual void click1(int x, int y, Canvas *cvAtivo) { arraste = 1; dgSetMode(dgXOR); draft(); xAnt=x; yAnt=y; cvAtivo->grab(this); // Bloqueia o Objeto Grafico }; virtual void unclick1(int x, int y, Canvas *cvAtivo ) { arraste = 0; moveObj(x-xAnt, y-yAnt); draft(); dgSetMode(dgCOPY); cvAtivo->grab(NULL); // DesBloqueia o Objeto Grafico cvAtivo->redrawAll(); }; virtual void move(int x, int y, Canvas *cvAtivo) { if( arraste ) { draft(); moveObj(x-xAnt, y-yAnt); xAnt= x; yAnt=y; draft(); } }; virtual void moveObj(int, int) = 0; // Obriga a Redefinicao de move virtual void draft() { draw(); } }; // // Rectangle // class Rectangle : public ObjGrafM { DgColor cor; POINT p1,p2; // Extremos do Rectangulo public: Rectangle(POINT x, POINT y, DgColor c=dgRED) { p1=x; p2=y; cor=c; }; void draw(void); void draft(void); int pick(int x, int y); void moveObj(int x, int y); }; void Rectangle :: draw(void) { dgSetColor(cor); dgFill(p1.x,p1.y,p2.x,p2.y); } void Rectangle :: draft(void) { dgSetColor(cor); dgRectangle(p1.x,p1.y,p2.x,p2.y); } int Rectangle :: pick(int x, int y) { if( (x >= p1.x) && (x <= p2.x ) && (y >= p1.y) && (y <= p2.y ) ) return 1; else return 0; } void Rectangle :: moveObj(int dx, int dy) { p1.x += dx; p1.y += dy; p2.x += dx; p2.y += dy; } // // Triangle // class Triangle : public ObjGrafM { DgColor cor; POINT p1,p2,p3; // Extremos do Triangulo public: Triangle(POINT x, POINT y, POINT z, DgColor c=dgRED) {p1=x; p2=y; p3=z; cor=c;}; void draw(void); void draft(void); int pick(int x, int y); void moveObj(int x, int y); }; void Triangle :: draw(void) { dgSetColor(cor); dgBeginPoly(); dgPolyPoint(p1.x, p1.y); dgPolyPoint(p2.x, p2.y); dgPolyPoint(p3.x, p3.y); dgEndPoly(dgFILL); } void Triangle :: draft(void) { dgSetColor(cor); dgBeginPoly(); dgPolyPoint(p1.x, p1.y); dgPolyPoint(p2.x, p2.y); dgPolyPoint(p3.x, p3.y); dgEndPoly(dgCLOSED); } int Triangle :: pick(int x, int y) { int s =p1.x*p2.y-p2.x*p1.y+p2.x*p3.y-p3.x*p2.y+p3.x*p1.y-p1.x*p3.y, lamb1= x*p2.y-p2.x* y+p2.x*p3.y-p3.x*p2.y+p3.x* y- x*p3.y, lamb2=p1.x* y- x*p1.y+ x*p3.y-p3.x* y+p3.x*p1.y-p1.x*p3.y, lamb3=p1.x*p2.y-p2.x*p1.y+p2.x* y- x*p2.y+ x*p1.y-p1.x* y; if( s > 0 ) if( (lamb1>0) && (lamb2>0) && (lamb3>0) ) // Coordenadas Baricentricas return 1; else return 0; else if( (lamb1<0) && (lamb2<0) && (lamb3<0) ) // Coordenadas Baricentricas return 1; else return 0; } void Triangle :: moveObj(int dx, int dy) { p1.x += dx; p1.y += dy; p2.x += dx; p2.y += dy; p3.x += dx; p3.y += dy; } // // Class MyApp // class MyApp : public Application { public: Canvas cvAtivo; MyApp() { dgOpen(); cvAtivo.draw(); BotaoOK bOK( POINT(10, 10), POINT(30, 30) ); cvAtivo.insert( &bOK ); BotaoCANCEL bCANCEL( POINT(10, 40), POINT(30, 60) ); cvAtivo.insert( &bCANCEL ); Rectangle r(POINT(100,100), POINT(120,150)); cvAtivo.insert( &r ); Triangle t(POINT(200,200), POINT(220,250), POINT(300,300)); cvAtivo.insert( &t ); loop(); }; void preLoop(void); void posLoop(void); // // Redespacha Tratamento de Eventos para o Canvas Ativo // void click1(int x, int y) { cvAtivo.click1(x, y); } void unclick1(int x, int y) { cvAtivo.unclick1(x, y); } void click2(int x, int y) { setFimLoop(); } void unclick2(int x, int y) { }; void move(int x, int y) { cvAtivo.move(x, y); } }; void MyApp :: preLoop(void) { } void MyApp :: posLoop(void) { dgClose(); } // // Aplicacao // MyApp myApp; // Observe que nao eh preciso o main void main() { }