128 lines
6.2 KiB
C
128 lines
6.2 KiB
C
#include "c_Console.h"
|
|||
|
|
#include <stdlib.h>
|
||
|
|
#include <stdio.h>
|
||
|
|
|
||
|
|
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;
|
||
|
|
}
|
||
|
|
|