// // Created by zhang on 2024/12/28. // #include #include #include "./include/function.h" #include "./include/curses.h" #include "./include/ui.h" #include #define BUTTON_WIDTH 12 #define BUTTON_HEIGHT 3 #define LOGIN_BTN_X 10 #define LOGIN_BTN_Y 10 #define REGISTER_BTN_X 20 #define REGISTER_BTN_Y 10 #define USERNAME_X 15 #define USERNAME_Y 5 #define PASSWORD_X 15 #define PASSWORD_Y 7 #define MAX_INPUT_LEN 30 void draw_button(WINDOW *win, int x, int y, const char *label, bool is_active) { if (is_active) { wattron(win, A_REVERSE); // 激活按钮时反显 } mvwprintw(win, y, x + (BUTTON_WIDTH - strlen(label)) / 2, "%s", label); if (is_active) { wattroff(win, A_REVERSE); // 反显结束 } box(win, 0, 0); // 画按钮的边框 wrefresh(win); } void draw_login_window() { // 绘制登录窗口 clear(); box(stdscr, 0, 0); // 标题 mvprintw(2, 20, "Login Window"); // 用户名 mvprintw(USERNAME_Y, USERNAME_X - 10, "Username: "); mvprintw(PASSWORD_Y, PASSWORD_X - 10, "Password: "); // 输入框 mvprintw(USERNAME_Y, USERNAME_X, "____________________________"); mvprintw(PASSWORD_Y, PASSWORD_X, "____________________________"); // 按钮 mvprintw(LOGIN_BTN_Y, LOGIN_BTN_X, "[ Login ]"); mvprintw(REGISTER_BTN_Y, REGISTER_BTN_X, "[ Register ]"); refresh(); } void handle_mouse_click(MEVENT event) { // 处理鼠标点击事件 if (event.bstate & BUTTON1_CLICKED) { // 判断是否点击了登录按钮 if (event.x >= LOGIN_BTN_X && event.x <= LOGIN_BTN_X + 9 && event.y == LOGIN_BTN_Y) { printw("\nLogin button clicked!\n"); refresh(); } // 判断是否点击了注册按钮 else if (event.x >= REGISTER_BTN_X && event.x <= REGISTER_BTN_X + 11 && event.y == REGISTER_BTN_Y) { printw("\nRegister button clicked!\n"); refresh(); } } } void clear_input_area(int x, int y, int len) { // 清除输入框区域 for (int i = 0; i < len; i++) { mvaddch(y, x + i, ' '); } } void Login_ui() { initscr(); // 初始化屏幕 cbreak(); // 禁用行缓冲 noecho(); // 不显示输入的字符 keypad(stdscr, TRUE); // 启用键盘功能(例如箭头键) mousemask(ALL_MOUSE_EVENTS, NULL); // 启用所有鼠标事件 curs_set(0); // 隐藏光标 draw_login_window(); // 绘制登录窗口 char username[MAX_INPUT_LEN + 1] = ""; char password[MAX_INPUT_LEN + 1] = ""; int ch; MEVENT event; while (1) { ch = getch(); // 获取输入 if (ch == KEY_MOUSE) { // 检查是否是鼠标事件 if (nc_getmouse(&event) == OK) { handle_mouse_click(event); // 处理鼠标点击事件 } } // 处理键盘输入(用户输入用户名和密码) if (ch == 10) { // 回车键 printw("\n登录成功!\n"); break; } // 如果是在用户名或密码框中输入 if (ch == KEY_BACKSPACE || ch == 127) { // 退格键 // 删除输入框中的最后一个字符 if (strlen(username) > 0) { username[strlen(username) - 1] = '\0'; clear_input_area(USERNAME_X, USERNAME_Y, MAX_INPUT_LEN); mvprintw(USERNAME_Y, USERNAME_X, "%s", username); } } else if (isprint(ch)) { // 只接受可打印的字符 if (strlen(username) < MAX_INPUT_LEN) { username[strlen(username)] = ch; username[strlen(username) + 1] = '\0'; mvprintw(USERNAME_Y, USERNAME_X, "%s", username); } } refresh(); } endwin(); // 结束 ncurses 模式 return; } // 用于绘制按钮的函数 void Welcome_ui() { MEVENT event; int startx, starty; int button_x, button_y; // 初始化ncurses环境 initscr(); cbreak(); noecho(); keypad(stdscr, TRUE); curs_set(0); // 启用鼠标事件 mousemask(ALL_MOUSE_EVENTS, NULL); // 获取屏幕的尺寸 int rows, cols; getmaxyx(stdscr, rows, cols); // 计算按钮的显示位置 startx = cols / 2 - BUTTON_WIDTH / 2; starty = rows / 2 - 2; // 使文本和按钮垂直居中 // 打印欢迎文本 mvprintw(starty - 3, startx, "欢迎来到我们的程序!"); refresh(); // 创建两个按钮的窗口 WINDOW *login_button_win = newwin(BUTTON_HEIGHT, BUTTON_WIDTH, starty, startx); WINDOW *register_button_win = newwin(BUTTON_HEIGHT, BUTTON_WIDTH, starty + BUTTON_HEIGHT + 1, startx); // 绘制按钮 draw_button(login_button_win, 0, 0, "Login", false); draw_button(register_button_win, 0, 0, "Signin", false); refresh(); bool login_active = false; bool register_active = false; while (1) { int ch = getch(); if (ch == KEY_MOUSE) { if (nc_getmouse(&event) == OK) { // 检查点击的区域是否是登录按钮 if (event.x >= startx && event.x < startx + BUTTON_WIDTH && event.y >= starty && event.y < starty + BUTTON_HEIGHT) { login_active = true; register_active = false; draw_button(login_button_win, 0, 0, "Login", true); // 激活登录按钮 draw_button(register_button_win, 0, 0, "Signin", false); // 取消激活注册按钮 printw("您点击了登录按钮!\n"); } // 检查点击的区域是否是注册按钮 else if (event.x >= startx && event.x < startx + BUTTON_WIDTH && event.y >= starty + BUTTON_HEIGHT + 1 && event.y < starty + BUTTON_HEIGHT + 1 + BUTTON_HEIGHT) { login_active = false; register_active = true; draw_button(login_button_win, 0, 0, "登录", false); // 取消激活登录按钮 draw_button(register_button_win, 0, 0, "注册", true); // 激活注册按钮 printw("您点击了注册按钮!\n"); } refresh(); } } // 按 'q' 键退出 if (ch == 'q') { break; } } // 清理退出 endwin(); return; }