利用graphics.h实现粗糙CAD

题目



-------------------------------------------------吐舌头我是可爱的分割线吐舌头------------------------------------------------

思路

1.初始化图形界面,将界面分为左右两个区域:选择界面/作图界面

2.当鼠标在选择界面不同坐标范围内单击左键时,记录此时鼠标坐标(m.x,m.y),用以选择对应功能。

3.分析可知放置功能较易实现,但删除/改变大小/移动功能需获取目标的具体位置信息,所以在放置时就需要一个数据库来存储相关信息。

图形信息,均为两个坐标点便可表示,所以定义一个coord结构,如下:

typedef struct coord {
		double x1;
		double y1;
		double x2;
		double y2;
	}coord;

文字信息,需记录下起始坐标和文字内容。所以定义一个Str结构,如下:

typedefstructcoordd {

         double x;

         double y;

         char words[100];

    }Str;

四个coord数组用于存储各种图形/文字的信息

    coord Line[100];

    coord Rectangle[100];

    coord Ellipse[100];

    coord Word[100];

四个static int变量用于记录各种图形/文字的数目

    staticint temp_l = 0;//分别为直线/矩形/椭圆/文字的数目

    staticint temp_r = 0;

    staticint temp_e = 0;

    staticint temp_w = 0;

4.界面设计,如图

5.功能选择实现代码整体布局如下,{X1,Y1,X2,Y2}表示各个功能区间对应的坐标范围

GetMouseCoor(m.x,m.y)

{

    if (10 <= m.x&& m.x <= 210 && 108 <= m.y && m.y <= 228)

    {

         if (m.y <= 138)       {放置直线}

         elseif (m.y <= 168)  {删除直线}

         elseif (m.y <= 198)  {改变大小}

         elseif (m.y <= 228)  {移动直线}

    }

    if (10 <= m.x&& m.x <= 210 && 282 <= m.y && m.y <= 402)

    {

         if (m.y <= 312)       {放置矩形}

         elseif (m.y <= 342)  {删除矩形}

         elseif (m.y <= 372)  {改变大小}

         elseif (m.y <= 402)  {移动直线}

    }

    if (10 <= m.x&& m.x <= 210 && 456 <= m.y && m.y <= 576)

    {

         if (m.y <= 486)       {放置椭圆}

         elseif (m.y <= 516)  {删除椭圆}

         elseif (m.y <= 546)  {改变大小}

         elseif (m.y <= 228)  {移动椭圆}

    }

    if (10 <= m.x && m.x <= 210 && 630 <= m.y &&m.y <= 750)

    {

         if (m.y <= 660)       {放置文字}

         elseif (m.y <= 690)  {删除文字}

         elseif (m.y <= 720)  {改变大小}

         elseif (m.y <= 750)  {移动文字}

    }

 

    …

}


-------------------------------------------------吐舌头我是可爱的分割线吐舌头-----------------------------------------------------


功能代码详解

1.所有状态(改变大小需在键盘上敲打除w/s外的任意键外)下点击右键,重返功能选择区域.

2.各功能的实现

直线部分

(1)放置直线:

        step1.左键按下,记录鼠标坐标作为直线起点;左键弹起,记录鼠标坐标作为直线终点;画线并         存储直线信息,temp_l加一;

          step2.左键(借助goto Flag_LineAgain)可实现重复画线操作/  (借助goto Flag_ChoiceAgain)可实现功能重新选择

(2)删除直线(将原有(红色)直线加黑成背景颜色,达到和删除一样的效果)

       step1.外层定义一个死循环,结束条件为获取到一个符合条件的直线信息;死循环里,得到一个有效鼠标坐标,便for循环遍历直线数组Line[100]检索符合条件的直线,检索条件从斜率考虑

        step2.检索到直线并进行删除操作后,由于是线性存储,所以后续直线信息向前进一;

        step3.左键(借助goto Flag_DeleteAgain)进入死循环可实现重复画线操作/右键(借助goto     Flag_ChoiceAgain)跳出循环,实现功能重新选择

(3)改变大小:

      step1.外层定义一个死循环,结束条件为获取到一个符合条件的直线信息;死循环里,得到一个有效鼠标坐标,便for循环遍历直线数组Line[100]检索符 合条件的直线,检索条件从斜率考虑//以上部分删除直线一样,代码实现可参考删除直线部分代码

        step2.索到直线后,将直线两段放大,x±50y±50×斜率k”w”伸长/w”缩小/其他键退出对当    前直线的操作;

        step3.左键(借助goto Flag_ChoiceLineAgain)重新选择直线/右键(借助goto Flag_ChoiceAgain)跳出    循环,实现功能重新选择.

(4)移动直线:

        step1.外层定义一个死循环,结束条件为获取到一个符合条件的直线信息;死循环里,得到一个有效鼠标坐标,便for循环遍历直线数组Line[100]检索符合条件的直线,检索条件从斜率考虑//以上部分删除直线一样,代码实现可参考删除直线部分代码

        step2.检索到直线后,记录当前鼠标坐标(X1,Y1)作为起点;左键弹起,记录鼠标坐标作为终点;将检索到的直线加黑(删除),并在终点处建立平移后的直线,更新被删直线信息为新的直线信息;point:移后坐标的计算

        step3.左键(借助gotoFlag_MoveAgain)重新选择直线移动/右键(借助goto Flag_ChoiceAgain)跳出循环,实现功能重新选择.

矩形/椭圆部分与直线部分高度类似,以下是其中差异部分

(1)放置矩形/椭圆

(2)删除矩形/椭圆

        矩形:检索条件从四个顶点入手    

        椭圆:检索条件从左右端点入手

(3)改变大小:

        矩形:检索到矩形后,将矩形左上和右下两个顶点放大,x±50y±50×长宽比k;"w"伸长/"s"缩小

       椭圆:检索到椭圆后,将椭圆外接矩形的左上和右下顶点放大,x±50y±50×外接矩形的长宽比k;"w"伸长/"s"缩小

(4)移动矩形/椭圆:

文字部分

文字部分与三个图形部分类似,唯一的区别在于文字的信息存储除起始坐标外还需记录文字的信息。


-------------------------------------------------吐舌头我是可爱的分割线吐舌头-----------------------------------------------------


Show Time



-------------------------------------------------吐舌头我是可爱的分割线吐舌头-----------------------------------------------------


代码奉上

#include<iostream>
#include<conio.h>
#include<graphics.h>
#include<stdio.h>
using namespace std;
#define MAXELEM 100
#define wordsize 10
int main()
{
	typedef struct coord {
		double x1;
		double y1;
		double x2;
		double y2;
	}coord;

	typedef struct coordd {
		double x;
		double y;
		char words[100];
	}Str;

	coord Line[MAXELEM + 111];
	coord Rectangle[MAXELEM];
	coord Ellipse[MAXELEM];
	Str Word[MAXELEM];

	static int temp_l = 0;//分别为 直线/矩形/椭圆/文字 的数目
	static int temp_r = 0;
	static int temp_e = 0;
	static int temp_w = 0;
	initgraph(980, 756);//初始化图形


						/*LINE: 29-68 界面设计*/


						/*边框部分*/
	setlinecolor(GREEN);
	for (int i = 54, k = 0; i < 756; i += 30, k++)
	{
		if (k % 5 == 0)
			i += 24;
		rectangle(10, i, 210, i + 30);
	}
	/*虚线部分*/
	setlinestyle(PS_DASH);
	line(220, 0, 220, 756);
	line(0, 60, 980, 60);
	setlinestyle(PS_SOLID);
	/*文字部分*/
	settextstyle(13, 13, NULL);
	outtextxy(84, 24, "选择界面");
	outtextxy(512, 24, "作图界面");
	settextstyle(8, 8, NULL);
	outtextxy(866, 42, "wrote by:Yangxin");
	settextstyle(11, 11, NULL);
	outtextxy(102, 83, "直线");
	outtextxy(102, 257, "矩形");
	outtextxy(102, 431, "椭圆");
	outtextxy(102, 605, "文字");
	settextstyle(10, 10, NULL);
	outtextxy(12, 113, "放置直线");
	outtextxy(12, 143, "删除直线");
	outtextxy(12, 173, "改变大小");
	outtextxy(12, 203, "移动直线");
	outtextxy(12, 292, "放置矩形");
	outtextxy(12, 322, "删除矩形");
	outtextxy(12, 352, "改变大小");
	outtextxy(12, 382, "移动矩形");
	outtextxy(12, 461, "放置椭圆");
	outtextxy(12, 491, "删除椭圆");
	outtextxy(12, 521, "改变大小");
	outtextxy(12, 551, "移动椭圆");
	outtextxy(12, 640, "放置文字");
	outtextxy(12, 670, "删除文字");
	outtextxy(12, 700, "改变大小");
	outtextxy(12, 730, "移动文字");


	/*LINE: 74-709 功能部分*/


	MOUSEMSG m;											// 定义鼠标消息
	while (true)
	{
	Flag_ChoiceAgain:
		double START_X, START_Y, END_X, END_Y;

		m = GetMouseMsg();
		/*作图区单击左键,选择功能*/
		if (m.uMsg == WM_LBUTTONDOWN)
		{

			/*作图区选择直线相关的操作*/
			/*LINE: 97-291 直线操作*/

			if (10 <= m.x && m.x <= 210 && 108 <= m.y && m.y <= 228)
			{
				/*1:放置直线*/
				if (m.y <= 138)
				{
				Flag_LineAgain:
					while (true)
					{
						m = GetMouseMsg();
						if (m.uMsg == WM_LBUTTONDOWN)		//单击左键,获取起点
						{
							START_X = m.x;
							START_Y = m.y;
							Line[temp_l].x1 = m.x;
							Line[temp_l].y1 = m.y;
							while (START_X >= 220 && START_Y >= 60)//确保起点在作图区内
							{
								m = GetMouseMsg();
								if (m.uMsg == WM_LBUTTONUP)//左键弹起,获取终点
								{
									END_X = m.x;
									END_Y = m.y;
									Line[temp_l].x2 = m.x;
									Line[temp_l].y2 = m.y;
									if (END_X >= 220 && END_Y >= 60)//确保终点在作图区内
									{
										setlinecolor(RED);
										line(START_X, START_Y, END_X, END_Y);
										temp_l++;				//直线的数量加一
										goto Flag_LineAgain;	//重复画线
									}
								}
								else if (m.uMsg == WM_RBUTTONUP)
								{
									FlushMouseMsgBuffer();
									goto Flag_ChoiceAgain;
								}

							}
						}
						else if (m.uMsg == WM_RBUTTONDOWN)//单击右键回到功能选择区域
							goto Flag_ChoiceAgain;
					}
				}
				/*2:删除直线*/
				else if (m.y <= 168)
				{
				Flag_DeleteAgain:
					while (true)
					{
						m = GetMouseMsg();
						if (m.uMsg == WM_LBUTTONDOWN)		//单击左键,删除线段
						{
							int i;
							for (i = 0; i < temp_l; i++)	//遍历直线数组,寻找符合条件的直线
							{
								if (m.x >= 220 && m.y >= 60)//限制区域为作图区域
									if (fabs((Line[i].y2 - Line[i].y1) / (Line[i].x2 - Line[i].x1) - (Line[i].y2 - m.y) / (Line[i].x2 - m.x)) <= 0.1)//只要是一条直线上,即选中
									{
										setlinecolor(BLACK);
										line(Line[i].x1, Line[i].y1, Line[i].x2, Line[i].y2);
										for (int k = i; k < temp_l - 1; k++)//线性存储,所以后续直线需要向前移一位
										{
											Line[k].x1 = Line[k + 1].x1;
											Line[k].y1 = Line[k + 1].y1;
											Line[k].x2 = Line[k + 1].x2;
											Line[k].y2 = Line[k + 1].y2;
										}
										temp_l--;
										FlushMouseMsgBuffer();
										goto Flag_DeleteAgain;//重复删除
									}
							}
						}
						else if (m.uMsg == WM_RBUTTONDOWN)//单击右键,回到功能选择界面
						{
							FlushMouseMsgBuffer();
							goto Flag_ChoiceAgain;
						}
					}
				}
				/*3:改变直线大小*/
				else if (m.y <= 198)
				{
				Flag_ChoiceLineAgain:
					while (true)
					{
						m = GetMouseMsg();
						if (m.uMsg == WM_LBUTTONDOWN)		//单击左键,选中线段
						{
							int i;
							for (i = 0; i < temp_l; i++)
							{
								if (m.x >= 220 && m.y >= 60)		//限制区域为作图区域
									if (fabs((Line[i].y2 - Line[i].y1) / (Line[i].x2 - Line[i].x1) - (Line[i].y2 - m.y) / (Line[i].x2 - m.x)) <= 0.1)//只要是一条直线上,即选中
									{
										double k = (Line[i].y2 - Line[i].y1) / (Line[i].x2 - Line[i].x1);//计算斜率
									again:
										char ch;
										ch = _getche();
										if (ch == 'w')					//键盘w增大
										{
											setlinecolor(BLACK);
											line(Line[i].x1, Line[i].y1, Line[i].x2, Line[i].y2);
											Line[i].x1 -= 50;
											Line[i].y1 -= 50 * k;
											Line[i].x2 += 50;
											Line[i].y2 += 50 * k;
											setlinecolor(RED);
											line(Line[i].x1, Line[i].y1, Line[i].x2, Line[i].y2);
											goto again;
										}
										if (ch == 's')			//键盘s减小
										{
											setlinecolor(BLACK);
											line(Line[i].x1, Line[i].y1, Line[i].x2, Line[i].y2);
											Line[i].x1 += 50;
											Line[i].y1 += 50 * k;
											Line[i].x2 -= 50;
											Line[i].y2 -= 50 * k;
											setlinecolor(RED);
											line(Line[i].x1, Line[i].y1, Line[i].x2, Line[i].y2);
											goto again;
										}
										goto Flag_ChoiceLineAgain;
									}
							}
						}
						else if (m.uMsg == WM_RBUTTONDOWN)//单击右键,重新功能选择
						{
							FlushMouseMsgBuffer();
							goto Flag_ChoiceAgain;
						}

					}
				}
				/*4:移动直线*/
				else if (m.y <= 228)
				{
				Flag_MoveAgain:
					while (true)
					{
						m = GetMouseMsg();
						if (m.uMsg == WM_LBUTTONDOWN)		//单击左键,选择线段
						{
							int i;
							for (i = 0; i < temp_l; i++)		//筛选线段
							{
								if (m.x >= 220 && m.y >= 60)//限制鼠标移动区域为作图区域
									if (fabs((Line[i].y2 - Line[i].y1) / (Line[i].x2 - Line[i].x1) - (Line[i].y2 - m.y) / (Line[i].x2 - m.x)) <= 0.1)//只要是一条直线上,即选中
									{
										double START_X, START_Y, END_X, END_Y;
										START_X = m.x;
										START_Y = m.y;
										setlinecolor(BLACK);
										line(Line[i].x1, Line[i].y1, Line[i].x2, Line[i].y2);
										while (START_X >= 220 && START_Y >= 60)
										{
											m = GetMouseMsg();
											if (m.uMsg == WM_LBUTTONUP)//左键弹起,获取终点
											{
												END_X = m.x;
												END_Y = m.y;
												if (END_X >= 220 && END_Y >= 60)
												{
													setlinecolor(RED);
													double D_x = END_X - START_X;
													double D_y = END_Y - START_Y;
													Line[i].x1 += D_x;
													Line[i].x2 += D_x;
													Line[i].y1 += D_y;
													Line[i].y2 += D_y;
													line(Line[i].x1, Line[i].y1, Line[i].x2, Line[i].y2);
													goto Flag_MoveAgain;//重复选择线段移动
												}
											}
											else if (m.uMsg == WM_RBUTTONUP)
											{
												FlushMouseMsgBuffer();
												goto Flag_ChoiceAgain;
											}
										}
										goto Flag_MoveAgain;//重新选择线段移动
									}
							}
						}
						else if (m.uMsg == WM_RBUTTONDOWN)//单击右键,回到功能选择界面
						{
							FlushMouseMsgBuffer();
							goto Flag_ChoiceAgain;
						}
					}
				}
			}

			/*作图区选择矩形相关的操作*/
			/*LINE: 296-508 矩形操作*/

			if (10 <= m.x && m.x <= 210 && 282 <= m.y && m.y <= 402)
			{
				/*1:放置矩形*/
				if (m.y <= 312)
				{
				Flag_RectangleAgain:
					while (true)
					{
						m = GetMouseMsg();
						if (m.uMsg == WM_LBUTTONDOWN)		//单击左键,获取矩形左上顶点
						{
							START_X = m.x;
							START_Y = m.y;
							Rectangle[temp_r].x1 = m.x;
							Rectangle[temp_r].y1 = m.y;
							while (START_X >= 220 && START_Y >= 60)//确保起点在作图区内
							{
								m = GetMouseMsg();
								if (m.uMsg == WM_LBUTTONUP)//左键弹起,获取矩形右下顶点
								{
									END_X = m.x;
									END_Y = m.y;
									Rectangle[temp_r].x2 = m.x;
									Rectangle[temp_r].y2 = m.y;
									if (END_X >= 220 && END_Y >= 60)//确保终点在作图区内
									{
										setlinecolor(RED);
										rectangle(START_X, START_Y, END_X, END_Y);
										temp_r++;				//矩形的数量加一
										goto Flag_RectangleAgain;	//重复画矩形
									}
								}
								else if (m.uMsg == WM_RBUTTONUP)
								{
									FlushMouseMsgBuffer();
									goto Flag_ChoiceAgain;
								}

							}
						}
						else if (m.uMsg == WM_RBUTTONDOWN)//单击右键回到功能选择区域
							goto Flag_ChoiceAgain;
					}
				}
				/*2:删除矩形*/
				else if (m.y <= 342)
				{
				Flag_DeleteRectangleAgain:
					while (true)
					{
						m = GetMouseMsg();
						if (m.uMsg == WM_LBUTTONDOWN)		//单击左键,删除矩形
						{
							int i;
							for (i = 0; i < temp_r; i++)	//遍历矩形数组,寻找符合条件的矩形
							{
								if (m.x >= 220 && m.y >= 60)//限制区域为作图区域
								{
									bool a = (fabs(m.x - Rectangle[i].x1) < 5);
									bool b = (fabs(m.x - Rectangle[i].x2) < 5);
									bool c = (fabs(m.y - Rectangle[i].y1) < 5);
									bool d = (fabs(m.y - Rectangle[i].y2) < 5);
									if ((a || b) && (c || d))//点击矩形任一顶点即选中
									{
										setlinecolor(BLACK);
										rectangle(Rectangle[i].x1, Rectangle[i].y1, Rectangle[i].x2, Rectangle[i].y2);
										for (int k = i; k < temp_r - 1; k++)//线性存储,所以后续矩形需要向前进一位
										{
											Rectangle[k].x1 = Rectangle[k + 1].x1;
											Rectangle[k].y1 = Rectangle[k + 1].y1;
											Rectangle[k].x2 = Rectangle[k + 1].x2;
											Rectangle[k].y2 = Rectangle[k + 1].y2;
										}
										temp_r--;
										FlushMouseMsgBuffer();
										goto Flag_DeleteRectangleAgain;//重复删除
									}
								}
							}
						}
						else if (m.uMsg == WM_RBUTTONDOWN)//单击右键,回到功能选择界面
						{
							FlushMouseMsgBuffer();
							goto Flag_ChoiceAgain;
						}
					}
				}
				/*3:改变矩形大小*/
				else if (m.y <= 372)
				{
				Flag_ChoiceRectangleAgain:
					while (true)
					{
						m = GetMouseMsg();
						if (m.uMsg == WM_LBUTTONDOWN)		//单击左键,选中矩形
						{
							int i;
							for (i = 0; i < temp_r; i++)
							{
								if (m.x >= 220 && m.y >= 60)		//限制区域为作图区域
								{
									bool a = (fabs(m.x - Rectangle[i].x1) < 5);
									bool b = (fabs(m.x - Rectangle[i].x2) < 5);
									bool c = (fabs(m.y - Rectangle[i].y1) < 5);
									bool d = (fabs(m.y - Rectangle[i].y2) < 5);
									if ((a || b) && (c || d))//点击矩形任一顶点即选中
									{
										double k = (Rectangle[i].y2 - Rectangle[i].y1) / (Rectangle[i].x2 - Rectangle[i].x1);//长宽比
									Again:
										char ch;
										ch = _getche();
										if (ch == 'w')					//键盘w增大
										{
											setlinecolor(BLACK);
											rectangle(Rectangle[i].x1, Rectangle[i].y1, Rectangle[i].x2, Rectangle[i].y2);
											Rectangle[i].x1 -= 50;
											Rectangle[i].y1 -= 50 * k;
											Rectangle[i].x2 += 50;
											Rectangle[i].y2 += 50 * k;
											setlinecolor(RED);
											rectangle(Rectangle[i].x1, Rectangle[i].y1, Rectangle[i].x2, Rectangle[i].y2);
											goto Again;
										}
										if (ch == 's')			//键盘s减小
										{
											setlinecolor(BLACK);
											rectangle(Rectangle[i].x1, Rectangle[i].y1, Rectangle[i].x2, Rectangle[i].y2);
											Rectangle[i].x1 += 50;
											Rectangle[i].y1 += 50 * k;
											Rectangle[i].x2 -= 50;
											Rectangle[i].y2 -= 50 * k;
											setlinecolor(RED);
											rectangle(Rectangle[i].x1, Rectangle[i].y1, Rectangle[i].x2, Rectangle[i].y2);
											goto Again;
										}
										goto Flag_ChoiceRectangleAgain;
									}
								}
							}
						}
						else if (m.uMsg == WM_RBUTTONDOWN)//单击右键,重新功能选择
						{
							FlushMouseMsgBuffer();
							goto Flag_ChoiceAgain;
						}

					}
				}
				/*4:移动矩形*/
				else if (m.y <= 402)
				{
				Flag_MoveRectangleAgain:
					while (true)
					{
						m = GetMouseMsg();
						if (m.uMsg == WM_LBUTTONDOWN)		//单击左键,选择线段
						{
							int i;
							for (i = 0; i < temp_r; i++)		//筛选线段
							{
								if (m.x >= 220 && m.y >= 60)//限制鼠标移动区域为作图区域
								{
									bool a = (fabs(m.x - Rectangle[i].x1) < 5);
									bool b = (fabs(m.x - Rectangle[i].x2) < 5);
									bool c = (fabs(m.y - Rectangle[i].y1) < 5);
									bool d = (fabs(m.y - Rectangle[i].y2) < 5);
									if ((a || b) && (c || d))//点击矩形任一顶点即选中
									{
										double START_X, START_Y, END_X, END_Y;
										START_X = m.x;
										START_Y = m.y;
										setlinecolor(BLACK);
										rectangle(Rectangle[i].x1, Rectangle[i].y1, Rectangle[i].x2, Rectangle[i].y2);
										while (START_X >= 220 && START_Y >= 60)
										{
											m = GetMouseMsg();
											if (m.uMsg == WM_LBUTTONUP)//左键弹起,获取终点
											{
												END_X = m.x;
												END_Y = m.y;
												if (END_X >= 220 && END_Y >= 60)
												{
													setlinecolor(RED);
													double D_x = END_X - START_X;
													double D_y = END_Y - START_Y;
													Rectangle[i].x1 += D_x;
													Rectangle[i].x2 += D_x;
													Rectangle[i].y1 += D_y;
													Rectangle[i].y2 += D_y;
													rectangle(Rectangle[i].x1, Rectangle[i].y1, Rectangle[i].x2, Rectangle[i].y2);
													goto Flag_MoveRectangleAgain;//重复选择线段移动
												}
											}
											else if (m.uMsg == WM_RBUTTONUP)
											{
												FlushMouseMsgBuffer();
												goto Flag_ChoiceAgain;
											}
										}
										goto Flag_MoveAgain;//重新选择线段移动
									}
								}

							}
						}
						else if (m.uMsg == WM_RBUTTONDOWN)//单击右键,回到功能选择界面
						{
							FlushMouseMsgBuffer();
							goto Flag_ChoiceAgain;
						}
					}
				}
			}

			/*作图区选择椭圆相关的操作*/
			/*LINE: 513-725 椭圆操作*/

			if (10 <= m.x && m.x <= 210 && 456 <= m.y && m.y <= 576)
			{
				/*1:放置椭圆*/
				if (m.y <= 486)
				{
				Flag_EllipseAgain:
					while (true)
					{
						m = GetMouseMsg();
						if (m.uMsg == WM_LBUTTONDOWN)		//单击左键,获取起点
						{
							START_X = m.x;
							START_Y = m.y;
							Ellipse[temp_e].x1 = m.x;
							Ellipse[temp_e].y1 = m.y;
							while (START_X >= 220 && START_Y >= 60)//确保起点在作图区内
							{
								m = GetMouseMsg();
								if (m.uMsg == WM_LBUTTONUP)//左键弹起,获取终点
								{
									END_X = m.x;
									END_Y = m.y;
									Ellipse[temp_e].x2 = m.x;
									Ellipse[temp_e].y2 = m.y;
									if (END_X >= 220 && END_Y >= 60)//确保终点在作图区内
									{
										setlinecolor(RED);
										ellipse(START_X, START_Y, END_X, END_Y);
										temp_e++;				//直线的数量加一
										goto Flag_EllipseAgain;	//重复画线
									}
								}
								else if (m.uMsg == WM_RBUTTONUP)
								{
									FlushMouseMsgBuffer();
									goto Flag_ChoiceAgain;
								}

							}
						}
						else if (m.uMsg == WM_RBUTTONDOWN)//单击右键回到功能选择区域
							goto Flag_ChoiceAgain;
					}
				}
				/*2:删除椭圆*/
				else if (m.y <= 516)
				{
				Flag_DeleteEAgain:
					while (true)
					{
						m = GetMouseMsg();
						if (m.uMsg == WM_LBUTTONDOWN)		//单击左键,删除椭圆
						{
							int i;
							for (i = 0; i < temp_e; i++)	//遍历椭圆数组,寻找符合条件的直线
							{
								if (m.x >= 220 && m.y >= 60)//限制区域为作图区域
								{
									double evey = (Ellipse[i].y1 + Ellipse[i].y2) / 2;
									bool a = (fabs(m.x - Ellipse[i].x1) < 5);
									bool b = (fabs(m.x - Ellipse[i].x2) < 5);
									bool c = (fabs(m.y - evey) < 5);
									if ((a || b) && c)//点击椭圆左右任一顶点即选中
									{
										setlinecolor(BLACK);
										ellipse(Ellipse[i].x1, Ellipse[i].y1, Ellipse[i].x2, Ellipse[i].y2);
										for (int k = i; k < temp_e - 1; k++)//线性存储,所以后续直线需要向前移一位
										{
											Ellipse[k].x1 = Ellipse[k + 1].x1;
											Ellipse[k].y1 = Ellipse[k + 1].y1;
											Ellipse[k].x2 = Ellipse[k + 1].x2;
											Ellipse[k].y2 = Ellipse[k + 1].y2;
										}
										temp_e--;
										FlushMouseMsgBuffer();
										goto Flag_DeleteEAgain;//重复删除
									}
								}
							}
						}
						else if (m.uMsg == WM_RBUTTONDOWN)//单击右键,回到功能选择界面
						{
							FlushMouseMsgBuffer();
							goto Flag_ChoiceAgain;
						}
					}
				}
				/*3:改变椭圆大小*/
				else if (m.y <= 546)
				{
				Flag_ChoiceEAgain:
					while (true)
					{
						m = GetMouseMsg();
						if (m.uMsg == WM_LBUTTONDOWN)		//单击左键,选中椭圆
						{
							int i;
							for (i = 0; i < temp_e; i++)
							{
								if (m.x >= 220 && m.y >= 60)		//限制区域为作图区域
								{
									double evey = (Ellipse[i].y1 + Ellipse[i].y2) / 2;
									bool a = (fabs(m.x - Ellipse[i].x1) < 10);
									bool b = (fabs(m.x - Ellipse[i].x2) < 10);
									bool c = (fabs(m.y - evey) < 10);
									if ((a || b) && c)//点击椭圆左右任一顶点即选中
									{
										double k = (Ellipse[i].y2 - Ellipse[i].y1) / (Ellipse[i].x2 - Ellipse[i].x1);//长宽比
									_Eagain:
										char ch;
										ch = _getche();
										if (ch == 'w')					//键盘w增大
										{
											setlinecolor(BLACK);
											ellipse(Ellipse[i].x1, Ellipse[i].y1, Ellipse[i].x2, Ellipse[i].y2);
											Ellipse[i].x1 -= 50;
											Ellipse[i].y1 -= 50 * k;
											Ellipse[i].x2 += 50;
											Ellipse[i].y2 += 50 * k;
											setlinecolor(RED);
											ellipse(Ellipse[i].x1, Ellipse[i].y1, Ellipse[i].x2, Ellipse[i].y2);
											goto _Eagain;
										}
										if (ch == 's')			//键盘s减小
										{
											setlinecolor(BLACK);
											ellipse(Ellipse[i].x1, Ellipse[i].y1, Ellipse[i].x2, Ellipse[i].y2);
											Ellipse[i].x1 += 50;
											Ellipse[i].y1 += 50 * k;
											Ellipse[i].x2 -= 50;
											Ellipse[i].y2 -= 50 * k;
											setlinecolor(RED);
											ellipse(Ellipse[i].x1, Ellipse[i].y1, Ellipse[i].x2, Ellipse[i].y2);
											goto _Eagain;
										}
										goto Flag_ChoiceEAgain;
									}
								}

							}
						}
						else if (m.uMsg == WM_RBUTTONDOWN)//单击右键,重新功能选择
						{
							FlushMouseMsgBuffer();
							goto Flag_ChoiceAgain;
						}

					}
				}
				/*4:移动椭圆*/
				else if (m.y <= 576)
				{
				Flag_MoveEAgain:
					while (true)
					{
						m = GetMouseMsg();
						if (m.uMsg == WM_LBUTTONDOWN)		//单击左键,选择椭圆
						{
							int i;
							for (i = 0; i < temp_e; i++)		//筛选椭圆
							{
								if (m.x >= 220 && m.y >= 60)//限制鼠标移动区域为作图区域
								{
									double evey = (Ellipse[i].y1 + Ellipse[i].y2) / 2;
									bool a = (fabs(m.x - Ellipse[i].x1) < 5);
									bool b = (fabs(m.x - Ellipse[i].x2) < 5);
									bool c = (fabs(m.y - evey) < 5);
									if ((a || b) && c)//点击椭圆左右任一顶点即选中
									{
										double START_X, START_Y, END_X, END_Y;
										START_X = m.x;
										START_Y = m.y;
										setlinecolor(BLACK);
										ellipse(Ellipse[i].x1, Ellipse[i].y1, Ellipse[i].x2, Ellipse[i].y2);
										while (START_X >= 220 && START_Y >= 60)
										{
											m = GetMouseMsg();
											if (m.uMsg == WM_LBUTTONUP)//左键弹起,获取终点
											{
												END_X = m.x;
												END_Y = m.y;
												if (END_X >= 220 && END_Y >= 60)
												{
													setlinecolor(RED);
													double D_x = END_X - START_X;
													double D_y = END_Y - START_Y;
													Ellipse[i].x1 += D_x;
													Ellipse[i].x2 += D_x;
													Ellipse[i].y1 += D_y;
													Ellipse[i].y2 += D_y;
													ellipse(Ellipse[i].x1, Ellipse[i].y1, Ellipse[i].x2, Ellipse[i].y2);
													goto Flag_MoveEAgain;//重复选择椭圆移动
												}
											}
											else if (m.uMsg == WM_RBUTTONUP)
											{
												FlushMouseMsgBuffer();
												goto Flag_ChoiceAgain;
											}
										}
										goto Flag_MoveEAgain;//重新选择椭圆移动
									}
								}
							}
						}
						else if (m.uMsg == WM_RBUTTONDOWN)//单击右键,回到功能选择界面
						{
							FlushMouseMsgBuffer();
							goto Flag_ChoiceAgain;
						}
					}
				}
			}

			/*作图区选择文字相关的操作*/
			/*LINE: 731-916 矩形操作*/

			/*文字*/
			if (10 <= m.x && m.x <= 210 && 630 <= m.y && m.y <= 750)
			{
				if (m.y <= 660)
				{
				/*1:放置文字*/
				Flag_WordAgain:
					while (true)
					{
						m = GetMouseMsg();
						if (m.uMsg == WM_LBUTTONDOWN)		//单击左键,获取起点
						{
							START_X = m.x;
							START_Y = m.y;
							Word[temp_w].x = m.x;
							Word[temp_w].y = m.y;
							if (START_X >= 220 && START_Y >= 60)//确保起点在作图区内
							{
								settextcolor(RED);
								gets_s(Word[temp_w].words);
								settextstyle(wordsize, wordsize, NULL);
								outtextxy(Word[temp_w].x, Word[temp_w].y, Word[temp_w].words);
								temp_w++;
								goto Flag_WordAgain;	//重复写字
							}
						}
						else if (m.uMsg == WM_RBUTTONUP)
						{
							FlushMouseMsgBuffer();
							goto Flag_ChoiceAgain;
						}

					}

				}
				else if (m.y <= 690)
				{
				/*2:删除文字*/
				Flag_DeleteWAgain:
					while (true)
					{
						m = GetMouseMsg();
						if (m.uMsg == WM_LBUTTONDOWN)		//单击左键,删除文字
						{
							int i;
							for (i = 0; i < temp_w; i++)	//遍历文字数组,寻找符合条件的文字
							{
								if (m.x >= 220 && m.y >= 60)//限制区域为作图区域
								{

									if (fabs(m.x - Word[i].x) < 15 || fabs(m.y - Word[i].y)<15)//点击文字开头即选中
									{
										settextcolor(BLACK);
										outtextxy(Word[i].x, Word[i].y, "can't see me !can't see me !can't see me !");
										for (int k = i; k < temp_e - 1; k++)//线性存储,所以后续文字需要向前移一位
										{
											Word[k].x = Word[k + 1].x;
											Word[k].y = Word[k + 1].y;
											for (int t = 0; t<100; t++)
												Word[k].words[t] = Word[k + 1].words[t];
										}
										temp_e--;
										FlushMouseMsgBuffer();
										goto Flag_DeleteWAgain;//重复删除
									}
								}
							}
						}
						else if (m.uMsg == WM_RBUTTONDOWN)//单击右键,回到功能选择界面
						{
							FlushMouseMsgBuffer();
							goto Flag_ChoiceAgain;
						}

					}
				}

				else if (m.y <= 720)
				{
				/*3:改变大小*/
				Flag_ChoiceWAgain:
					while (true)
					{
						m = GetMouseMsg();
						if (m.uMsg == WM_LBUTTONDOWN)		//单击左键,选中文字
						{
							int i;
							for (i = 0; i < temp_w; i++)
							{
								if (m.x >= 220 && m.y >= 60)		//限制区域为作图区域
								{

									if (fabs(m.x - Word[i].x) < 15 || fabs(m.y - Word[i].y)<15)
									{
										int wsz = wordsize;
									_Wagain:
										char ch;
										ch = _getche();
										if (ch == 'w')					//键盘w增大
										{

											outtextxy(Word[i].x, Word[i].y, "                                                                                                     ");
											wsz *= 2;
											settextstyle(wsz, wsz, NULL);

											outtextxy(Word[i].x, Word[i].y, Word[i].words);
											goto _Wagain;
										}
										if (ch == 's')			//键盘s减小
										{

											outtextxy(Word[i].x, Word[i].y, "                                                                                                     ");
											wsz /= 2;
											settextstyle(wsz, wsz, NULL);

											outtextxy(Word[i].x, Word[i].y, Word[i].words);
											goto _Wagain;
										}
										goto Flag_ChoiceWAgain;
									}
								}

							}
						}
						else if (m.uMsg == WM_RBUTTONDOWN)//单击右键,重新功能选择
						{
							FlushMouseMsgBuffer();
							goto Flag_ChoiceAgain;
						}

					}
				}
				else if (m.y <= 750)
				{
				/*4:移动文字*/
				Flag_MoveWAgain:
					while (true)
					{
						m = GetMouseMsg();
						if (m.uMsg == WM_LBUTTONDOWN)		//单击左键,选择文字
						{
							for (int i = 0; i < temp_w; i++)		//筛选文字
							{
								if (m.x >= 220 && m.y >= 60)//限制鼠标移动区域为作图区域
								{
									if (fabs(m.x - Word[i].x) < 15 && fabs(m.y - Word[i].y)<15)//点击文字起点即选中
									{
										double START_X, START_Y, END_X, END_Y;
										START_X = m.x;
										START_Y = m.y;
										settextcolor(BLACK);
										outtextxy(Word[i].x, Word[i].y, "can't see me!can't see me!can't see me!");
										while (START_X >= 220 && START_Y >= 60)
										{
											m = GetMouseMsg();
											if (m.uMsg == WM_LBUTTONUP)//左键弹起,获取终点
											{
												END_X = m.x;
												END_Y = m.y;
												if (END_X >= 220 && END_Y >= 60)
												{
													Word[i].x = END_X;
													Word[i].y = END_Y;
													settextcolor(RED);
													outtextxy(END_X, END_Y, Word[i].words);
													goto Flag_MoveWAgain;//重复选择文字移动
												}
											}
											else if (m.uMsg == WM_RBUTTONUP)
											{
												FlushMouseMsgBuffer();
												goto Flag_ChoiceAgain;
											}
										}
										goto Flag_MoveWAgain;//重新选择文字移动
									}
								}
							}
						}
						else if (m.uMsg == WM_RBUTTONDOWN)//单击右键,回到功能选择界面
						{
							FlushMouseMsgBuffer();
							goto Flag_ChoiceAgain;
						}
					}
				}
			}
		}

	}
	_getch();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_29419013/article/details/80737475