题目
-------------------------------------------------我是可爱的分割线------------------------------------------------
思路
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±50,y±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±50,y±50×长宽比k;"w"伸长/"s"缩小
椭圆:检索到椭圆后,将椭圆外接矩形的左上和右下顶点放大,x±50,y±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;
}