完成欢迎界面
This commit is contained in:
parent
e787cac39a
commit
13bbb29c90
@ -11,5 +11,5 @@
|
|||||||
|
|
||||||
int Login();
|
int Login();
|
||||||
|
|
||||||
|
void myexit();
|
||||||
#endif //FUNCTION_H
|
#endif //FUNCTION_H
|
||||||
|
11
include/ui.h
11
include/ui.h
@ -4,14 +4,15 @@
|
|||||||
|
|
||||||
#ifndef O_UI_H
|
#ifndef O_UI_H
|
||||||
#define O_UI_H
|
#define O_UI_H
|
||||||
void Login_ui();
|
int Login_ui();
|
||||||
|
|
||||||
void UserSignin_ui();
|
int Signin_ui();
|
||||||
|
|
||||||
void StudentsDesktop_ui();
|
int StudentsDesktop_ui();
|
||||||
|
|
||||||
void TeachersDesktop_ui();
|
int TeachersDesktop_ui();
|
||||||
|
|
||||||
|
int Welcome_ui();
|
||||||
|
|
||||||
void Welcome_ui();
|
|
||||||
|
|
||||||
#endif //O_UI_H
|
#endif //O_UI_H
|
||||||
|
64
main.c
64
main.c
@ -8,6 +8,66 @@
|
|||||||
#include "./include/ui.h"
|
#include "./include/ui.h"
|
||||||
#include "./include/myerror.h"
|
#include "./include/myerror.h"
|
||||||
#include "./include/extern.h"
|
#include "./include/extern.h"
|
||||||
int main() {
|
#include "./include/curses.h"
|
||||||
Welcome_ui();
|
#define WELCOME_UI 1
|
||||||
|
#define LOGIN_UI 2
|
||||||
|
#define SIGNIN_UI 3
|
||||||
|
void myexit() {
|
||||||
|
endwin();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//void test() {
|
||||||
|
// // 初始化 ncurses
|
||||||
|
// initscr();
|
||||||
|
// cbreak(); // 禁用行缓冲
|
||||||
|
// noecho(); // 不显示输入字符
|
||||||
|
// curs_set(0); // 隐藏光标
|
||||||
|
//
|
||||||
|
// // 启用所有鼠标事件
|
||||||
|
// mousemask(ALL_MOUSE_EVENTS, NULL);
|
||||||
|
//
|
||||||
|
// // 创建一个新的窗口
|
||||||
|
// WINDOW *win = newwin(10, 30, 5, 5);
|
||||||
|
// box(win, 0, 0); // 为窗口添加边框
|
||||||
|
// mvwprintw(win, 1, 1, "Click inside this window.");
|
||||||
|
// keypad(win,TRUE);
|
||||||
|
// wrefresh(win); // 刷新窗口以显示内容
|
||||||
|
//
|
||||||
|
// MEVENT event; // 用于存储鼠标事件
|
||||||
|
//
|
||||||
|
// while (1) {
|
||||||
|
// int ch = wgetch(win); // 从指定窗口获取输入
|
||||||
|
//
|
||||||
|
// if (ch == KEY_MOUSE) {
|
||||||
|
// if (nc_getmouse(&event) == OK) {
|
||||||
|
// // 打印鼠标事件的信息
|
||||||
|
// mvwprintw(win, 3, 1, "Mouse at (%d, %d), button %d", event.x, event.y, event.bstate);
|
||||||
|
// wrefresh(win); // 刷新窗口以显示鼠标点击位置
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// mvwprintw(win, 4, 1, "You pressed a key: %c", ch);
|
||||||
|
// wrefresh(win); // 刷新窗口以显示按键信息
|
||||||
|
// break; // 按键退出循环
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // 等待用户按键后退出
|
||||||
|
// getch();
|
||||||
|
//
|
||||||
|
// // 清理和结束程序
|
||||||
|
// endwin();
|
||||||
|
// return;
|
||||||
|
//}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int code=Welcome_ui();
|
||||||
|
while(1){
|
||||||
|
switch(code){
|
||||||
|
case WELCOME_UI:code=Welcome_ui();break;
|
||||||
|
case LOGIN_UI:code=Login_ui();break;
|
||||||
|
case SIGNIN_UI:code=Signin_ui();break;
|
||||||
|
case 0:myexit();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
361
ui.c
361
ui.c
@ -8,69 +8,143 @@
|
|||||||
#include "./include/ui.h"
|
#include "./include/ui.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#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() {
|
// 定义窗口宽度和高度
|
||||||
// 绘制登录窗口
|
#define WIN_HEIGHT 15
|
||||||
clear();
|
#define WIN_WIDTH 40
|
||||||
box(stdscr, 0, 0);
|
|
||||||
|
|
||||||
|
struct bottom{
|
||||||
|
int x,y;
|
||||||
|
int width,height;
|
||||||
|
char *test[10];
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef void (*ButtonCallback)();
|
||||||
|
|
||||||
|
struct bottom *creat_bottom(WINDOW *win,int x,int y,int width,int height,char *test[]) {
|
||||||
|
struct bottom *bot=malloc(sizeof(struct bottom));
|
||||||
|
bot->y=x;
|
||||||
|
bot->x=y;
|
||||||
|
bot->width=width;
|
||||||
|
bot->height=height;
|
||||||
|
strcpy(bot->test,test);
|
||||||
|
mvwprintw(win,x,y,"%s",test);
|
||||||
|
return bot;
|
||||||
|
}
|
||||||
|
bool click_bottom(MEVENT event,struct bottom bottom,int sx,int sy){
|
||||||
|
return event.x-sx>= bottom.x && event.x-sx < bottom.x + bottom.width && event.y-sy >= bottom.y && event.y-sy < bottom.y + bottom.height;
|
||||||
|
}
|
||||||
|
int Welcome_ui() {
|
||||||
|
MEVENT event;
|
||||||
|
int startx, starty;
|
||||||
|
initscr(); // 初始化curses
|
||||||
|
cbreak(); // 禁用行缓冲
|
||||||
|
noecho(); // 不显示输入字符
|
||||||
|
curs_set(0); // 隐藏光标
|
||||||
|
keypad(stdscr, TRUE); // 启用键盘按键的特殊处理
|
||||||
|
mousemask(ALL_MOUSE_EVENTS, NULL); // 启用鼠标事件
|
||||||
|
// 获取屏幕的尺寸
|
||||||
|
// 计算按钮的显示位置
|
||||||
|
int start_y = (LINES - WIN_HEIGHT) / 2;
|
||||||
|
int start_x = (COLS - WIN_WIDTH) / 2;
|
||||||
|
WINDOW *welcome_win = newwin(WIN_HEIGHT, WIN_WIDTH, start_y, start_x);
|
||||||
|
keypad(welcome_win,TRUE);
|
||||||
|
wborder(welcome_win, '|', '|', '-','-','+', '+', '+', '+');
|
||||||
// 标题
|
// 标题
|
||||||
mvprintw(2, 20, "Login Window");
|
mvwprintw(welcome_win, 1, 1, "Welcome to math calculate system!");
|
||||||
|
struct bottom *login= creat_bottom(welcome_win,4,1,5,1,"Login");
|
||||||
// 用户名
|
struct bottom *signin= creat_bottom(welcome_win,8,1,6,1,"Signin");
|
||||||
mvprintw(USERNAME_Y, USERNAME_X - 10, "Username: ");
|
struct bottom *exit= creat_bottom(welcome_win,12,1,4,1,"Exit");
|
||||||
mvprintw(PASSWORD_Y, PASSWORD_X - 10, "Password: ");
|
wrefresh(welcome_win);
|
||||||
|
while(1){
|
||||||
// 输入框
|
int rc=wgetch(welcome_win);
|
||||||
mvprintw(USERNAME_Y, USERNAME_X, "____________________________");
|
if(rc==KEY_MOUSE){
|
||||||
mvprintw(PASSWORD_Y, PASSWORD_X, "____________________________");
|
if(nc_getmouse(&event)==OK){
|
||||||
|
//mvwprintw(welcome_win, 3, 1, "Mouse at (%d, %d), button %d", event.x-start_x, event.y-start_y, event.bstate);
|
||||||
// 按钮
|
if(click_bottom(event,*login,start_x,start_y)){
|
||||||
mvprintw(LOGIN_BTN_Y, LOGIN_BTN_X, "[ Login ]");
|
free(login);free(signin);free(exit);endwin();
|
||||||
mvprintw(REGISTER_BTN_Y, REGISTER_BTN_X, "[ Register ]");
|
return 1;
|
||||||
|
|
||||||
refresh();
|
|
||||||
}
|
}
|
||||||
|
if(click_bottom(event,*signin,start_x,start_y)){
|
||||||
void handle_mouse_click(MEVENT event) {
|
free(login);free(signin);free(exit);endwin();
|
||||||
// 处理鼠标点击事件
|
return 2;
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
// 判断是否点击了注册按钮
|
if(click_bottom(event,*exit,start_x,start_y)){
|
||||||
else if (event.x >= REGISTER_BTN_X && event.x <= REGISTER_BTN_X + 11 &&
|
free(login);free(signin);free(exit);endwin();
|
||||||
event.y == REGISTER_BTN_Y) {
|
return 0;
|
||||||
printw("\nRegister button clicked!\n");
|
|
||||||
refresh();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int Login_ui(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int Signin_ui(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//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) {
|
void clear_input_area(int x, int y, int len) {
|
||||||
// 清除输入框区域
|
// 清除输入框区域
|
||||||
@ -79,131 +153,58 @@ void clear_input_area(int x, int y, int len) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Login_ui() {
|
//void Login_ui() {
|
||||||
initscr(); // 初始化屏幕
|
// initscr(); // 初始化屏幕
|
||||||
cbreak(); // 禁用行缓冲
|
// cbreak(); // 禁用行缓冲
|
||||||
noecho(); // 不显示输入的字符
|
// noecho(); // 不显示输入的字符
|
||||||
keypad(stdscr, TRUE); // 启用键盘功能(例如箭头键)
|
// keypad(stdscr, TRUE); // 启用键盘功能(例如箭头键)
|
||||||
mousemask(ALL_MOUSE_EVENTS, NULL); // 启用所有鼠标事件
|
// mousemask(ALL_MOUSE_EVENTS, NULL); // 启用所有鼠标事件
|
||||||
curs_set(0); // 隐藏光标
|
// curs_set(0); // 隐藏光标
|
||||||
|
//
|
||||||
draw_login_window(); // 绘制登录窗口
|
// draw_login_window(); // 绘制登录窗口
|
||||||
|
//
|
||||||
char username[MAX_INPUT_LEN + 1] = "";
|
// char username[MAX_INPUT_LEN + 1] = "";
|
||||||
char password[MAX_INPUT_LEN + 1] = "";
|
// char password[MAX_INPUT_LEN + 1] = "";
|
||||||
int ch;
|
// int ch;
|
||||||
MEVENT event;
|
// MEVENT event;
|
||||||
|
//
|
||||||
while (1) {
|
// while (1) {
|
||||||
ch = getch(); // 获取输入
|
// ch = getch(); // 获取输入
|
||||||
|
//
|
||||||
if (ch == KEY_MOUSE) { // 检查是否是鼠标事件
|
// if (ch == KEY_MOUSE) { // 检查是否是鼠标事件
|
||||||
if (nc_getmouse(&event) == OK) {
|
// if (nc_getmouse(&event) == OK) {
|
||||||
handle_mouse_click(event); // 处理鼠标点击事件
|
// handle_mouse_click(event); // 处理鼠标点击事件
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
// 处理键盘输入(用户输入用户名和密码)
|
// // 处理键盘输入(用户输入用户名和密码)
|
||||||
if (ch == 10) { // 回车键
|
// if (ch == 10) { // 回车键
|
||||||
printw("\n登录成功!\n");
|
// printw("\n登录成功!\n");
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
// 如果是在用户名或密码框中输入
|
// // 如果是在用户名或密码框中输入
|
||||||
if (ch == KEY_BACKSPACE || ch == 127) { // 退格键
|
// if (ch == KEY_BACKSPACE || ch == 127) { // 退格键
|
||||||
// 删除输入框中的最后一个字符
|
// // 删除输入框中的最后一个字符
|
||||||
if (strlen(username) > 0) {
|
// if (strlen(username) > 0) {
|
||||||
username[strlen(username) - 1] = '\0';
|
// username[strlen(username) - 1] = '\0';
|
||||||
clear_input_area(USERNAME_X, USERNAME_Y, MAX_INPUT_LEN);
|
// clear_input_area(USERNAME_X, USERNAME_Y, MAX_INPUT_LEN);
|
||||||
mvprintw(USERNAME_Y, USERNAME_X, "%s", username);
|
// mvprintw(USERNAME_Y, USERNAME_X, "%s", username);
|
||||||
}
|
// }
|
||||||
} else if (isprint(ch)) { // 只接受可打印的字符
|
// } else if (isprint(ch)) { // 只接受可打印的字符
|
||||||
if (strlen(username) < MAX_INPUT_LEN) {
|
// if (strlen(username) < MAX_INPUT_LEN) {
|
||||||
username[strlen(username)] = ch;
|
// username[strlen(username)] = ch;
|
||||||
username[strlen(username) + 1] = '\0';
|
// username[strlen(username) + 1] = '\0';
|
||||||
mvprintw(USERNAME_Y, USERNAME_X, "%s", username);
|
// mvprintw(USERNAME_Y, USERNAME_X, "%s", username);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
refresh();
|
// refresh();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
endwin(); // 结束 ncurses 模式
|
// endwin(); // 结束 ncurses 模式
|
||||||
return;
|
// 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;
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user