• EGE——c++——通讯录


    一、简介

    1、基础功能:增、查、删、改

    2、界面的交互功能:鼠标和按钮的交互,按钮的点击效果,界面切换动态效果

    3、以文档格式储存

    EGE中,窗口delay_fps()帧率刷新理解有一定提升。控制了重画界面的时机和次数,减小损耗;通过对redraw的不同赋值,实现界面内不同子界面的变化。

    二、界面相关代码

    头文件interface.h

    1. #pragma once
    2. #include
    3. using namespace std;
    4. //控制台开关
    5. #define SHOW_CONSOLE
    6. #include
    7. #include
    8. #include"addresslist.h"
    9. constexpr auto Windx = 600;
    10. constexpr auto Windy = 400;
    11. constexpr auto Windw = 800;
    12. constexpr auto Windh = 600;
    13. constexpr auto Caption = "通讯录";
    14. constexpr auto MaxSizeNameofButton = 24;
    15. //声明按钮类
    16. class Button {
    17. public:
    18. int b_x;
    19. int b_y;
    20. int b_w;
    21. int b_h;
    22. char b_name[MaxSizeNameofButton];
    23. int b_mouse_in_flag = 0;
    24. int b_down_flag = 0;
    25. Button() {}
    26. Button(int x, int y, int w, int h, const char* buttonname);
    27. void operator=(const Button& b);
    28. void draw_button();
    29. int mouse_in(mouse_msg& mouse);
    30. int mouse_down(mouse_msg& mouse);
    31. bool mouse_click(mouse_msg& mouse);
    32. };
    33. //初始化主按钮
    34. void init_mainbutton(Button* main_button, int n);
    35. //画界面,以函数指针为参数,返回值0-5分别代表主界面和4个分界面
    36. int draw_interface(int(*Interface)());
    37. //主界面
    38. int main_interface();
    39. //添加界面
    40. int add_interface();
    41. //搜索界面
    42. int search_interface();
    43. //修改界面
    44. int rec_interface();
    45. //删除界面
    46. int del_interface();
    47. //动态切换效果
    48. int dyn_interface(Button main_button[], int n);
    49. //初始化文本输入框
    50. void init_edit(sys_edit& edit, int x, int y, int w, int h);
    51. //检查按钮状态
    52. int check_button(Button* pbutton, int size, mouse_msg& mouse);
    53. //获取联系人信息
    54. Person get_person(sys_edit* editname, sys_edit* editage = NULL, sys_edit* edittel = NULL);
    55. //获取联系人ID
    56. int get_id(sys_edit& edit);
    57. //显示联系人
    58. void person_show(int index, int x, int y, int w, int h);

    interface.cpp各个界面的实现源码

    1. #pragma once
    2. #include"interface.h"
    3. #include
    4. //按钮构造函数
    5. Button::Button(int x, int y, int w, int h, const char * buttonname)
    6. {
    7. b_x = x;
    8. b_y = y;
    9. b_w = w;
    10. b_h = h;
    11. strcpy_s(b_name, buttonname);
    12. }
    13. //按钮=号重载,方便主界面按钮数组的初始化
    14. void Button::operator=(const Button & b)
    15. {
    16. b_x = b.b_x;
    17. b_y = b.b_y;
    18. b_w = b.b_w;
    19. b_h = b.b_h;
    20. strcpy_s(b_name, b.b_name);
    21. }
    22. //画按钮
    23. void Button::draw_button()
    24. {
    25. //记录原填充色和字体
    26. color_t tempcolor = getfillcolor();
    27. LOGFONT tempfont;
    28. getfont(&tempfont);
    29. //画按钮(矩形)
    30. int x = b_x, y = b_y, w = b_w, h = b_h;
    31. if (b_mouse_in_flag) {
    32. x = b_x - 2;
    33. y = b_y - 2 * h / w;
    34. w = b_w + 4;
    35. h = b_h + 4 * h / w;
    36. }
    37. else {
    38. x = b_x;
    39. y = b_y;
    40. w = b_w;
    41. h = b_h;
    42. }
    43. setfillcolor(EGEACOLOR(0x80, RGB(200, 200, 200)));
    44. ege_fillrect((float)x, (float)y, (float)w, (float)h);
    45. //按钮名称
    46. setfont(h / 2 + 5, 0, "黑体");
    47. setbkmode(TRANSPARENT);
    48. int strwidth = textwidth(b_name);
    49. int strheight = textheight(b_name);
    50. if (b_down_flag) {
    51. xyprintf(b_x + (b_w - strwidth) / 2, b_y + (b_h - strheight) / 2 + 2, b_name);
    52. }
    53. else {
    54. xyprintf(b_x + (b_w - strwidth) / 2, b_y + (b_h - strheight) / 2, b_name);
    55. }
    56. //恢复原来的填充色和字体
    57. setfillcolor(tempcolor);
    58. setfont(&tempfont);
    59. }
    60. //判断鼠标是否指向按钮,实现交互
    61. int Button::mouse_in(mouse_msg& mouse)
    62. {
    63. return mouse.x >= b_x && mouse.x <= b_x + b_w && mouse.y >= b_y && mouse.y <= b_y + b_h;
    64. }
    65. //判断按钮是否被按下
    66. int Button::mouse_down(mouse_msg& mouse)
    67. {
    68. return mouse_in(mouse) && mouse.is_left() && mouse.is_down();
    69. }
    70. //判断按钮是否被点击(鼠标按下后松开)
    71. bool Button::mouse_click(mouse_msg& mouse)
    72. {
    73. return mouse.is_up() && mouse.is_left() && b_down_flag;
    74. }
    75. //初始化主界面的按钮数组
    76. void init_mainbutton(Button* main_button, int n)
    77. {
    78. const char* Main_buttonname[] = { "添加联系人","查找联系人","修改联系人","删除联系人","退出通讯录" };
    79. int button_w = 200;
    80. int button_h = Windh / 11;
    81. int button_x = (Windw - button_w) / 2;
    82. int button_y = button_h;
    83. for (int i = 0; i < n; i++) {
    84. main_button[i] = Button(button_x, button_y + i * button_y * 2, button_w, button_h, Main_buttonname[i]);
    85. }
    86. }
    87. //画界面,以界面函数的指针为参数
    88. int draw_interface(int(*pInterface)())
    89. {
    90. return pInterface();
    91. }
    92. //主界面
    93. int main_interface() {
    94. int res = 0;
    95. //标记是否重画界面,不需要重画时可减小损耗
    96. int redraw = 1;
    97. static Button main_button[5];
    98. init_mainbutton(main_button, 5);
    99. mouse_msg mouse;
    100. while (mousemsg()) {
    101. mouse = getmouse();
    102. int checkflag = check_button(main_button, sizeof(main_button) / sizeof(main_button[0]), mouse);
    103. switch (checkflag) {
    104. case 0:
    105. case 1:
    106. case 2:
    107. case 3:
    108. case 4:
    109. res = checkflag + 1;
    110. main_button[checkflag].b_down_flag = 0;
    111. main_button[checkflag].b_mouse_in_flag = 0;
    112. redraw = 1;
    113. break;
    114. case 5:
    115. res = 0;
    116. redraw = 1;
    117. break;
    118. }
    119. }
    120. if (redraw) {
    121. cleardevice();
    122. setbkcolor(EGEACOLOR(0X80, RGB(255, 255, 255)));
    123. for (int i = 0; i < 5; i++) {
    124. main_button[i].draw_button();
    125. }
    126. }
    127. return res;
    128. }
    129. //添加界面
    130. int add_interface() {
    131. int res = 1;
    132. //定义一个主界面按钮,用来实现动态切换效果
    133. static Button main_button[5];
    134. //定义添加界面初始化完成标记
    135. static int initflag = 0;
    136. //动态切换效果开关
    137. static int dynflag = 0;
    138. //重画开关
    139. int redraw = 0;
    140. static sys_edit editname;
    141. static sys_edit editage;
    142. static sys_edit edittel;
    143. //添加界面标题按钮
    144. int button_w = 200;
    145. int button_h = Windh / 11;
    146. int button_x = (Windw - button_w) / 2;
    147. int button_y = button_h;
    148. Button add(button_x, button_y, button_w, button_h, "添加联系人");
    149. enum { cel, yes };
    150. static Button sec_button[2];
    151. sec_button[cel] = Button((Windw - 300) / 2 - textwidth("姓名:"), add.b_y + 380, 80, 40, "取消");
    152. sec_button[yes] = Button((Windw - 300) / 2 + 300 - 60, sec_button[cel].b_y, 80, 40, "确定");
    153. //三个输入框和主界面按钮数组初始化,一个添加界面只初始化1次
    154. if (initflag == 0) {
    155. init_mainbutton(main_button, 5);
    156. init_edit(editname, (Windw - 300) / 2, main_button[0].b_y + 100, 320, 30);
    157. init_edit(editage, (Windw - 300) / 2, main_button[0].b_y + 200, 320, 30);
    158. init_edit(edittel, (Windw - 300) / 2, main_button[0].b_y + 300, 320, 30);
    159. editname.setfocus();
    160. initflag = 1;
    161. }
    162. //动态切换效果未完成时,重画界面动态界面
    163. if (dynflag < 5) {
    164. dynflag = dyn_interface(main_button, 5);
    165. redraw = 1;
    166. }//完成时,重画一次输入界面
    167. else if (dynflag == 5) {
    168. redraw = 2;
    169. dynflag = 6;
    170. }
    171. //定义一个计时器开始标记
    172. static clock_t start;
    173. static int tip = 0;
    174. mouse_msg mouse;
    175. while (mousemsg()) {
    176. //按钮和鼠标的交互
    177. mouse = getmouse();
    178. //取消按钮和确定按钮的鼠标指向效果,重画输入界面
    179. int size = sizeof(sec_button) / sizeof(sec_button[0]);
    180. int checkflag = check_button(sec_button, size, mouse);
    181. switch (checkflag) {
    182. case 0: {
    183. res = 0;
    184. sec_button[cel].b_mouse_in_flag = 0;
    185. editname.destroy();
    186. editage.destroy();
    187. edittel.destroy();
    188. dynflag = 0;
    189. initflag = 0;
    190. }break;
    191. case 1: {
    192. res = 1;
    193. tip = 1;
    194. Person p = get_person(&editname, &editage, &edittel);
    195. if (address.work_add(p) != -1) {
    196. start = clock();
    197. }
    198. }
    199. case 2: {
    200. redraw = 2;
    201. }break;
    202. }
    203. }
    204. clock_t end = clock();
    205. if (tip == 1 && end - start >= 1000) {
    206. cout << tip << endl;
    207. //满足计时条件,关闭提示信息,重画1次界面
    208. redraw = 2;
    209. tip = 0;
    210. editname.settext("");
    211. editage.settext("");
    212. edittel.settext("");
    213. editname.setfocus();
    214. }
    215. if (redraw) {
    216. cleardevice();
    217. setbkcolor(EGEACOLOR(0X80, RGB(255, 255, 255)));
    218. switch (redraw) {
    219. case 1:
    220. for (int i = 0; i < 5; i++) {
    221. main_button[i].draw_button();
    222. }
    223. if (dynflag != 5) redraw = 0;
    224. else redraw = 1;
    225. break;
    226. case 2:
    227. add.draw_button();
    228. xyprintf(editname.getx() - textwidth("姓名:"), editname.gety() + 5, "姓名:");
    229. xyprintf(editname.getx() - textwidth("年龄:"), editage.gety() + 5, "年龄:");
    230. xyprintf(editname.getx() - textwidth("电话:"), edittel.gety() + 5, "电话:");
    231. editname.visible(true);
    232. editage.visible(true);
    233. edittel.visible(true);
    234. sec_button[cel].draw_button();
    235. sec_button[yes].draw_button();
    236. if (tip) {
    237. xyprintf(sec_button[cel].b_x + sec_button[cel].b_w + ((sec_button[yes].b_x - sec_button[cel].b_x - sec_button[cel].b_w) - textwidth("添加成功")) / 2, sec_button[cel].b_y, "添加成功");
    238. }
    239. redraw = 0;
    240. break;
    241. }
    242. }
    243. return res;
    244. }
    245. //搜索界面
    246. int search_interface() {
    247. int res = 2;
    248. //定义一个主界面按钮,用来实现动态切换效果
    249. static Button main_button[5];
    250. //定义添加界面初始化完成标记
    251. static int initflag = 0;
    252. //动态切换效果开关
    253. static int dynflag = 0;
    254. //重画开关
    255. int redraw = 0;
    256. static sys_edit edit;
    257. //添加界面标题按钮
    258. int button_w = 200;
    259. int button_h = Windh / 11;
    260. int button_x = (Windw - button_w) / 2;
    261. int button_y = button_h;
    262. Button search(button_x, button_y, button_w, button_h, "搜索联系人");
    263. enum { cel, yes };
    264. static Button sec_button[2];
    265. //输入框和主界面按钮数组初始化,一个添加界面只初始化1次
    266. int printx = 0;
    267. if (initflag == 0) {
    268. init_mainbutton(main_button, 5);
    269. init_edit(edit, (Windw - 360) / 2, main_button[0].b_y + 150, 360, 30);
    270. edit.setfocus();
    271. sec_button[cel] = Button(search.b_x - 80, search.b_y + 380, 80, 40, "取消");
    272. sec_button[yes] = Button(search.b_x + search.b_w, sec_button[cel].b_y, 80, 40, "确定");
    273. initflag = 1;
    274. }
    275. //动态切换效果未完成时,重画界面动态界面
    276. if (dynflag < 5) {
    277. dynflag = dyn_interface(main_button, 5);
    278. redraw = 1;
    279. }//完成时,重画一次输入界面
    280. else if (dynflag == 5) {
    281. redraw = 2;
    282. dynflag = 6;
    283. }
    284. static int index = -1;
    285. mouse_msg mouse;
    286. while (mousemsg()) {
    287. mouse = getmouse();
    288. int size = sizeof(sec_button) / sizeof(sec_button[0]);
    289. int checkflag = check_button(sec_button, size, mouse);
    290. switch (checkflag) {
    291. case 0: {
    292. res = 0;
    293. sec_button[cel].b_mouse_in_flag = 0;
    294. sec_button[yes].b_down_flag = 0;
    295. strcpy_s(sec_button[yes].b_name, "确定");
    296. intArray.init();
    297. edit.destroy();
    298. dynflag = 0;
    299. initflag = 0;
    300. }break;
    301. case 1: {
    302. if (strcmp(sec_button[yes].b_name, "确定") == 0) {
    303. res = 2;
    304. sec_button[yes].b_down_flag = 0;
    305. Person p = get_person(&edit);
    306. address.work_search(p.p_name);
    307. if (intArray.m_cnt) {
    308. index = 0;
    309. strcpy_s(sec_button[yes].b_name, "修改");
    310. redraw = 3;
    311. }
    312. else {
    313. redraw = 2;
    314. }
    315. }
    316. else {
    317. res = 3;
    318. sec_button[cel].b_mouse_in_flag = 0;
    319. sec_button[yes].b_down_flag = 0;
    320. intArray.init();
    321. edit.destroy();
    322. dynflag = 0;
    323. initflag = 0;
    324. redraw = 0;
    325. }
    326. }break;
    327. case 2: {
    328. if (intArray.m_cnt) {
    329. redraw = 3;
    330. }
    331. else {
    332. redraw = 2;
    333. }
    334. }break;
    335. }
    336. if (intArray.m_cnt&&mouse.is_wheel()) {
    337. index += -mouse.wheel / 120;
    338. if (index < 0) index = 0;
    339. if (index >= intArray.m_cnt) index = intArray.m_cnt - 1;
    340. redraw = 3;
    341. }
    342. }
    343. if (redraw) {
    344. cleardevice();
    345. setbkcolor(EGEACOLOR(0X80, RGB(255, 255, 255)));
    346. switch (redraw) {
    347. case 1:
    348. for (int i = 0; i < 5; i++) {
    349. main_button[i].draw_button();
    350. }
    351. break;
    352. case 2:
    353. search.draw_button();
    354. setfont(search.b_h / 2, 0, "楷体");
    355. printx = (Windw - textwidth("请输入查找内容")) / 2;
    356. xyprintf(printx, search.b_y + search.b_h + 50, "请输入查找内容");
    357. edit.visible(true);
    358. sec_button[cel].draw_button();
    359. sec_button[yes].draw_button();
    360. break;
    361. case 3:
    362. search.draw_button();
    363. edit.visible(false);
    364. sec_button[cel].draw_button();
    365. sec_button[yes].draw_button();
    366. int w = 400;
    367. int x = (Windw - w) / 2;
    368. int h = Windh / 5;
    369. int y = h;
    370. person_show(index, x, y, w, h);
    371. if (index < intArray.m_cnt - 1) {
    372. y = y + h + 2;
    373. person_show(index + 1, x, y, w, h);
    374. }
    375. break;
    376. }
    377. }
    378. return res;
    379. }
    380. //修改界面
    381. int rec_interface() {
    382. int res = 3;
    383. //定义一个主界面按钮,用来实现动态切换效果
    384. static Button main_button[5];
    385. //定义添加界面初始化完成标记
    386. static int initflag = 0;
    387. //动态切换效果开关
    388. static int dynflag = 0;
    389. //重画开关
    390. int redraw = 0;
    391. //提示开关、显示开关、联系人id、修改开关
    392. static int tip = 0, show = 0, id = -1, recflag = 0;
    393. //id输入框
    394. static sys_edit edit;
    395. //修改输入框
    396. static sys_edit editname, editage, edittel;
    397. //添加界面标题按钮
    398. int button_w = 200;
    399. int button_h = Windh / 11;
    400. int button_x = (Windw - button_w) / 2;
    401. int button_y = button_h;
    402. Button search(button_x, button_y, button_w, button_h, "修改联系人");
    403. enum { cel, yes };
    404. static Button sec_button[2];
    405. //输入框和主界面按钮数组初始化,一个添加界面只初始化1次
    406. if (initflag == 0) {
    407. init_mainbutton(main_button, 5);
    408. init_edit(edit, (Windw - 360) / 2, main_button[0].b_y + 150, 360, 30);
    409. edit.setfocus();
    410. sec_button[cel] = Button(search.b_x - 80, search.b_y + 380, 80, 40, "取消");
    411. sec_button[yes] = Button(search.b_x + search.b_w, sec_button[cel].b_y, 80, 40, "确定");
    412. tip = 0; show = 0; id = -1; dynflag = 0;
    413. initflag = 1;
    414. }
    415. //动态切换效果未完成时,重画界面动态界面
    416. if (dynflag < 5) {
    417. dynflag = dyn_interface(main_button, 5);
    418. redraw = 1;
    419. }//完成时,重画一次输入界面
    420. else if (dynflag == 5) {
    421. redraw = 2;
    422. dynflag = 6;
    423. }
    424. static clock_t start = 0;
    425. mouse_msg mouse;
    426. while (mousemsg()) {
    427. mouse = getmouse();
    428. int size = sizeof(sec_button) / sizeof(sec_button[0]);
    429. int checkflag = check_button(sec_button, size, mouse);
    430. switch (checkflag) {
    431. case 0: {
    432. res = 0;
    433. sec_button[cel].b_mouse_in_flag = 0;
    434. sec_button[cel].b_down_flag = 0;
    435. strcpy_s(sec_button[yes].b_name, "确定");
    436. intArray.init();
    437. edit.destroy();
    438. editname.destroy();
    439. editage.destroy();
    440. edittel.destroy();
    441. dynflag = 0;
    442. initflag = 0;
    443. id = -1;
    444. tip = 0;
    445. recflag = 0;
    446. }break;
    447. case 1: {
    448. sec_button[yes].b_down_flag = 0;
    449. if (strcmp(sec_button[yes].b_name, "确定") == 0) {
    450. id = get_id(edit);
    451. if (id > address.a_cnt || id < 1) {
    452. tip = 1;
    453. start = clock();
    454. redraw = 2;
    455. }
    456. else {
    457. show = 1;
    458. strcpy_s(sec_button[yes].b_name, "修改");
    459. intArray.m_array[0] = id - 1;
    460. redraw = 3;
    461. }
    462. }
    463. else if (strcmp(sec_button[yes].b_name, "修改") == 0) {
    464. redraw = 3;
    465. recflag = 1;
    466. int w = 400;
    467. int x = (Windw - w) / 2;
    468. int h = Windh / 5;
    469. int y = h;
    470. init_edit(editname, x + textwidth("姓名:"), y + h + 10, w - textwidth("姓名:"), 30);
    471. init_edit(editage, x + textwidth("姓名:"), y + h + 50, w - textwidth("姓名:"), 30);
    472. init_edit(edittel, x + textwidth("姓名:"), y + h + 90, w - textwidth("姓名:"), 30);
    473. editname.settext(address.a_array[id - 1].p_name);
    474. char buffer[MAXSIZENAME];
    475. sprintf_s(buffer, "%d", address.a_array[id - 1].p_age);
    476. editage.settext(buffer);
    477. sprintf_s(buffer, "%lld", address.a_array[id - 1].p_tel);
    478. edittel.settext(buffer);
    479. editname.setfocus();
    480. strcpy_s(sec_button[yes].b_name, "保存");
    481. }
    482. else if (strcmp(sec_button[yes].b_name, "保存") == 0) {
    483. redraw = 3;
    484. recflag = 0;
    485. Person p = get_person(&editname, &editage, &edittel);
    486. if (p.p_name[0] != '\0' || p.p_tel) {
    487. address.a_array[id - 1] = p;
    488. }
    489. strcpy_s(sec_button[yes].b_name, "修改");
    490. }
    491. }break;
    492. case 2: {
    493. if (show) {
    494. redraw = 3;
    495. }
    496. else {
    497. redraw = 2;
    498. }
    499. }break;
    500. }
    501. }
    502. clock_t end = clock();
    503. if (end - start >= 300 && tip == 1) {
    504. tip = 0;
    505. redraw = 2;
    506. }
    507. if (redraw) {
    508. cleardevice();
    509. setbkcolor(EGEACOLOR(0X80, RGB(255, 255, 255)));
    510. switch (redraw) {
    511. case 1:
    512. for (int i = 0; i < 5; i++) {
    513. main_button[i].draw_button();
    514. }
    515. break;
    516. case 2:
    517. search.draw_button();
    518. setfont(search.b_h / 2, 0, "楷体");
    519. xyprintf((Windw - textwidth("请输入要修改联系人的ID")) / 2, search.b_y + search.b_h + 50, "请输入要修改联系人的ID");
    520. edit.visible(true);
    521. sec_button[cel].draw_button();
    522. sec_button[yes].draw_button();
    523. if (tip) {
    524. xyprintf((Windw - textwidth("查无此人")) / 2, edit.gety() + edit.geth() + 10, "查无此人");
    525. }
    526. break;
    527. case 3:
    528. search.draw_button();
    529. edit.visible(false);
    530. sec_button[cel].draw_button();
    531. sec_button[yes].draw_button();
    532. int w = 400;
    533. int x = (Windw - w) / 2;
    534. int h = Windh / 5;
    535. int y = h;
    536. person_show(0, x, y, w, h);
    537. if (recflag) {
    538. xyprintf(x, editname.gety() + 4, "姓名:");
    539. xyprintf(x, editage.gety() + 4, "年龄:");
    540. xyprintf(x, edittel.gety() + 4, "电话:");
    541. editname.visible(true);
    542. editage.visible(true);
    543. edittel.visible(true);
    544. }
    545. else {
    546. editname.visible(false);
    547. editage.visible(false);
    548. edittel.visible(false);
    549. }
    550. break;
    551. }
    552. }
    553. return res;
    554. }
    555. //删除界面
    556. int del_interface() {
    557. int res = 4;
    558. //定义一个主界面按钮,用来实现动态切换效果
    559. static Button main_button[5];
    560. //定义添加界面初始化完成标记
    561. static int initflag = 0, id = -1;
    562. //动态切换效果开关
    563. static int dynflag = 0;
    564. //重画开关
    565. int redraw = 0;
    566. //id输入框
    567. static sys_edit edit;
    568. //添加界面标题按钮
    569. int button_w = 200;
    570. int button_h = Windh / 11;
    571. int button_x = (Windw - button_w) / 2;
    572. int button_y = button_h;
    573. Button del(button_x, button_y, button_w, button_h, "删除联系人");
    574. enum { cel, yes };
    575. static Button sec_button[2];
    576. //输入框和主界面按钮数组初始化,一个添加界面只初始化1次
    577. if (initflag == 0) {
    578. init_mainbutton(main_button, 5);
    579. init_edit(edit, (Windw - 360) / 2, main_button[0].b_y + 150, 360, 30);
    580. edit.setfocus();
    581. sec_button[cel] = Button(del.b_x - 80, del.b_y + 380, 80, 40, "取消");
    582. sec_button[yes] = Button(del.b_x + del.b_w, sec_button[cel].b_y, 80, 40, "确定");
    583. initflag = 1;
    584. }
    585. //动态切换效果未完成时,重画界面动态界面
    586. if (dynflag < 5) {
    587. dynflag = dyn_interface(main_button, 5);
    588. redraw = 1;
    589. }//完成时,重画一次输入界面
    590. else if (dynflag == 5) {
    591. redraw = 2;
    592. dynflag = 6;
    593. }
    594. static clock_t start = 0;
    595. static int tip = 0, show = 0;
    596. mouse_msg mouse;
    597. while (mousemsg()) {
    598. mouse = getmouse();
    599. int size = sizeof(sec_button) / sizeof(sec_button[0]);
    600. int checkflag = check_button(sec_button, size, mouse);
    601. switch (checkflag) {
    602. case 0: {
    603. res = 0;
    604. sec_button[cel].b_mouse_in_flag = 0;
    605. sec_button[cel].b_down_flag = 0;
    606. strcpy_s(sec_button[yes].b_name, "确定");
    607. intArray.init();
    608. edit.destroy();
    609. dynflag = 0;
    610. initflag = 0;
    611. id = -1;
    612. show = 0;
    613. }break;
    614. case 1: {
    615. sec_button[yes].b_down_flag = 0;
    616. if (strcmp(sec_button[yes].b_name, "确定") == 0) {
    617. id = get_id(edit);
    618. if (id > address.a_cnt || id < 1) {
    619. tip = 1;
    620. start = clock();
    621. redraw = 2;
    622. }
    623. else {
    624. show = 1;
    625. strcpy_s(sec_button[yes].b_name, "删除");
    626. intArray.m_array[0] = id - 1;
    627. redraw = 3;
    628. }
    629. }
    630. else {
    631. address.work_del(id - 1);
    632. redraw = 2;
    633. show = 0;
    634. strcpy_s(sec_button[yes].b_name, "确定");
    635. edit.settext("");
    636. }
    637. }break;
    638. case 2: {
    639. if (show) {
    640. redraw = 3;
    641. }
    642. else {
    643. redraw = 2;
    644. }
    645. }
    646. }
    647. }
    648. clock_t end = clock();
    649. if (end - start >= 300 && tip) {
    650. tip = 0;
    651. redraw = 2;
    652. }
    653. if (redraw) {
    654. cleardevice();
    655. setbkcolor(EGEACOLOR(0X80, RGB(255, 255, 255)));
    656. switch (redraw) {
    657. case 1:
    658. for (int i = 0; i < 5; i++) {
    659. main_button[i].draw_button();
    660. }
    661. break;
    662. case 2:
    663. del.draw_button();
    664. setfont(del.b_h / 2, 0, "楷体");
    665. xyprintf((Windw - textwidth("请输入要删除联系人的ID")) / 2, del.b_y + del.b_h + 50, "请输入要删除联系人的ID");
    666. edit.visible(true);
    667. sec_button[cel].draw_button();
    668. sec_button[yes].draw_button();
    669. if (tip) {
    670. xyprintf((Windw - textwidth("查无此人")) / 2, edit.gety() + edit.geth() + 10, "查无此人");
    671. }
    672. break;
    673. case 3:
    674. del.draw_button();
    675. edit.visible(false);
    676. sec_button[cel].draw_button();
    677. sec_button[yes].draw_button();
    678. int w = 400;
    679. int x = (Windw - w) / 2;
    680. int h = Windh / 5;
    681. int y = h;
    682. person_show(0, x, y, w, h);
    683. break;
    684. }
    685. }
    686. return res;
    687. }
    688. //动态切换效果,动态效果完成后返回消失的按钮数量
    689. int dyn_interface(Button main_button[], int n) {
    690. int res = 0;
    691. static int v = 1;
    692. for (int i = 0; i < n; i++) {
    693. if (i % 2 == 0) {
    694. main_button[i].b_x -= v;
    695. }
    696. else {
    697. main_button[i].b_x += v;
    698. }
    699. if (main_button[i].b_x <= -Windw || main_button[i].b_x >= Windw) {
    700. res++;
    701. }
    702. }
    703. v += 2;
    704. if (res == 5) v = 1;
    705. return res;
    706. }
    707. //初始化文本输入框
    708. void init_edit(sys_edit& edit, int x, int y, int w, int h) {
    709. edit.create(false);
    710. edit.move(x, y);
    711. edit.size(w, h);
    712. edit.setmaxlen(24);
    713. edit.setfont(h - h / 3, 0, "楷体");
    714. edit.setbgcolor(EGEACOLOR(0x80, RGB(255, 255, 200)));
    715. edit.visible(false);
    716. edit.setfocus();
    717. }
    718. //检查按钮状态,返回被点击按钮下标
    719. int check_button(Button* pbutton, int size, mouse_msg& mouse) {
    720. int res = -1;
    721. for (int i = 0; i < size; i++) {
    722. if (pbutton[i].b_mouse_in_flag != pbutton[i].mouse_in(mouse)) {
    723. res = size;
    724. if (pbutton[i].mouse_in(mouse)) {
    725. pbutton[i].b_mouse_in_flag = 1;
    726. }
    727. else {
    728. pbutton[i].b_mouse_in_flag = 0;
    729. }
    730. }
    731. if (pbutton[i].b_down_flag != pbutton[i].mouse_down(mouse)) {
    732. res = size;
    733. if (pbutton[i].mouse_down(mouse)) {
    734. pbutton[i].b_down_flag = 1;
    735. }
    736. else if (!pbutton[i].mouse_in(mouse)) {
    737. pbutton[i].b_down_flag = 0;
    738. }
    739. }
    740. if (pbutton[i].mouse_click(mouse)) {
    741. res = i;
    742. }
    743. }
    744. return res;
    745. }
    746. //获取联系人信息
    747. Person get_person(sys_edit* editname, sys_edit* editage, sys_edit* edittel) {
    748. Person p;
    749. char buffer[MAXSIZENAME] = { 0 };
    750. editname->gettext(MAXSIZENAME, buffer);
    751. strcpy_s(p.p_name, buffer);
    752. if (editage) {
    753. editage->gettext(MAXSIZENAME, buffer);
    754. sscanf_s(buffer, "%d", &p.p_age);
    755. edittel->gettext(MAXSIZENAME, buffer);
    756. sscanf_s(buffer, "%lld", &p.p_tel);
    757. }
    758. return p;
    759. }
    760. //获取联系人ID
    761. int get_id(sys_edit& edit) {
    762. int res = -1;
    763. char buffer[10];
    764. edit.gettext(10, buffer);
    765. if (buffer[0] != '\0') {
    766. sscanf_s(buffer, "%d", &res);
    767. }
    768. return res;
    769. }
    770. //显示联系人
    771. void person_show(int index, int x, int y, int w, int h) {
    772. LOGFONTA tempfont;
    773. getfont(&tempfont);
    774. color_t tempcolor = getfillcolor();
    775. setfillcolor(EGEACOLOR(0x80, RGB(255, 255, 120)));
    776. ege_fillrect((float)x, (float)y, (float)w, (float)h);
    777. setfont(h / 5, 0, "楷体");
    778. int temp = textheight("zhangsan");
    779. xyprintf(x + 2, y + (h - 4 * temp) / 5, "ID:%d", intArray.m_array[index] + 1);
    780. xyprintf(x + 2, y + 2 * (h - 4 * temp) / 5 + temp, "姓名:%s", address.a_array[intArray.m_array[index]].p_name);
    781. xyprintf(x + 2, y + 3 * (h - 4 * temp) / 5 + 2 * temp, "年龄:%d", address.a_array[intArray.m_array[index]].p_age);
    782. xyprintf(x + 2, y + 4 * (h - 4 * temp) / 5 + 3 * temp, "电话:%lld", address.a_array[intArray.m_array[index]].p_tel);
    783. setfillcolor(tempcolor);
    784. setfont(&tempfont);
    785. }

    main.cpp

    1. #include"interface.h"
    2. int main(int argc, char const *argv[]) {
    3. //设置窗口类型和窗口位置,此版本setinitmode()不生效
    4. setinitmode(INIT_RENDERMANUAL, Windx, Windy);
    5. //设置窗口名字
    6. setcaption(Caption);
    7. initgraph(Windw, Windh, INIT_RENDERMANUAL);
    8. //开启高级渲染模式
    9. ege_enable_aa(true);
    10. //定义函数指针,指向主界面
    11. int(*pInterface)() = main_interface;
    12. int flag = 0;
    13. for (; is_run(); delay_fps(60)) {
    14. flag = draw_interface(pInterface);
    15. switch (flag) {
    16. case 0:
    17. pInterface = main_interface; break;
    18. case 1:
    19. pInterface = add_interface; break;
    20. case 2:
    21. pInterface = search_interface; break;
    22. case 3:
    23. pInterface = rec_interface; break;
    24. case 4:
    25. pInterface = del_interface; break;
    26. case 5:
    27. goto EXIT;
    28. }
    29. }
    30. EXIT:
    31. closegraph();
    32. return 0;
    33. }

    三、通讯录内核代码

    address.h

    1. #pragma once
    2. #include
    3. using namespace std;
    4. #include
    5. #include
    6. constexpr auto MAXSIZENAME = 24;
    7. constexpr auto MAXSIZEADDR = 10;
    8. //定义联系人类
    9. class Person {
    10. public:
    11. char p_name[MAXSIZENAME];
    12. int p_age = 0;
    13. long long p_tel = 0;
    14. Person() {}
    15. Person(const char* name, int age, long long tel);
    16. void operator=(const Person& p);
    17. };
    18. //定义通讯录类
    19. class Address {
    20. public:
    21. Person a_array[MAXSIZEADDR];
    22. int a_cnt = 0;
    23. int work_add(const Person& p);
    24. void work_del(int id);
    25. int work_search(char *str);
    26. Address();
    27. ~Address();
    28. };
    29. extern Address address;
    30. //定义数组类
    31. class Array {
    32. public:
    33. int m_array[MAXSIZEADDR];
    34. int m_cnt = 0;
    35. void init();
    36. };
    37. extern Array intArray;

    address.cpp

    1. #include"addresslist.h"
    2. Address address;
    3. Array intArray;
    4. Person::Person(const char* name, int age, long long tel)
    5. {
    6. strcpy_s(p_name, name);
    7. p_age = age;
    8. p_tel = tel;
    9. }
    10. void Person::operator=(const Person & p)
    11. {
    12. strncpy_s(p_name, p.p_name, sizeof(p.p_name));
    13. p_age = p.p_age;
    14. p_tel = p.p_tel;
    15. }
    16. int Address::work_add(const Person & p)
    17. {
    18. int res = -1;
    19. if (address.a_cnt < MAXSIZEADDR) {
    20. if (p.p_name[0] != '\n' || p.p_tel != 0) {
    21. address.a_array[address.a_cnt].p_age = p.p_age;
    22. address.a_array[address.a_cnt].p_tel = p.p_tel;
    23. strcpy_s(address.a_array[address.a_cnt].p_name, p.p_name);
    24. res = address.a_cnt++;
    25. }
    26. }
    27. return res;
    28. }
    29. void Address::work_del(int id)
    30. {
    31. for (int i = id; i < a_cnt - 1; i++) {
    32. a_array[i] = a_array[i + 1];
    33. }
    34. a_cnt--;
    35. }
    36. int Address::work_search(char *str)
    37. {
    38. intArray.init();
    39. if (str[0] != '\0') {
    40. cout << str << endl;
    41. for (int i = 0; i < a_cnt; i++) {
    42. if (strcmp(a_array[i].p_name, str) == 0) {
    43. intArray.m_array[intArray.m_cnt++] = i;
    44. }
    45. }
    46. }
    47. long long temptel = 0;
    48. sscanf_s(str, "%lld", &temptel);
    49. if (temptel != 0 && intArray.m_cnt == 0) {
    50. cout << intArray.m_cnt << endl;
    51. for (int i = 0; i < a_cnt; i++) {
    52. if (a_array[i].p_tel == temptel) {
    53. intArray.m_array[intArray.m_cnt++] = i;
    54. }
    55. }
    56. }
    57. return intArray.m_cnt;
    58. }
    59. Address::Address()
    60. {
    61. ifstream ifs("address.txt", ios::binary | ios::in);
    62. if (ifs) {
    63. ifs.read((char*)this, sizeof(*this));
    64. ifs.close();
    65. cout << "通讯录打开成功" << endl;
    66. cout << "通讯录中共有 " << a_cnt << " 个联系人" << endl;
    67. }
    68. else {
    69. cout << "创建通讯录" << endl;
    70. }
    71. }
    72. Address::~Address()
    73. {
    74. ofstream ofs("address.txt", ios::binary | ios::out);
    75. if (ofs.is_open()) {
    76. ofs.write((char*)this, sizeof(*this));
    77. ofs.close();
    78. cout << "通讯录保存成功" << endl;
    79. cout << "通讯录中共有 " << a_cnt << " 个联系人" << endl;
    80. }
    81. else {
    82. cout << "通讯录保存失败" << endl;
    83. }
    84. }
    85. void Array::init()
    86. {
    87. m_cnt = 0;
    88. }

  • 相关阅读:
    manhattan_slam环境配置
    Java8-Optional工具类(有效防止空指针异常)
    Java8新特性——Lambda表达式
    java计算机毕业设计基于安卓Android/微信小程序的校园跑腿代购 uni-app
    行业内口碑好值得信赖的短网址,让你不再选择恐惧
    VSCode配置用户代码段以及常用快捷键汇总
    Day02-事件绑定
    程序环境和预处理
    ACM模板修改
    Linux扩展篇之Shell编程二(运算符和条件判断)
  • 原文地址:https://blog.csdn.net/qq_42106610/article/details/133787056