#include "c_Console.h" #include #include int main(void) { // 1. 全局初始化控制台环境(支持 UTF-8、启用鼠标追踪、隐藏光标、Raw模式) c_Console_Init(); CONSOLE_CLEAR(); CONSOLE_HIDE_CURSOR(); int screen_w = 80, screen_h = 25; c_Console_GetSize(&screen_w, &screen_h); // 2. 绘制可视化测试台的固定 UI 边框与标题 c_Console_WriteColorXY(1, 1, C_COLOR_BRIGHT_WHITE, C_COLOR_BLUE, "==== 跨平台 c_Console 自动化全功能可视化测试台 ===="); c_Console_WriteColorXY(1, 2, C_COLOR_BRIGHT_BLACK, C_COLOR_NONE, "操作指南: 按 [方向键 ↑↓←→] 测试键盘,用 [鼠标点击/滚轮] 测试动态事件。按 [Esc] 键退出。"); // 3. 绘制 UTF-8 中英文混排对照区,验证等宽对齐算法 c_Console_WriteColorXY(2, 5, C_COLOR_BRIGHT_CYAN, C_COLOR_NONE, "【1. UTF-8 宽度测试对齐基准线】:"); c_Console_WriteColorXY(2, 6, C_COLOR_WHITE, C_COLOR_NONE, "字符串A: [C++ 2026]") ; c_Console_WriteColorXY(2, 7, C_COLOR_WHITE, C_COLOR_NONE, "字符串B: [C语言实现]") ; // 动态计算并打印视觉宽度进行自检 int lenA = c_Console_GetVisualWidth("[C++ 2026]"); int lenB = c_Console_GetVisualWidth("[C语言实现]"); c_Console_WriteColorXY(30, 6, C_COLOR_YELLOW, C_COLOR_NONE, "<- 判定宽度: %d (理论应为 10)", lenA); c_Console_WriteColorXY(30, 7, C_COLOR_YELLOW, C_COLOR_NONE, "<- 判定宽度: %d (理论应为 10)", lenB); // 4. 绘制两个交互式虚拟测试按钮供鼠标点击 c_Console_WriteColorXY(5, 10, C_COLOR_WHITE, C_COLOR_GREEN, " [ 按钮 A ] "); c_Console_WriteColorXY(20, 10, C_COLOR_WHITE, C_COLOR_MAGENTA, " [ 按钮 B ] "); // 键盘移动小方块的起始坐标状态 int k_x = 5, k_y = 15; c_Console_WriteColorXY(k_x, k_y, C_COLOR_BRIGHT_RED, C_COLOR_NONE, "■"); int running = 1; while (running) { // ---------------------------------------------------- // 测试项 A: 键盘输入流测试 // ---------------------------------------------------- int key = c_Console_ReadKey(); if (key != C_KEY_UNKNOWN) { // 清空第 12 行并更新键盘状态 printf("\033[12;1H\033[2K"); if (key == C_KEY_ESC) { running = 0; // 按 Esc 键退出 } else if (key == C_KEY_UP || key == C_KEY_DOWN || key == C_KEY_LEFT || key == C_KEY_RIGHT) { // 擦除旧位置 c_Console_WriteColorXY(k_x, k_y, C_COLOR_NONE, C_COLOR_NONE, " "); // 响应方向键 if (key == C_KEY_UP) k_y--; if (key == C_KEY_DOWN) k_y++; if (key == C_KEY_LEFT) k_x -= 2; // 方块占2个物理宽度 if (key == C_KEY_RIGHT) k_x += 2; // 边界约束 if (k_x < 1) k_x = 1; if (k_y < 13) k_y = 13; // 绘制新位置 c_Console_WriteColorXY(k_x, k_y, C_COLOR_BRIGHT_RED, C_COLOR_NONE, "■"); c_Console_WriteColorXY(2, 12, C_COLOR_BRIGHT_GREEN, C_COLOR_NONE, "键盘响应: [方向键] 成功触发! 当前方块坐标: (%d, %d)", k_x, k_y); } else if (key == C_KEY_ENTER) { c_Console_WriteColorXY(2, 12, C_COLOR_BRIGHT_GREEN, C_COLOR_NONE, "键盘响应: [Enter 回车键] 成功触发!"); } else { c_Console_WriteColorXY(2, 12, C_COLOR_BRIGHT_GREEN, C_COLOR_NONE, "键盘响应: 普通字符键 [%c] ASCII: %d", (char)key, key); } } // ---------------------------------------------------- // 测试项 B: 鼠标与滚轮流测试 // ---------------------------------------------------- c_ConsoleMouseEvent_t mouse_evt; if (c_Console_ReadMouse(&mouse_evt)) { // 在第 18 行实时刷新鼠标动作 printf("\033[18;1H\033[2K"); switch (mouse_evt.type) { case MOUSE_EVENT_PRESS_LEFT: c_Console_WriteColorXY(2, 18, C_COLOR_BRIGHT_YELLOW, C_COLOR_NONE, "鼠标响应: 【左键点击】 坐标: (%d, %d)", mouse_evt.x, mouse_evt.y); // 按钮矩形区域碰撞检测 if (mouse_evt.y == 10) { if (mouse_evt.x >= 5 && mouse_evt.x <= 15) { c_Console_WriteColorXY(5, 11, C_COLOR_BRIGHT_RED, C_COLOR_NONE, "🔥 触发 A !"); } else if (mouse_evt.x >= 20 && mouse_evt.x <= 30) { c_Console_WriteColorXY(20, 11, C_COLOR_BRIGHT_RED, C_COLOR_NONE, "🔥 触发 B !"); } } break; case MOUSE_EVENT_PRESS_RIGHT: c_Console_WriteColorXY(2, 18, C_COLOR_BRIGHT_YELLOW, C_COLOR_NONE, "鼠标响应: 【右键点击】 坐标: (%d, %d)", mouse_evt.x, mouse_evt.y); break; case MOUSE_EVENT_WHEEL_UP: c_Console_WriteColorXY(2, 18, C_COLOR_BRIGHT_BLUE, C_COLOR_NONE, "滚轮响应: 【向上滚动 ↑】 坐标: (%d, %d)", mouse_evt.x, mouse_evt.y); break; case MOUSE_EVENT_WHEEL_DOWN: c_Console_WriteColorXY(2, 18, C_COLOR_BRIGHT_BLUE, C_COLOR_NONE, "滚轮响应: 【向下滚动 ↓】 坐标: (%d, %d)", mouse_evt.x, mouse_evt.y); break; case MOUSE_EVENT_MOVE: // 右下角高频显示当前准心坐标 c_Console_WriteColorXY(screen_w - 20, 3, C_COLOR_BRIGHT_BLACK, C_COLOR_NONE, "鼠标悬停: (%03d, %03d)", mouse_evt.x, mouse_evt.y); break; case MOUSE_EVENT_RELEASE: // 释放鼠标时清理按钮下方的触发提示字样 printf("\033[11;1H\033[2K"); break; default: break; } } // 控制刷新帧率(约 50 FPS),避免 CPU 满载 c_Console_Sleep(20); } // 5. 退出处理:清屏并让 atexit 自动恢复终端原始设置 printf("\033[2J\033[H"); CONSOLE_CLEAR(); CONSOLE_SHOW_CURSOR(); CONSOLE_COLOR_RESET(); return 0; }