C++实现简易的画图软件

您所在的位置:网站首页 画图工具命令行 C++实现简易的画图软件

C++实现简易的画图软件

2024-07-03 22:40:37| 来源: 网络整理| 查看: 265

最近再次考古,大一时C++写的画图软件,基于graphics.h图形库,环境codeblocks。 环境配置正确可以直接运行,话不多说直接贴代码。程序还是有一点小bug,可以根据自己的需求再改一下,大体上的框架没有大问题。远古代码比较辣鸡,仅供交流参考。

#include #include #include using namespace std; class Point { protected: int x; int y; int r; int x1; int y1; public: Point() { x = 0; y = 0; r = 0; x1= 0; y1= 0; } virtual void set(int a, int b)=0; virtual void setstart(int a,int b)=0; virtual void draw()=0; virtual void drawf()=0; int getx() const { return x; } int gety() const { return y; } }; class MyCircle:public Point//圆类 { virtual void set(int a, int b) { int dx = getx() - a; int dy = gety() -b; r = (int)sqrt(dx * dx + dy * dy); x1=a; y1=b; } virtual void setstart(int a,int b)//定初始点 { x = a; y = b; r = 0; x1=a; y1=b; } virtual void draw()//画空心 { circle(x, y, r); } virtual void drawf()//画实心 { setfillstyle(SOLID_FILL,getcolor()); pieslicef(x,y,0,360,r); } }; class rcircle:public Point//椭圆类 { public: virtual void set(int a,int b) { x1=getx() - a; y1=gety() - b; } virtual void setstart(int a,int b)//椭圆定初始点 { x = a; y = b; r = 0; x1= 0; y1= 0; } virtual void draw() { ellipsef(x,y,0,360,x1,y1); } virtual void drawf() { setfillstyle(SOLID_FILL,getcolor()); fillellipse(x,y,x1,y1); } }; class Myline:public MyCircle//线类 { public: virtual void draw() { line(x,y,x1,y1); } virtual void drawf() { line(x,y,x1,y1); } }; class Ju:public MyCircle//矩形类 { public: virtual void draw() { rectangle(x,y,x1,y1); } virtual void drawf() { setfillstyle(SOLID_FILL,getcolor()); int poly[8]={x,y,x1,y,x1,y1,x,y1}; fillpoly(4,poly); } }; int main() { MUSIC mus1; // 定义一个音乐对象 mus1.OpenFile("yinxiao1.mp3"); // 打开文件 MUSIC mus2; mus2.OpenFile("yinxiao2.mp3"); int b=0; MyCircle r; rcircle nr; Myline l; Ju ju; Point *p=&r;//定义一个指向基类对象的指针变量 bool bDraw = false; // 绘图标志,按下鼠标左键设置为true,抬起鼠标左键或在绘图过程中按鼠标右键设置为false initgraph(800, 600, INIT_RENDERMANUAL); /*画一个按钮*/ setfillstyle(SOLID_FILL,BLUE); //颜色按钮 bar(10,20,40,50); setfillstyle(SOLID_FILL,YELLOW); bar(40,20,70,50); setfillstyle(SOLID_FILL,RED); bar(70,20,100,50); setfillstyle(SOLID_FILL,GREEN); bar(100,20,130,50); setfillstyle(SOLID_FILL,WHITE); bar(130,20,160,50); setfillstyle(SOLID_FILL,0xFF6100); bar(160,20,190,50); setfillstyle(SOLID_FILL,0xA020E0); bar(190,20,220,50); setfillstyle(SOLID_FILL,WHITE); //图形按钮 bar(10,51,40,81); setfillstyle(SOLID_FILL,BLACK); line(15,66,35,66); setfillstyle(SOLID_FILL,WHITE); bar(10,82,40,112); setfillstyle(SOLID_FILL,BLACK); circle(25,97,10); setfillstyle(SOLID_FILL,WHITE); bar(10,113,40,143); setfillstyle(SOLID_FILL,BLACK); rectangle(15,120,35,136); setfillstyle(SOLID_FILL,WHITE); bar(10,144,40,174); setfillstyle(SOLID_FILL,BLACK); ellipsef(25,159,0,360,10,6); setfillstyle(SOLID_FILL,WHITE); // 空心实心按钮 bar(10,175,40,205); outtextxy(15,180,"fill"); setfillstyle(SOLID_FILL,WHITE); bar(10,206,40,236); outtextxy(10,210,"unfill"); outtextxy(335,35,"line width"); //线宽按钮 setfillstyle(SOLID_FILL,WHITE); bar(400,20,430,50); setfillstyle(SOLID_FILL,BLACK); bar(405,35,425,36); setfillstyle(SOLID_FILL,WHITE); bar(435,20,465,50); setfillstyle(SOLID_FILL,BLACK); bar(440,35,460,38); setfillstyle(SOLID_FILL,WHITE); bar(470,20,500,50); setfillstyle(SOLID_FILL,BLACK); bar(475,35,495,40); outtextxy(565,35,"line style"); // 线型按钮 setfillstyle(SOLID_FILL,WHITE); bar(630,20,660,50); setcolor(BLACK); setlinestyle(PS_SOLID, 0, 1, NULL); line(632,35,657,35); setfillstyle(SOLID_FILL,WHITE); bar(665,20,695,50); setcolor(WHITE); setlinestyle(PS_DOT, 0, 1, NULL); line(667,35,690,35); setlinewidth(3); //边框 setcolor(WHITE); line(45,55,45,595); line(45,55,795,55); line(45,595,795,595); line(795,55,795,595); setlinewidth(1); setfillstyle(SOLID_FILL,WHITE); //clear按钮 bar(10,300,40,330); outtextxy(10,305,"clear"); setfont(16, 0, "宋体"); setcolor(0x00F000F0); setbkcolor(BLACK); setlinestyle(PS_SOLID); mouse_msg msg = {0}; for ( ; is_run();delay_fps(60)) // 消息循环 { //获取鼠标消息,这个函数会等待,等待到有消息为止 //类似地,有和kbhit功能相近的函数MouseHit,用于检测有没有鼠标消息 while (mousemsg()) { msg = getmouse();//得到鼠标位置 } if (msg.is_down()) // 有鼠标键按下 { if (msg.is_left()) // 是鼠标左键 { mus1.Play(0); if(msg.x>9&msg.x19&msg.y39&msg.x19&msg.y69&msg.x19&msg.y99&msg.x19&msg.y129&msg.x19&msg.y159&msg.x19&msg.y189&msg.x19&msg.y399&msg.x19&msg.y434&msg.x19&msg.y469&msg.x19&msg.y9&msg.x299&msg.y630&msg.x20&msg.y665&msg.x20&msg.y9&msg.x50&msg.y9&msg.x81&msg.y9&msg.x112&msg.y9&msg.x143&msg.y9&msg.x174&msg.y9&msg.x205&msg.ysetstart(msg.x,msg.y); setwritemode(R2_XORPEN); // 设置XOR模式 bDraw = true; // 开始跟踪鼠标画图 } } } if (msg.is_right()) // 是鼠标右键 { if (bDraw) { mus2.Play(0); if(b==0) { p->draw(); } else p->drawf(); // 清除图形 setwritemode(R2_COPYPEN); // 设置copy模式 bDraw = false; } } else if (msg.is_move()) // 移动鼠标 { if (bDraw) { if(b==0) { p->draw(); } else p->drawf(); // 清除之前绘制的图形 p->set(msg.x,msg.y); if(b==0) { p->draw(); } // 修改坐标后绘制新图形 else p->drawf(); } } else if (msg.is_up()) // 抬起鼠标按键 { if (bDraw) { setwritemode(R2_COPYPEN); // 用copy模式重新绘制图形 p->set(msg.x,msg.y); if(b==0) { p->draw(); } // 修改坐标后绘制新图形 else p->drawf(); bDraw = false; } } xyprintf(0, 0, "x=%4d y=%4d", msg.x, msg.y); // 实时显示鼠标坐标 } closegraph(); return 0; }

最后的效果大概如下图所示: 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 软件可以选择颜色、图形、线型、线宽、是否实心等,clear是擦除按钮;按下左键开始画图,按下右键取消当前图形的绘制,而且如果放了音效文件还会有音效提示;但是程序还有点小问题,比如图形会跑到画框外面去,鼠标落点判定不当等等。总体上来说是可以正常使用的。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭