/* 作者:meteor135 Email:meteor@mail.biti.edu.cn smith_135@163.com 时间:2003.5.22 */ #include <stdio.h> #include <conio.h> #include <graphics.h> #include <bios.h> #include <dos.h> #define path "C://TC//BGI" //改为你自己的BGI路径 #include <stdlib.h> #include <string.h> #include <iostream.h> #include <math.h> #define Pi 3.1415926 #define RIGHT 77 #define LEFT 75 #define UP 72 #define DOWN 80 #define HIDE 'h' #define SHOW 's' #define ENLARGE '=' #define REDUCE 'b' #define Alt_X '-' enum bool { false, true }; int GetKey(); int prompt(); void window(int, int, int, int, int, int, int); // class Location { protected: int x0, y0; public: Location(int x, int y){x0=x;y0=y;} int GetX0(){return x0;} int GetY0(){return y0;} }; class Point:public Location { protected: bool isVisible; void Draw(); public: void Show(){putpixel(x0,y0,getcolor());} Point(int x, int y):Location(x,y){}; bool GetVisible(){return isVisible;} }; // class Figure : public Point { protected: int changeStep; virtual void Draw ()=0; public: Figure(int x, int y):Point(x, y){changeStep=10;} public: virtual void Show (); virtual void Left (); virtual void Up (); virtual void Down (); virtual void Hide (); virtual void Right (); public: virtual void Enlarge()=0; virtual void Reduce ()=0; }; void Figure::Hide() { unsigned color = getcolor(); isVisible = false; setcolor(getbkcolor()); Draw(); setcolor(color); } void Figure::Show() { setcolor(getcolor()); Draw(); isVisible=true; } void Figure::Up() { Hide(); (y0 -= changeStep) ? 0 : (y0 += 480); Draw(); } void Figure::Down() { Hide(); y0 = (y0 + changeStep) % 480; Draw(); } void Figure::Right() { Hide(); x0 = (x0 + changeStep) % 640; Draw(); } void Figure::Left() { Hide(); (x0 -= changeStep) ? 0 : (x0 += 640); Draw(); } // class Rectangle : public Figure { private: int width,height; void Draw() { int left,top,right,bottom; left = x0-width /2; top = y0-height/2; right = x0+width /2; bottom = y0+height/2; rectangle(left,top,right,bottom); } public: Rectangle(int x, int y, int w, int h):Figure(x,y) { width = w; height = h; } public: int GetWidth (){return width ;} int GetHeight(){return height;} void Enlarge(); void Reduce (); }; void Rectangle::Enlarge() { Hide(); width += changeStep; height += changeStep; Draw(); } void Rectangle::Reduce() { Hide(); width -= width >0&&height>0 ? changeStep : 0; height -= height>0&&height>0 ? changeStep : 0; Draw(); } // class Circle: public Figure { private: int radius; void Draw(){circle(x0, y0, radius);} public: Circle(int x, int y, int radius); int GetRadius(){return radius;} void Enlarge(); void Reduce (); }; Circle::Circle(int x, int y, int radius):Figure(x, y) { this->radius = radius; } void Circle::Enlarge() { Hide(); radius += changeStep; Draw(); } void Circle::Reduce() { Hide(); radius -= radius>0 ? changeStep : 0; Draw(); } / void main() { Figure *pFigure; int choice; while((choice=prompt())>0) { switch(choice) { case 1: pFigure = new Circle(320, 240, 100); break; case 2: pFigure = new Rectangle(200,200,300,200); break; default: pFigure = new Circle(320, 240, 100); } char s1[10], s2[10]; //char s3[15]; int key; int gdriver = DETECT, gmode; initgraph(&gdriver, &gmode, path); setbkcolor(LIGHTCYAN); cleardevice(); window(0, 0, getmaxx(), getmaxy(), 20, BLUE, LIGHTCYAN); settextstyle(1, 0, 1); setcolor(RED); outtextxy(20, 15, "Now you will see a figure and you can do something with it"); outtextxy(20, 33, "Press any key to continue!"); outtextxy(20, 57, "h:hide s:show =:enlarge b:reduce"); outtextxy(20, 75, " :right :left :up :down alt_x:quit"); setlinestyle(SOLID_LINE, 1, 3); line(26, 88, 40, 88); line(40, 88, 36, 84); line(40, 88, 36, 92); line(100, 88, 114, 88); line(100, 88, 104, 84); line(100, 88, 104, 92); line(214, 82, 214, 95); line(214, 95, 210, 91); line(214, 95, 218, 91); line(166, 82, 166, 95); line(166, 82, 162, 86); line(166, 82, 170, 86); setcolor(RED); rectangle(390,62,441,81); rectangle(454,62,505,81); //rectangle(518,62,601,81); while((key = GetKey())!= Alt_X) { setfillstyle(SOLID_FILL,CYAN); bar(391,63,440,80); bar(455,63,504,80); //bar(519,63,600,80); setviewport(20, 100, 618, 458 , 1); switch(key) { case RIGHT : pFigure->Right (); break; case LEFT : pFigure->Left (); break; case UP : pFigure->Up (); break; case DOWN : pFigure->Down (); break; case ENLARGE : pFigure->Enlarge(); break; case REDUCE : pFigure->Reduce (); break; case HIDE : pFigure->Hide (); break; case SHOW : pFigure->Show (); break; default : break; } setviewport(0, 0, 639, 479, 1); settextstyle(2,0,5); setcolor(RED); sprintf(s1,"X0=%d",pFigure->GetX0()); outtextxy(392,62,s1); sprintf(s2,"Y0=%d",pFigure->GetY0()); outtextxy(456,62,s2); //sprintf(s3,"RADIUS=%d",pFigure->GetRadius()); //outtextxy(520,62,s3); } delete pFigure; closegraph(); } } /// void window(int left, int top, int right, int bottom, int width, int color1, int color2) { setfillstyle(SOLID_FILL, color1); bar(left, top, right, bottom); setcolor(color2); rectangle(left+width, top+width*5, right-width, bottom-width); setfillstyle(SOLID_FILL, color2); floodfill(left+width+1, top+width*5+1, color2); rectangle(left+2, top+2, right-2, bottom-2); rectangle(left+width-2, top+width-2, right-width+2, bottom-width+2); line(left+width-1, top+width*3-2, right-width+1, top+width*3-2); line(left+width-1, top+width*5-2, right-width+1, top+width*5-2); line(left+2, top+2, left+width-2, top+width-2); line(right-2, top+2, right-width+2, top+width-2); line(left+2, bottom-2, left+width-2, bottom-width+2); line(right-2, bottom-2, right-width+2, bottom-width+2); } /// int prompt() { printf("This program shows a figure, it can move there and here,/n"); printf("hide and then show./n"); printf("/nPlease input your choice to show what figure you want to see:"); printf("/n1:Circle/n2:Rectangle/n0:quit/n"); int choice = 0; cin >> choice; return choice; } // int GetKey() { int key; while(bioskey(1) == 0); key = bioskey(0); key = key & 0xff ? key & 0xff : key >> 8; return(key); } / //The program is over here.
面向对象开发范例之多态化图形操作
最新推荐文章于 2020-03-18 18:50:38 发布