From 4f9a590b03abfa2ec194cde5214019f389767e38 Mon Sep 17 00:00:00 2001 From: mi84kabv9 Date: Sat, 8 Jun 2024 17:44:13 +0800 Subject: [PATCH] ADD file via upload --- SEU_map.cpp | 823 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 823 insertions(+) create mode 100644 SEU_map.cpp diff --git a/SEU_map.cpp b/SEU_map.cpp new file mode 100644 index 0000000..86443a6 --- /dev/null +++ b/SEU_map.cpp @@ -0,0 +1,823 @@ +#include +#include +#include"MyGraph.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include"Function.h" +#include"Stack.h" +#include"MessageBox.h" +#include"Account.h" + +#define WIDTH (915 + (LEFTBORDER * 2)) +#define HEIGHT (722 + TOPBORDER + LEFTBORDER) +#define UP 72 +#define DOWN 80 +#define BACKGROUND "seu map.png" +#define BKCOLOR RGB(240, 240, 240) +#define SELECTCOLOR RGB(255, 0, 0) +#define TEXTCOLOR RGB(7, 102, 198) +#define MENUCOLOR (208, 161, 227) +#define CheckCancel if(is_cancel) {return -1;} + +int choose; +Graph_List graph; +Account account; +const int menu_num = 11; +int menu_top1 = 10; +int menu_top = menu_top + 3; +#define left (LEFTBORDER) +// 设置界面高度和宽度 +int menu_width = ((WIDTH - 2 * LEFTBORDER) / (menu_num)); +int menu_height = 30; +EasyTextBox txt_name; +EasyTextBox txt_password; +EasyButton btnOK; + +int get_choose(); +int front_menu(Graph_List & graph); // 界面 +int show_all_vertex(Graph_List & graph); // 显示所有节点 +int show_all_path(Graph_List & graph); // 显示所有路径 + +// 显示路径 +int printroad(int dx, int dy, int sx, int sy) { + LINESTYLE linestyle; // 定义线的样式 + getlinestyle(&linestyle); + setlinestyle(PS_SOLID, 3, NULL, 0); + line(sx, sy, dx, dy); + setlinestyle(&linestyle); + double x1 = (sx + dx) / 2; + double y1 = (sy + dy) / 2; + double x2 = ((3.0 / 8.0) * sx + (5.0 / 8.0) * dx); + double y2 = ((3.0 / 8.0) * sy + (5.0 / 8.0) * dy); + double k1 = (y2 - y1) / (x2 - x1); + double k2 = (-1) / k1; + double delta = 1600; + double a = sqrt((delta / 16) / (1 + k2 * k2)); + double b = a * fabs(k2); + if (((x1 > x2) && (y1 < y2)) || ((x1 < x2) && (y1 > y2))) { + } + else b = -1 * b; + if (x1 == x2) { + a = 5; + b = 0; + } + if (y1 == y2) { + a = 0; + b = 3; + } + // 坐标 + POINT pts[] = { {x1, y1}, {x2 + a, y2 + b}, {(x1 + x2) / 2, (y1 + y2) / 2} }; + POINT pts1[] = { {x1, y1}, {x2 * 2 - (x2 + a), y2 * 2 - (y2 + b)}, {(x1 + x2) / 2, (y1 + y2) / 2} }; + setfillcolor(BLUE); + solidpolygon(pts1, 3); // 画填充的多边形(无边框) + solidpolygon(pts, 3); + return 0; +} + +// 获取鼠标位置 +int get_mouse_xy(int& mousex, int& mousey) { + MOUSEMSG temp; + temp.mkLButton = false; // 鼠标左键是否按下 + bool kick = false; + while (!kick) { + temp = GetMouseMsg(); + FlushMouseMsgBuffer(); + if (temp.mkLButton == false) { + mousex = temp.x; + mousey = temp.y; + } + else kick = temp.mkLButton; + } + return 0; +} + +// 添加景点 +int add_vertex(Graph_List& graph) { + LOGFONT font; + gettextstyle(&font); + settextstyle(10, 0, _T("宋体")); + BeginBatchDraw(); + setlinecolor(GREEN); + for (int lx = LEFTBORDER; lx <= WIDTH; lx += 50) { + line(lx, TOPBORDER, lx, HEIGHT - LEFTBORDER); + } + for (int ly = TOPBORDER; ly <= HEIGHT - LEFTBORDER; ly += 50) { + line(LEFTBORDER, ly, WIDTH - LEFTBORDER, ly); + } + FlushBatchDraw(); + setlinecolor(MENUCOLOR); + settextstyle(&font); + // 弹出窗口 + ::MessageBox(GetHWnd(), (LPCSTR)"请点击您要添加景点的位置", (LPCTSTR)"添加景点", MB_OK); + int mousex, mousey; + get_mouse_xy(mousex, mousey); + char name[30]; + bool is_cancel = false; + // 获取用户输入 + is_cancel = !InputBox((LPTSTR)name, 30, (LPCTSTR)"输入名称", (LPCTSTR)"添加景点", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + char description[1000]; + is_cancel = !InputBox((LPTSTR)(&(description[0])), 1000, (LPCTSTR)"输入简介:(按Ctrl+Enter确认输入)", (LPCTSTR)"添加景点", (LPCTSTR)"0", 0, 10, 0); + CheckCancel; + char mark[10]; + int marki; + while (true) { + is_cancel = !InputBox(LPTSTR(&(mark[0])), 10, (LPCTSTR)"输入代号", (LPCTSTR)"添加景点", 0, 0, 0, 0); + CheckCancel; + marki = str_to_num(mark); + if (marki > 0 && graph.get_index(marki) == -1) break; + ::MessageBox(GetHWnd(), (LPCTSTR)"此代号已存在,请重新输入", (LPCTSTR)"添加景点", MB_OK); + } + std::string namestr = "", descriptionstr = ""; + // 把数据插入到节点 + graph.insert_vertex((std::string)(namestr + name), (std::string)(descriptionstr + description), marki, mousex, mousey); + ::MessageBox(GetHWnd(), (LPCTSTR)"添加成功", (LPCTSTR)"添加景点", MB_OK); + return 0; +} +int add_path(Graph_List& graph) { + bool is_cancel = false; + int v1, v2; + std::string source = "0000000000", destination = "0000000000", weightstr = "0000000000"; + while (true) { + is_cancel = !InputBox(LPTSTR(&(source[0])), 10, (LPCTSTR)"输入起点代号", (LPCTSTR)"添加边", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + v1 = str_to_num(source); + if (graph.get_index(v1) != -1) break; + ::MessageBox(GetHWnd(), (LPCTSTR)"该位置不存在,请重新输入", (LPCTSTR)"添加边", MB_OK); + } + while (true) { + is_cancel = !InputBox(LPTSTR(&(destination[0])), 10, (LPCTSTR)"请输入终点代号", (LPCTSTR)"添加边", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + v2 = str_to_num(destination); + if (graph.get_index(v2) != -1) break; + ::MessageBox(GetHWnd(), (LPCTSTR)"该位置不存在,请重新输入", (LPCTSTR)"添加边", MB_OK); + } + double dx = graph.get_head()[graph.get_index(v2)].get_x(); + double sx = graph.get_head()[graph.get_index(v1)].get_x(); + double dy = graph.get_head()[graph.get_index(v2)].get_y(); + double sy = graph.get_head()[graph.get_index(v1)].get_y(); + double weight = (double)sqrt(((dx - sx) * (dx - sy) + (dy - sy) * (dy - sy)) / 30000.0) * 300.0; + int retop = graph.insert_edge(graph.get_index(v1), graph.get_index(v2), weight); + if (retop == -3) { ::MessageBox(GetHWnd(), (LPCTSTR)"起点与终点相同!", (LPCTSTR)"添加边", MB_OK); return -3; } + if (retop == -4) { ::MessageBox(GetHWnd(), (LPCTSTR)"边已存在!", (LPCTSTR)"添加边", MB_OK); return -4; } + ::MessageBox(GetHWnd(), (LPCTSTR)"添加成功", (LPCTSTR)"添加边", MB_OK); + return 0; +} +int delete_vertex(Graph_List& graph) { + bool is_cancel = false; + char v[10]; + int v1; + while (true) { + is_cancel = !InputBox(LPTSTR(&(v[0])), 10, (LPCTSTR)"输入代号", (LPCTSTR)"删除景点", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + v1 = str_to_num(v); + if (graph.get_index(v1) != -1) break; + ::MessageBox(GetHWnd(), (LPCTSTR)"此代号不存在,请重输", (LPCTSTR)"删除景点", MB_OK); + } + graph.delete_vertex(graph.get_index(v1)); + return 0; +} +int delete_path(Graph_List& graph) { + bool is_cancel = false; + int v1, v2; + std::string source = "0000000000", destination = "0000000000"; + while (true) { + is_cancel = !InputBox(LPTSTR(&(source[0])), 10, (LPCTSTR)"输入起点代号", (LPCTSTR)"删除边", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + v1 = str_to_num(source); + if (graph.get_index(v1) != -1) break; + ::MessageBox(GetHWnd(), (LPCTSTR)"该位置不存在,请重输", (LPCTSTR)"删除边", MB_OK); + } + while (true) { + is_cancel = !InputBox(LPTSTR(&(destination[0])), 10, (LPCTSTR)"输入终点代号", (LPCTSTR)"删除边", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + v2 = str_to_num(destination); + if (graph.get_index(v2) != -1) break; + ::MessageBox(GetHWnd(), (LPCTSTR)"该位置不存在,请重输", (LPCTSTR)"删除边", MB_OK); + + } + int retop = graph.delete_edge(graph.get_index(v1), graph.get_index(v2)); + if (retop == -1) { ::MessageBox(GetHWnd(), (LPCTSTR)"边不存在!", (LPCTSTR)"删除边", MB_OK); return -1; } + + ::MessageBox(GetHWnd(), (LPCTSTR)"删除成功", (LPCTSTR)"删除边", MB_OK); + return 0; +} + +// 画出最短路径 +int draw_shortest_path(Graph_List& graph, int v1, int v2) { + Vertex* Head = graph.get_head(); + + int* path = new int[graph.number_of_vertices()]; + graph.dshortest_path(v1, path); + Stack s; + if (path[v2] == -1) { + ::MessageBox(GetHWnd(), (LPCTSTR)"*** 无路径 ***", (LPCTSTR)"查询路径", MB_OK); + return -1; + } + int i = v2; + while (i != path[v1]) { + s.push(i); + i = path[i]; + } + delete[]path; + + int temp = v1, temppre = v1, length = 0; + std::string pathstr, tempstr; + // 开始批量绘制 + BeginBatchDraw(); + while (!s.empty()) { + temp = s.peek(); + s.pop(); + // 显示路径 + printroad(Head[temppre].get_x(), Head[temppre].get_y(), Head[temp].get_x(), Head[temp].get_y()); + int path_weight = graph.get_weight(temppre, temp); + length += path_weight; + tempstr = tempstr + "从" + int_to_str(Head[temppre].get_mark()) + "到" + int_to_str(Head[temp].get_mark()) + ":" + int_to_str(path_weight) + "米\n"; + temppre = temp; + } + FlushBatchDraw(); + setbkcolor(BKCOLOR); + settextcolor(TEXTCOLOR); + std::string str = "最短路径长度为:"; + str = str + int_to_str(length) + " 米\n步行所需时间:" + int_to_str(length / 90) + "分钟\n"; + str += tempstr; + ::MessageBox(GetHWnd(), LPTSTR(&str[0]), (LPCTSTR)"查询路径", MB_OK); + return 0; +} +// 查找路径 +int find_path(Graph_List& graph) { + bool is_cancel = false; + int v1, v2; + std::string source = "0000000000", destination = "0000000000"; + while (true) { + is_cancel = !InputBox(LPTSTR(&(source[0])), 10, (LPCTSTR)"输入起点代号", (LPCTSTR)"查询路径", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + v1 = str_to_num(source); + if (graph.get_index(v1) != -1) break; + ::MessageBox(GetHWnd(), (LPCTSTR)"该位置不存在,请重输", (LPCTSTR)"查询路径", MB_OK); + } + while (true) { + is_cancel = !InputBox(LPTSTR(&(destination[0])), 10, (LPCTSTR)"输入终点代号", (LPCTSTR)"查询路径", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + v2 = str_to_num(destination); + if (graph.get_index(v2) != -1) break; + ::MessageBox(GetHWnd(), (LPCTSTR)"该位置不存在,请重输", (LPCTSTR)"查询路径", MB_OK); + } + draw_shortest_path(graph, graph.get_index(v1), graph.get_index(v2)); + return 0; +} + +// 画出最长路径 +int draw_longest_path(Graph_List& graph, int v1, int v2) { + Vertex* Head = graph.get_head(); + + int* path = new int[graph.number_of_vertices()]; + graph.dlongest_path(v1, path); + Stack s; + if (path[v2] == -1) { + ::MessageBox(GetHWnd(), (LPCTSTR)"*** 无路径 ***", (LPCTSTR)"查询路径", MB_OK); + return -1; + } + int i = v2; + while (i != path[v1]) { + s.push(i); + i = path[i]; + } + delete[] path; + + int temp = v1, temppre = v1, length = 0; + std::string pathstr, tempstr; + BeginBatchDraw();// 开始批量绘制 + while (!s.empty()) { + temp = s.peek(); + s.pop(); + printroad(Head[temppre].get_x(), Head[temppre].get_y(), Head[temp].get_x(), Head[temp].get_y());//显示路径 + int pathweight = graph.get_weight(temppre, temp); + length += pathweight; + tempstr = tempstr + "从" + int_to_str(Head[temppre].get_mark()) + "到" + int_to_str(Head[temp].get_mark()) + " : " + int_to_str(pathweight) + " 米" + "\n"; + temppre = temp; + } + + FlushBatchDraw();// 执行未完成的绘制任务 + setbkcolor(BKCOLOR);// 显示颜色 + settextcolor(TEXTCOLOR);//显示颜色 + std::string str = "最短路径长度为:"; + str = str + int_to_str(length) + " 米\n" + "步行所需时间:" + int_to_str(length / 90) + "分钟\n"; + str += tempstr; + ::MessageBox(GetHWnd(), LPTSTR(&str[0]), (LPCTSTR)"查询路径", MB_OK); + return 0; +} + +// 漫游模式 +int wandering(Graph_List& grpah) { + bool is_cancel = false; + int v1, v2; + std::string source = "0000000000", destination = "0000000000"; + while (true) { + is_cancel = !InputBox(LPTSTR(&(source[0])), 10, (LPCTSTR)"输入起点代号", (LPCTSTR)"漫游模式", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + v1 = str_to_num(source); + if (graph.get_index(v1) == -1) ::MessageBox(GetHWnd(), (LPCTSTR)"该位置不存在,请重输", (LPCTSTR)"漫游模式", MB_OK); + else break; + } + while (true) { + is_cancel = !InputBox(LPTSTR(&(destination[0])), 10, (LPCTSTR)"输入终点代号", (LPCTSTR)"漫游模式", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + v2 = str_to_num(destination); + if (graph.get_index(v1) == -1) ::MessageBox(GetHWnd(), (LPCTSTR)"该位置不存在,请重输", (LPCTSTR)"漫游模式", MB_OK); + else break; + } + draw_longest_path(graph, graph.get_index(v1), graph.get_index(v2)); + return 0; +} + +void show_vertex(Graph_List& graph, int i) { + Vertex* Head = graph.get_head(); + if (i < 0 || i > graph.number_of_vertices() - 1) { + ::MessageBox(GetHWnd(), (LPCTSTR)"查询位置不存在", (LPCTSTR)"景点查询", MB_OK); //GetHWnd()获得窗口句柄 + return; + } + std::string str = "代号:" + int_to_str(Head[i].get_mark()) + "\n" + "简介: " + Head[i].get_Description(); + str = "名称:" + Head[i].get_VerName() + "\n" + str; + ::MessageBox(GetHWnd(), LPTSTR(&str[0]), (LPCTSTR)"景点查询", MB_OK); //GetHWnd()获得窗口句柄 +} + +// 修改菜单 + +int ModifyMenu() { + int choose1 = 1; + char temp = 0, key; + while (temp != '\r') { + if (_kbhit()) { + key = _getch(); // 读取字符 + fflush(stdin); // 清除读写缓冲区 + switch (key) { + case UP: choose1--; break; + case DOWN: choose1++; break; + } + } + if (choose1 == 6) choose1 = 5; + if (choose1 == 0) choose1 = 1; + IMAGE img; + loadimage(&img, (LPCTSTR)"R-C.jpg", WIDTH, HEIGHT); + cleardevice(); + putimage(0, 0, &img); + // transparentimage3(NULL, 0, 0, &img); + outtextxy((WIDTH / 2) - 80, 120, (LPCTSTR)"修改景点"); + outtextxy((WIDTH / 2) - 180, 230, (LPCTSTR)"按↑和↓选择选项"); + outtextxy((WIDTH / 2) - 180, 250, (LPCTSTR)"按ENTER键确定选择"); + outtextxy(300, 300, (LPCTSTR)"请选择选项:"); + outtextxy(420, 350, (LPCTSTR)"修改名称"); + outtextxy(420, 380, (LPCTSTR)"修改简介"); + outtextxy(420, 410, (LPCTSTR)"修改代号"); + outtextxy(420, 440, (LPCTSTR)"修改坐标"); + outtextxy(420, 470, (LPCTSTR)"返回"); + outtextxy(390, 350 + (choose1 - 1) * 30, (LPCTSTR)"→"); + FlushBatchDraw();// 执行未完成的绘制任务 + temp = _getch(); + } + return choose1; +} +// 修改景点 +int modify_vertex(Graph_List& graph) { + bool is_cancel = false; + int v1; + char v1str[10] = { 'a' }; + while (true) { + is_cancel = !InputBox(LPTSTR(&(v1str[0])), 10, (LPCTSTR)"输入代号", (LPCTSTR)"修改景点", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + v1 = str_to_num(v1str); + if (graph.get_index(v1) != -1) break; + ::MessageBox(GetHWnd(), (LPCTSTR)"该位置不存在,请重输", (LPCTSTR)"修改景点", MB_OK); + } + int v = graph.get_index(v1); + Vertex* Head = graph.get_head(); + std::string name = Head[v].get_VerName(); + std::string description = Head[v].get_Description(); + int marki = Head[v].get_mark(); + int x = Head[v].get_x(); + int y = Head[v].get_y(); + bool is_return = false; + while (!is_return) { + int in = ModifyMenu(); + switch (in) { + case 1: { + is_cancel = !InputBox(LPTSTR(&(name[0])), 30, (LPCTSTR)"输入名称", (LPCTSTR)"修改景点", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + break; + } + case 2: { + is_cancel = !InputBox(LPTSTR(&(description[0])), 1000, (LPCTSTR)"输入简介:(按Ctrl+Enter确认输入)", (LPCTSTR)"修改景点", (LPCTSTR)"0", 0, 10, 0); + CheckCancel; + break; + } + case 3: { + char mark[10]; + while (true) { + is_cancel = !InputBox(LPTSTR(&(mark[0])), 10, (LPCTSTR)"输入代号", (LPCTSTR)"修改景点", 0, 0, 0, 0); + CheckCancel; + marki = str_to_num(mark); + if (marki > 0 && (marki == Head[v].get_mark() || graph.get_index(marki) == -1)) { + break; + } + ::MessageBox(GetHWnd(), (LPCTSTR)"输入有误或代号已存在,请重输", (LPCTSTR)"修改景点", MB_OK); + + } + break; + } + case 4: { + char xstr[10], ystr[10]; + while (true) { + is_cancel = !InputBox(LPTSTR(&(xstr[0])), 10, (LPCTSTR)"输入X坐标", (LPCTSTR)"修改景点", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + x = str_to_num(xstr); + if (x > 0 && x < WIDTH) break; + ::MessageBox(GetHWnd(), (LPCTSTR)"您所输入的坐标不在图像范围内", (LPCTSTR)"修改景点", MB_OK); + } + while (true) { + is_cancel = !InputBox(LPTSTR(&(ystr[0])), 10, (LPCTSTR)"输入Y坐标", (LPCTSTR)"修改景点", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + y = str_to_num(ystr); + if (y > 0 && y < HEIGHT) break; + ::MessageBox(GetHWnd(), (LPCTSTR)"您所输入的坐标不在图像范围内", (LPCTSTR)"修改景点", MB_OK); + } + break; + } + case 5: { + graph.modify_vertex(v, name, description, marki, x, y); + show_vertex(graph, v); + is_return = true; + break; + } + default: break; + } + } + return 0; +} + +// 显示节点 +int show_all_vertex(Graph_List& graph) { + Vertex* Head = graph.get_head(); + setbkcolor(RGB(240, 240, 240)); + settextcolor(RED); + setfillcolor(RGB(255, 0, 0)); + LOGFONT font1; + gettextstyle(&font1); + settextstyle(font1.lfHeight - 2, 0, _T("宋体")); + for (int i = 0; i < graph.number_of_vertices(); i++) { + int x = Head[i].get_x(), y = Head[i].get_y(); + std::string str = ""; + str += int_to_str(Head[i].get_mark()); // 在地图上显示名称 + if (Head[i].get_VerName() != "*") str = str + " " + Head[i].get_VerName(); + solidcircle(x, y, 4); // 显示节点 + outtextxy(x, y, (LPCTSTR)&str[0]); // 输出str字符串 + } + settextstyle(&font1); + FlushBatchDraw(); + return 0; +} +int show_all_path(Graph_List& graph) { + LINESTYLE linestyle; + getlinestyle(&linestyle); + setlinestyle(PS_SOLID, 3, NULL, 0); + setlinecolor(BLUE); + for (int i = 0; i < graph.number_of_vertices(); i++) { + Edge* p = graph.get_head()[i].get_adjacent(); + while (p) { + // 画出当前节点与相邻节点的边 + line(graph.get_head()[i].get_x(), graph.get_head()[i].get_y(), + graph.get_head()[p->get_VerAdj()].get_x(), + graph.get_head()[p->get_VerAdj()].get_y()); + p = p->get_link(); // 指向下一个节点的邻边 + } + } // 画出所有边 + setlinestyle(&linestyle); + FlushBatchDraw(); + return 0; +} + +// 查找 +int find_menu() { + int choose1 = 1; + char temp = 0, key; + while (temp != '\r') { + if (_kbhit()) { + key = _getch(); + fflush(stdin); + switch (key) { + case UP: { + choose1--; + break; + } + case DOWN: { + choose1++; + break; + } + } + } + if (choose1 == 4) choose1 = 3; + if (choose1 == 0) choose1 = 1; + cleardevice(); + IMAGE img; + loadimage(&img, (LPCTSTR)"R-C.jpg", WIDTH, HEIGHT); + putimage(0, 0, &img); + outtextxy((WIDTH / 2) - 80, 120, (LPCTSTR)"查询景点");//在指定位置输出字符串 + outtextxy((WIDTH / 2) - 180, 230, (LPCTSTR)"按↑和↓选择选项"); + outtextxy((WIDTH / 2) - 180, 250, (LPCTSTR)"按ENTER键确定选择"); + outtextxy(300, 300, (LPCTSTR)"请选择选项:"); + outtextxy(420, 350, (LPCTSTR)"按代号查询"); + outtextxy(420, 380, (LPCTSTR)"按名称查询"); + outtextxy(420, 410, (LPCTSTR)"返回"); + outtextxy(390, 350 + (choose1 - 1) * 30, (LPCTSTR)"→"); + FlushBatchDraw(); + temp = _getch(); + } + return choose1; +} + +// 查找景点 +int find_vertex(Graph_List& graph) { + bool is_cancel = false; + bool is_return = false; + while (!is_return) { + int in = find_menu(); + switch (in) { + case 1: { + char v1str[10] = { 'a' }; + int v1; + is_cancel = !InputBox(LPTSTR(&(v1str[0])), 10, (LPCTSTR)"输入代号", (LPCTSTR)"查询景点", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + v1 = str_to_num(v1str); + show_vertex(graph, graph.get_index(v1)); + break; + } + case 2: { + char v1str[10] = { 'a' }; + std::string v1; + is_cancel = !InputBox(LPTSTR(&(v1str[0])), 10, (LPCTSTR)"输入名称", (LPCTSTR)"查询景点", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + v1 = ""; + v1 += v1str; + show_vertex(graph, graph.get_index(v1)); + break; + } + case 3: { + is_return = true; + break; + } + default: {} break; + } + } + return 0; +} + +// 打开文件 +int open(Graph_List& graph, bool is_first_open) { + std::fstream filestr; + char mapname[256] = { 'a' }; // map_name保存文件名 + if (is_first_open) { + filestr.open("map.txt"); + strcpy_s(mapname, "seu map.png"); + } + else { + bool is_cancel = false; + char filename[256] = { 'a' }; + while (true) { + is_cancel = !InputBox((LPTSTR) & (filename[0]), 10, (LPCTSTR)"输入文本文件名(不需输'.txt')", (LPCTSTR)"打开", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + strcat_s(filename, ".txt"); + filestr.open(filename); + if (filestr.is_open()) break; + ::MessageBox(GetHWnd(), (LPCTSTR)"无此文件,请重输", (LPCTSTR)"打开", MB_OK); //提示框 + + } + while (true) { + is_cancel = !InputBox((LPTSTR) & (mapname[0]), 10, (LPCTSTR)"输入图片文件名(不需输'.png')", (LPCTSTR)"打开", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + strcat_s(mapname, ".png"); + if ((_access(mapname, 0)) != -1) { //_access,判断文件是否存在,如果文件具有指定的访问权限,则函数返回0;如果文件不存在或者不能访问指定的权限,则返回-1. + break; + } + ::MessageBox(GetHWnd(), (LPCTSTR)"无此文件,请重输", (LPCTSTR)"打开", MB_OK); + } + } + // 从文件中提取节点和边信息绘制图 + graph.graph_con(filestr, mapname); + filestr.close(); + putimage(LEFTBORDER, TOPBORDER, graph.get_map()); + return 0; +} + +// 保存文件 +int save(Graph_List& graph) { + bool is_cancel = false; + Vertex* head = graph.get_head(); + char filename[256] = { 'a' }; + is_cancel = !InputBox((LPTSTR) & (filename[0]), 10, (LPCTSTR)"输入文本文件名(不需输'.txt')", (LPCTSTR)"保存", (LPCTSTR)"0", 0, 0, 0); + CheckCancel; + strcat_s(filename, ".txt"); + graph.save_file(filename); + ::MessageBox(GetHWnd(), (LPCTSTR)"保存成功", (LPCTSTR)"保存", MB_OK); + return 0; +} +int get_choose() { + FlushMouseMsgBuffer(); // 清空鼠标消息缓冲区 + MOUSEMSG temp; + temp.mkLButton = false; + bool kick = false; + while (!kick) { + temp = GetMouseMsg(); // 获取一个鼠标信息,若没有则等待 + FlushMouseMsgBuffer(); + if (temp.mkLButton == false) { + } + else { + if (temp.y < menu_top + menu_height && temp.y > menu_top) kick = true; + } + } + choose = (temp.x - left) / menu_width; + return 0; +} +// 菜单 +int front_menu(Graph_List& graph) { + fflush(stdin); + settextcolor(TEXTCOLOR); + setfillcolor(BKCOLOR); + solidrectangle(5, TOPBORDER, WIDTH, HEIGHT); //以背景色刷新 + setfillcolor(MENUCOLOR); + solidrectangle(5, 0, WIDTH - 5, menu_top1); //画最上方的绿色条 + putimage(LEFTBORDER, TOPBORDER, graph.get_map()); + setfillcolor(BKCOLOR); + solidrectangle(LEFTBORDER, menu_top + textheight('a'), WIDTH - LEFTBORDER, menu_top + textheight('a') + 5); //去掉选中的菜单下方的小绿块 + setfillcolor(TEXTCOLOR); + setfillcolor(MENUCOLOR); + solidrectangle(choose * menu_width + left, menu_top + textheight('a'), + (choose + 1) * menu_width + left, menu_top + textheight('a') + 5); //画选中的菜单下方的小绿块 + roundrect(5, menu_top + textheight('a') + 5, WIDTH - 5, HEIGHT - 5, 5, 3); //画图片周围的绿色边框 + solidrectangle(5, menu_top + textheight('a') + 5, WIDTH - 5, menu_top + textheight('a') + 10); //画图片上方与小绿块相连的绿色条 + setfillcolor(TEXTCOLOR); + LOGFONT font1; + gettextstyle(&font1); + settextstyle(font1.lfHeight, 0, _T("宋体")); + std::string menu[menu_num] = { " 打开", " 显示", " 查询路径", + " 查询景点", " 修改景点", " 添加景点", " 删除景点", + " 添加边", " 删除边"," 保存", " 退出"};//菜单栏 + for (int index = 0; index <= menu_num - 1; index++) { + if (index == choose)settextcolor(SELECTCOLOR); + const char* p = menu[index].c_str(); + outtextxy(left + index * menu_width, menu_top, (LPCTSTR)p); + if (index == choose)settextcolor(TEXTCOLOR); + } + settextstyle(&font1); + setlinecolor(MENUCOLOR); + for (int index1 = 0; index1 <= menu_num + 1; index1++) { + line(left + index1 * menu_width, menu_top, left + index1 * menu_width, menu_top + textheight('a')); + } + LOGFONT font; + gettextstyle(&font); + settextstyle(10, 0, _T("宋体")); + settextcolor(TEXTCOLOR); + for (int lx = LEFTBORDER; lx <= WIDTH; lx += 50) { + outtextxy(lx, TOPBORDER - 10, (LPCTSTR)&int_to_str(lx - LEFTBORDER)[0]); + } + for (int ly = TOPBORDER; ly <= HEIGHT - LEFTBORDER; ly += 50) { + outtextxy(10, ly - 5, (LPCTSTR)&int_to_str(ly - TOPBORDER)[0]); + } + settextstyle(&font); + settextcolor(TEXTCOLOR); + FlushBatchDraw(); + setbkcolor(BKCOLOR); + settextcolor(TEXTCOLOR); + return choose; +} +void on_btnOK_click() { + if (wcscmp(L"123", txt_password.get_text())) { + MessageBox(GetHWnd(), (LPCTSTR)"密码错误", (LPCTSTR)"错误", MB_OK); + } + else { + wchar_t s[100] = L"Hello, "; + wcscat_s(s, 100, txt_name.get_text()); + MessageBox(GetHWnd(), (LPCTSTR)s, (LPCTSTR)"登陆成功", MB_OK); + } +} +//void log_in() { +// initgraph(640, 480); +// setbkcolor(0xeeeeee); +// cleardevice(); +// settextcolor(BLACK); +// outtextxy(50, 55, (LPCTSTR)"用户名:"); +// txt_name.create(120, 50, 400, 75, 10); +// outtextxy(50, 105, (LPCTSTR)"密 码:"); +// txt_password.create(120, 100, 400, 125, 10); +// btnOK.create(320, 150, 400, 175, L"OK", on_btnOK_click); +// +// ExMessage msg; +// while (true) { +// msg = getmessage(EX_MOUSE); // 获取消息输入 +// if (msg.message == WM_LBUTTONDOWN) { +// // 判断控件 +// if (txt_name.check(msg.x, msg.y)) txt_name.on_message(); +// if (txt_password.check(msg.x, msg.y)) txt_password.on_message(); +// if (btnOK.check(msg.x, msg.y)) btnOK.on_message(); +// } +// } +// // 关闭窗口 +// closegraph(); +// return; +//} + + + +int main() { + // log_in(); + + initgraph(WIDTH, HEIGHT); + setbkcolor(BKCOLOR); + cleardevice(); + log_in_2(account); + bool is_first_open = true; + while (true) { + front_menu(graph); + if (is_first_open) choose = 0; + else get_choose(); + front_menu(graph); + switch (choose) { + case 0: { + open(graph, is_first_open); + is_first_open = false; + break; + } + case 1: { + show_all_path(graph); + show_all_vertex(graph); + int vertex_num = graph.number_of_vertices(); + int edge_num = graph.number_of_edges(); + std::string num_of_vertices; + num_of_vertices = "图中共有景点 " + int_to_str(vertex_num) + "个\n" + "共有边" + int_to_str(edge_num) + "条\n"; + ::MessageBox(GetHWnd(), LPCSTR(&num_of_vertices[0]), (LPCSTR)"显示", MB_OK); + break; + } + case 2: { + show_all_vertex(graph); + find_path(graph); + show_all_vertex(graph); + break; + } + //case 3: { + // // std::cout << 1 << std::endl; + // show_all_vertex(graph); + // wandering(graph); + // show_all_vertex(graph); + // break; + //} + case 3: { + show_all_vertex(graph); + find_vertex(graph); + break; + } + case 4: { + show_all_vertex(graph); + modify_vertex(graph); + break; + } + case 5: { + show_all_vertex(graph); + add_vertex(graph); + break; + } + case 6: { + show_all_vertex(graph); + delete_vertex(graph); + break; + } + case 7: { + show_all_path(graph); + show_all_vertex(graph); + add_path(graph); + break; + } + case 8: { + show_all_path(graph); + show_all_vertex(graph); + delete_path(graph); + break; + } + case 9: { + save(graph); + break; + } + case 10: { + WinExec((LPCSTR)_T("taskkill /f /im conhost.ext /t"), 1); + exit(0); + break; + } + default: break; + } + } + return 0; +} \ No newline at end of file