#include#include using namespace std; using namespace graph; char *gyd = "GYD's Drawing Board"; int i=1,Func=1,width=2,tx=0,ty=0; unsigned long color=BLACK; bool isFill=0,isSolid=1; double s=1,cx,cy; int g_imgID=-1; class Command { public: int Func; Command *next; Command *last; }; class OrderList { public: Command *head; Command *tail; OrderList():head(0),tail(0){} ~OrderList() { tail=0; while(head!=0) { Command *t=head; head=head->next; delete t; } } void backInsert() { Command *t=new Command(); if(head==0&&tail==0) { head=t; tail=t; tail->next=0; tail->last=0; tail->Func=Func; } else { tail->next=t; t->last=tail; tail=t; tail->next=0; tail->Func=Func; } } void tailDelete() { if(tail!=0) { if(tail->last==0) { delete tail; tail=0; head=0; } else { Command *t; t=tail; tail=tail->last; tail->next=0; delete t; } } } }; class CShape //包含图形的基本信息,但不包括坐标信息 { public: unsigned long color=BLACK; //图形颜色 int width=2; //图形线宽 bool isFill=0; //图形是否填充 bool isSolid=1; //图形边界虚实 CShape(){} ~CShape(){} }; class CurveData :public CShape { public: double x,y; int i; CurveData(){} ~CurveData(){} }; class LineData :public CShape { public: double x0,y0,x1,y1; LineData(){} ~LineData(){} }; class RectangleData :public CShape { public: double x0,y0,x1,y1; RectangleData(){} ~RectangleData(){} }; class TriangleData :public CShape { public: double x0,y0,x1,y1,x2,y2; TriangleData(){} ~TriangleData(){} }; class CircleData :public CShape { public: double x0,y0,x1,y1; CircleData(){} ~CircleData(){} }; class ELlipseData :public CShape { public: double x0,y0,x1,y1; ELlipseData(){} ~ELlipseData(){} }; class CurveNode { public: CurveData data; CurveNode *next; CurveNode *last; CurveNode(){} ~CurveNode(){} }; class LineNode { public: LineData data; LineNode *next; LineNode *last; LineNode(){} ~LineNode(){} }; class RectangleNode { public: RectangleData data; RectangleNode *next; RectangleNode *last; RectangleNode(){} ~RectangleNode(){} }; class TriangleNode { public: TriangleData data; TriangleNode *next; TriangleNode *last; TriangleNode(){} ~TriangleNode(){} }; class CircleNode { public: CircleData data; CircleNode *next; CircleNode *last; CircleNode(){} ~CircleNode(){} }; class EllipseNode { public: ELlipseData data; EllipseNode *next; EllipseNode *last; EllipseNode(){} ~EllipseNode(){} }; class CurveList { public: CurveNode *head; CurveNode *tail; CurveList():head(0),tail(0){} ~CurveList() { tail=0; while(head!=0) { CurveNode *t=head; head=head->next; delete t; } } void backInsert() { CurveNode *t=new CurveNode(); if(head==0&&tail==0) { head=t; tail=t; tail->next=0; tail->last=0; } else { tail->next=t; t->last=tail; tail=t; tail->next=0; } } void tailDelete() { if(tail!=0) { if(tail->last==0) { delete tail; tail=0; head=0; } else { CurveNode *t; t=tail; tail=tail->last; tail->next=0; delete t; } } } }; class LineList { public: LineNode *head; LineNode *tail; LineList():head(0),tail(0){} ~LineList() { tail=0; while(head!=0) { LineNode *t=head; head=head->next; delete t; } } void backInsert() { LineNode *t=new LineNode(); if(head==0&&tail==0) { head=t; tail=t; tail->next=0; tail->last=0; } else { tail->next=t; t->last=tail; tail=t; tail->next=0; } } void tailDelete() { if(tail!=0) { if(tail->last==0) { delete tail; tail=0; head=0; } else { LineNode *t; t=tail; tail=tail->last; tail->next=0; delete t; } } } }; class RectangleList { public: RectangleNode *head; RectangleNode *tail; RectangleList():head(0),tail(0){} ~RectangleList() { tail=0; while(head!=0) { RectangleNode *t=head; head=head->next; delete t; } } void backInsert() { RectangleNode *t=new RectangleNode(); if(head==0&&tail==0) { head=t; tail=t; tail->next=0; tail->last=0; } else { tail->next=t; t->last=tail; tail=t; tail->next=0; } } void tailDelete() { if(tail!=0) { if(tail->last==0) { delete tail; tail=0; head=0; } else { RectangleNode *t; t=tail; tail=tail->last; tail->next=0; delete t; } } } }; class TriangleList { public: TriangleNode *head; TriangleNode *tail; TriangleList():head(0),tail(0){} ~TriangleList() { tail=0; while(head!=0) { TriangleNode *t=head; head=head->next; delete t; } } void backInsert() { TriangleNode *t=new TriangleNode(); if(head==0&&tail==0) { head=t; tail=t; tail->next=0; tail->last=0; } else { tail->next=t; t->last=tail; tail=t; tail->next=0; } } void tailDelete() { if(tail!=0) { if(tail->last==0) { delete tail; tail=0; head=0; } else { TriangleNode *t; t=tail; tail=tail->last; tail->next=0; delete t; } } } }; class CircleList { public: CircleNode *head; CircleNode *tail; CircleList():head(0),tail(0){} ~CircleList() { tail=0; while(head!=0) { CircleNode *t=head; head=head->next; delete t; } } void backInsert() { CircleNode *t=new CircleNode(); if(head==0&&tail==0) { head=t; tail=t; tail->next=0; tail->last=0; } else { tail->next=t; t->last=tail; tail=t; tail->next=0; } } void tailDelete() { if(tail!=0) { if(tail->last==0) { delete tail; tail=0; head=0; } else { CircleNode *t; t=tail; tail=tail->last; tail->next=0; delete t; } } } }; class EllipseList { public: EllipseNode *head; EllipseNode *tail; EllipseList():head(0),tail(0){} ~EllipseList() { tail=0; while(head!=0) { EllipseNode *t=head; head=head->next; delete t; } } void backInsert() { EllipseNode *t=new EllipseNode(); if(head==0&&tail==0) { head=t; tail=t; tail->next=0; tail->last=0; } else { tail->next=t; t->last=tail; tail=t; tail->next=0; } } void tailDelete() { if(tail!=0) { if(tail->last==0) { delete tail; tail=0; head=0; } else { EllipseNode *t; t=tail; tail=tail->last; tail->next=0; delete t; } } } }; //储存图形,画图顺序的链表 CurveList cu; LineList l; RectangleList r; TriangleList t; CircleList ci; EllipseList e; OrderList o; void display() { int winx=getWinWidth(),winy=getWinHeight(); setColor(GREY); fillRectangle(0,0,51,winy); fillRectangle(winx-51,0,winx,winy); setColor(BLACK); setLineWidth(3); setSolidLines(); for(int i=1;i<9;i++) rectangle(0,winy-50*i,0+50,winy-50*i+50); for(int i=10;i<14;i++) rectangle(0,winy-50*i,0+50,winy-50*i+50); for(int i=1;i<9;i++) rectangle(winx-50,winy-50*i,winx,winy-50*i+50); rectangle(20,winy-10,30,winy-35); fillTriangle(19,winy-35,31,winy-35,25,winy-44); line(10,winy-90,40,winy-60); rectangle(10,winy-140,40,winy-110); triangle(10,winy-190,25,winy-160,40,winy-190); circle(25,winy-225,15); ellipse(25,winy-275,15,10); arrowLine(40,winy-475,10,winy-475,8.0,10.0); putText(5,winy-526,"Save"); putText(3,winy-576,"Clear"); putText(4,winy-626,"Open"); setColor(BLACK); fillRectangle(winx-40,winy-40,winx-10,winy-10); setColor(RED); fillRectangle(winx-40,winy-90,winx-10,winy-60); setColor(GREEN); fillRectangle(winx-40,winy-140,winx-10,winy-110); setColor(BLUE); fillRectangle(winx-40,winy-190,winx-10,winy-160); setColor(PURPLE); fillRectangle(winx-40,winy-240,winx-10,winy-210); setColor(YELLOW); fillRectangle(winx-40,winy-290,winx-10,winy-260); setColor(ORANGE); fillRectangle(winx-40,winy-340,winx-10,winy-310); setColor(BROWN); fillRectangle(winx-40,winy-390,winx-10,winy-360); setColor(BLACK); setDottedLines(); if(Func) rectangle(3,winy-50*Func+3,47,winy-50*Func+50-3); switch(color) { case BLACK: rectangle(winx-47,winy-50+3,winx-3,winy-3); break; case RED: rectangle(winx-47,winy-100+3,winx-3,winy-50-3); break; case GREEN: rectangle(winx-47,winy-150+3,winx-3,winy-100-3); break; case BLUE: rectangle(winx-47,winy-200+3,winx-3,winy-150-3); break; case PURPLE: rectangle(winx-47,winy-250+3,winx-3,winy-200-3); break; case YELLOW: rectangle(winx-47,winy-300+3,winx-3,winy-250-3); break; case ORANGE: rectangle(winx-47,winy-350+3,winx-3,winy-300-3); break; case BROWN: rectangle(winx-47,winy-400+3,winx-3,winy-350-3); break; } setSolidLines(); if(isFill==0){rectangle(10,winy-365,40,winy-385);} else{fillRectangle(10,winy-365,40,winy-385);} if(isSolid==1){setSolidLines();} else{setDottedLines();} line(10,winy-325,40,winy-325); line(10,winy-315,40,winy-315); line(10,winy-335,40,winy-335); //绘图 Command *h=o.head;CurveNode *h1=cu.head;LineNode *h2=l.head;RectangleNode *h3=r.head; TriangleNode *h4=t.head;CircleNode *h5=ci.head;EllipseNode *h6=e.head; while(h) { if(h1!=0&&h->Func==1) { setColor(h1->data.color); setLineWidth(h1->data.width); setSolidLines(); while(h1->data.i==2&&h1->next!=0) { line((h1->data.x+tx)*s,(h1->data.y+ty)*s,(h1->next->data.x+tx)*s,(h1->next->data.y+ty)*s); h1=h1->next; } if(h1!=0) h1=h1->next; } else if(h2!=0&&h->Func==2) { setColor(h2->data.color); setLineWidth(h2->data.width); if(h2->data.isSolid==0){setDottedLines();} else {setSolidLines(); } line((h2->data.x0+tx)*s,(h2->data.y0+ty)*s,(h2->data.x1+tx)*s,(h2->data.y1+ty)*s); h2=h2->next; } else if(h3!=0&&h->Func==3) { setColor(h3->data.color); setLineWidth(h3->data.width); if(h3->data.isSolid==0){setDottedLines();} else {setSolidLines(); } if(h3->data.isFill==0) rectangle((h3->data.x0+tx)*s,(h3->data.y0+ty)*s,(h3->data.x1+tx)*s,(h3->data.y1+ty)*s); else fillRectangle((h3->data.x0+tx)*s,(h3->data.y0+ty)*s,(h3->data.x1+tx)*s,(h3->data.y1+ty)*s); h3=h3->next; } else if(h4!=0&&h->Func==4) { setColor(h4->data.color); setLineWidth(h4->data.width); if(h4->data.isSolid==0){setDottedLines();} else {setSolidLines(); } if(h4->data.isFill==0) triangle((h4->data.x0+tx)*s,(h4->data.y0+ty)*s,(h4->data.x1+tx)*s,(h4->data.y1+ty)*s,(h4->data.x2+tx)*s,(h4->data.y2+ty)*s); else fillTriangle((h4->data.x0+tx)*s,(h4->data.y0+ty)*s,(h4->data.x1+tx)*s,(h4->data.y1+ty)*s,(h4->data.x2+tx)*s,(h4->data.y2+ty)*s); h4=h4->next; } else if(h5!=0&&h->Func==5) { double cirx,ciry; double circler; cirx=(h5->data.x0+h5->data.x1)/2; ciry=(h5->data.y0+h5->data.y1)/2; circler=sqrt(((h5->data.x0-h5->data.x1)*(h5->data.x0-h5->data.x1)+(h5->data.y0-h5->data.y1)*(h5->data.y0-h5->data.y1))/4); setColor(h5->data.color); setLineWidth(h5->data.width); if(h5->data.isSolid==0){setDottedLines();} else {setSolidLines(); } if(h5->data.isFill==0) circle((cirx+tx)*s,(ciry+ty)*s,circler*s); else fillCircle((cirx+tx)*s,(ciry+ty)*s,circler*s); h5=h5->next; } else if(h6!=0&&h->Func==6) { double cirx,ciry,cirxx,ciryy; cirx=(h6->data.x0+h6->data.x1)/2; ciry=h6->data.y0; cirxx=(h6->data.x0-h6->data.x1)/2; ciryy=h6->data.y0-h6->data.y1; setColor(h6->data.color); setLineWidth(h6->data.width); if(h6->data.isSolid==0){setDottedLines();} else {setSolidLines(); } if(h6->data.isFill==0) ellipse((cirx+tx)*s,(ciry+ty)*s,cirxx*s,ciryy*s); else fillEllipse((cirx+tx)*s,(ciry+ty)*s,cirxx*s,ciryy*s); h6=h6->next; } h=h->next; } } void mouseMove(int x,int y) { cx=x/s-tx; cy=y/s-ty; int winx=getWinWidth(); if(x>51&&x if(Func==1) { if(i==2) { cu.backInsert(); cu.tail->data.color=color; cu.tail->data.width=width; cu.tail->data.x=cx; cu.tail->data.y=cy; cu.tail->data.i=2; } } else if(Func==2) { if(i==2) { l.tail->data.x1=cx; l.tail->data.y1=cy; } } else if(Func==3) { if(i==2) { r.tail->data.x1=cx; r.tail->data.y1=cy; } } else if(Func==4) { if(i==2&&isFill==0) { t.tail->data.x1=cx; t.tail->data.x2=cx; t.tail->data.y1=cy; t.tail->data.y2=cy; } else if(i==2&&isFill==1) { t.tail->data.x1=cx+1; t.tail->data.x2=cx; t.tail->data.y1=cy+1; t.tail->data.y2=cy; } else if(i==3) { t.tail->data.x2=cx; t.tail->data.y2=cy; } } else if(Func==5) { if(i==2) { ci.tail->data.x1=cx; ci.tail->data.y1=cy; } } else if(Func==6) { if(i==2) { e.tail->data.x1=cx; e.tail->data.y1=cy; } } } } void mousePress(int message,int x,int y) { int winx=getWinWidth(),winy=getWinHeight(); cx=x/s-tx; cy=y/s-ty; for(int i=1;i<9;i++) if(message==LEFT_BUTTON_DOWN&&x<50&&y>winy-50*i&&y winx-50&&y>winy-50) color=BLACK; else if(message==LEFT_BUTTON_DOWN&&x>winx-50&&y>winy-100&&y winx-50&&y>winy-150&&y winx-50&&y>winy-200&&y winx-50&&y>winy-250&&y winx-50&&y>winy-300&&y winx-50&&y>winy-350&&y winx-50&&y>winy-400&&y winy-400) { if(isFill==0) isFill=1; else isFill=0; }//填充 if(message==LEFT_BUTTON_DOWN&&x<50&&y winy-350) { if(isSolid==0) isSolid=1; else isSolid=0; }//实线 if(Func==1) { if(message==LEFT_BUTTON_DOWN&&x>55&&x o.backInsert(); cu.backInsert(); cu.tail->data.color=color; cu.tail->data.width=width; cu.tail->data.x=cx; cu.tail->data.y=cy; cu.tail->data.i=2; i=2; } else if(message==LEFT_BUTTON_DOWN&&x>55&&x cu.backInsert(); cu.tail->data.color=color; cu.tail->data.width=width; cu.tail->data.x=cx; cu.tail->data.y=cy; cu.tail->data.i=1; i=1; } } else if(Func==2) { if(message==LEFT_BUTTON_DOWN&&x>55&&x o.backInsert(); l.backInsert(); l.tail->data.color=color; l.tail->data.isFill=isFill; l.tail->data.isSolid=isSolid; l.tail->data.width=width; l.tail->data.x0=cx; l.tail->data.y0=cy; l.tail->data.x1=cx; l.tail->data.y1=cy; i=2; } else if(message==LEFT_BUTTON_DOWN&&x>55&&x l.tail->data.x1=cx; l.tail->data.y1=cy; i=1; } } else if(Func==3) { if(message==LEFT_BUTTON_DOWN&&x>55&&x o.backInsert(); r.backInsert(); r.tail->data.color=color; r.tail->data.isFill=isFill; r.tail->data.isSolid=isSolid; r.tail->data.width=width; r.tail->data.x0=cx; r.tail->data.y0=cy; r.tail->data.x1=cx; r.tail->data.y1=cy; i=2; } else if(message==LEFT_BUTTON_DOWN&&x>55&&x r.tail->data.x1=cx; r.tail->data.y1=cy; i=1; } } else if(Func==4) { if(message==LEFT_BUTTON_DOWN&&x>55&&x o.backInsert(); t.backInsert(); t.tail->data.color=color; t.tail->data.isFill=isFill; t.tail->data.isSolid=isSolid; t.tail->data.width=width; t.tail->data.x0=cx; t.tail->data.y0=cy; t.tail->data.x1=cx; t.tail->data.y1=cy; t.tail->data.x2=cx; t.tail->data.y2=cy; i=2; } else if(message==LEFT_BUTTON_DOWN&&x>55&&x t.tail->data.x1=cx; t.tail->data.y1=cy; t.tail->data.x2=cx; t.tail->data.y2=cy; i=3; } else if(message==LEFT_BUTTON_DOWN&&x>55&&x t.tail->data.x2=cx; t.tail->data.y2=cy; i=1; } } else if(Func==5) { if(message==LEFT_BUTTON_DOWN&&x>55&&x o.backInsert(); ci.backInsert(); ci.tail->data.color=color; ci.tail->data.isFill=isFill; ci.tail->data.isSolid=isSolid; ci.tail->data.width=width; ci.tail->data.x0=cx; ci.tail->data.y0=cy; ci.tail->data.x1=cx; ci.tail->data.y1=cy; i=2; } else if(message==LEFT_BUTTON_DOWN&&x>55&&x ci.tail->data.x1=cx; ci.tail->data.y1=cy; i=1; } } else if(Func==6) { if(message==LEFT_BUTTON_DOWN&&x>55&&x o.backInsert(); e.backInsert(); e.tail->data.color=color; e.tail->data.isFill=isFill; e.tail->data.isSolid=isSolid; e.tail->data.width=width; e.tail->data.x0=cx; e.tail->data.y0=cy; e.tail->data.x1=cx; e.tail->data.y1=cy; i=2; } else if(message==LEFT_BUTTON_DOWN&&x>55&&x e.tail->data.x1=cx; e.tail->data.y1=cy; i=1; } } //<- if(message==LEFT_BUTTON_DOWN&&x<50&&y winy-500) { o.tailDelete(); if(Func==1) while(cu.tail->last!=0&&cu.tail->last->data.i==2) cu.tailDelete(); else if(Func==2) l.tailDelete(); else if(Func==3) r.tailDelete(); else if(Func==4) t.tailDelete(); else if(Func==5) ci.tailDelete(); else if(Func==6) e.tailDelete(); } //Open if(LEFT_BUTTON_DOWN&&x<50&&y winy-650) { system("outres.bmp"); } //Save if(LEFT_BUTTON_DOWN&&x<50&&y winy-550) { char name[]="painting.bmp"; saveScreenImage(name); } //Clear if(LEFT_BUTTON_DOWN&&x<50&&y winy-600) { while(cu.tail!=0) cu.tailDelete(); while(l.tail!=0) l.tailDelete(); while(r.tail!=0) r.tailDelete(); while(t.tail!=0) t.tailDelete(); while(ci.tail!=0) ci.tailDelete(); while(e.tail!=0) e.tailDelete(); while(o.tail!=0) o.tailDelete(); } } void keyboard(unsigned char key) { if(key=='w'||key=='W') ty=ty+10; else if(key=='s'||key=='S') ty=ty-10; else if(key=='a'||key=='A') tx=tx-10; else if(key=='d'||key=='D') tx=tx+10; } void specialKeyboard(int key) { if(key==KEY_UP) s+=0.1; else if(key==KEY_DOWN) s-=0.1; } int main() { setWinTitle(gyd); initGraph(display,keyboard,mousePress,mouseMove,specialKeyboard); return 0; }
项目地址:https://gitee.com/alveus/CPP_Drawing_Board



