From 8cc5ecdc46fada16112443f7129b4f6641359eb7 Mon Sep 17 00:00:00 2001 From: Chen Peng Date: Wed, 29 Jul 2026 11:42:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=8F=B0=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 6 ++++ GUITest/Console.t.c | 83 +++++++++++++++++++++++++++++++++++++++++++++ GUITest/Faith.t.c | 21 ++++++++++++ c_WinUI_Console.c | 52 ++++++++++++++++++++++++++++ c_WinUI_Console.h | 28 +++++++++++++++ 5 files changed, 190 insertions(+) create mode 100644 GUITest/Console.t.c create mode 100644 GUITest/Faith.t.c create mode 100644 c_WinUI_Console.c create mode 100644 c_WinUI_Console.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b8f5724..c7c2124 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,3 +33,9 @@ target_sources(Resource.t PRIVATE GUITest/Resource.rc) target_sources(Snake.t PRIVATE GUITest/Snake.rc) target_sources(SimpFont.t PRIVATE GUITest/SimpFont.rc) target_sources(FontsExp.t PRIVATE GUITest/FontsExp.rc GUITest/FontStr.c) +set_target_properties(Faith.t PROPERTIES WIN32_EXECUTABLE FALSE) +set_target_properties(Console.t PROPERTIES WIN32_EXECUTABLE FALSE) + + + + diff --git a/GUITest/Console.t.c b/GUITest/Console.t.c new file mode 100644 index 0000000..0cae991 --- /dev/null +++ b/GUITest/Console.t.c @@ -0,0 +1,83 @@ +#include "c_WinUI_Console.h" +#include +#include + +static void HandleMouse(MOUSE_EVENT_RECORD Event) { + char s[150]; + snprintf(s, sizeof(s)/sizeof(s[0]), "Buttons: %lu, X:%2lu Y:%2lu\n", Event.dwButtonState, + Event.dwMousePosition.X, Event.dwMousePosition.Y); + c_WinUI_Console_GotoXY(0, 0); + c_WinUI_Console_WriteStr(s); +} + +static void HandleKey(KEY_EVENT_RECORD Event) { + char s[100]; + snprintf(s, sizeof(s)/sizeof(s[0]), "You pressed: %c", Event.uChar); + c_WinUI_Console_GotoXY(0, 1); + c_WinUI_Console_WriteStr(s); + snprintf(s, sizeof(s)/sizeof(s[0]), "Virtual Key: %3d", Event.wVirtualKeyCode); + c_WinUI_Console_GotoXY(0, 2); + c_WinUI_Console_WriteStr(s); +} + +static void SayGoodBye(void) { + char s[100]; + c_WinUI_Console_ClearScreen(); + printf("Enter Your name:"); + gets(s); + printf("\nGoodbye %s\n", s); +} + +static void InitConsoleInput(void) { + HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE); + if (hIn == INVALID_HANDLE_VALUE) return; + + DWORD mode; + // 1. 获取当前控制台的输入模式 + if (GetConsoleMode(hIn, &mode)) { + + // 2. 启用鼠标输入 + mode |= ENABLE_MOUSE_INPUT; + + // 3. 禁用快速编辑模式(非常关键!如果不禁用,鼠标事件会被控制台自身拦截用于复制文本) + mode &= ~ENABLE_QUICK_EDIT_MODE; + + // 4. 启用扩展属性(如果要修改 QUICK_EDIT,必须同时带上这个标志) + mode |= ENABLE_EXTENDED_FLAGS; + + // 5. 应用新模式 + SetConsoleMode(hIn, mode); + } +} + +int main(int argc, char** argv){ + DWORD Result; + INPUT_RECORD Buffer; + + InitConsoleInput(); + + HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE); + + c_WinUI_Console_ClearScreen(); + c_WinUI_Console_GotoXY(0, 24); + + c_WinUI_Console_WriteStr("Move mouse, press keys, double click to Exit..."); + + do { + ReadConsoleInput(hIn, &Buffer, 1, &Result); + + if (Buffer.EventType == KEY_EVENT) { + HandleKey(Buffer.Event.KeyEvent); + } + + if (Buffer.EventType == MOUSE_EVENT) { + HandleMouse(Buffer.Event.MouseEvent); + } + }while (!(Buffer.EventType==MOUSE_EVENT && Buffer.Event.MouseEvent.dwEventFlags==DOUBLE_CLICK)); + + SayGoodBye(); + + getchar(); + + return 0; +} diff --git a/GUITest/Faith.t.c b/GUITest/Faith.t.c new file mode 100644 index 0000000..7a5c4d9 --- /dev/null +++ b/GUITest/Faith.t.c @@ -0,0 +1,21 @@ +#include + +#include +#include + +#define ALT1 (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY) + +int main(int argc, char** argv){ + int i; + SetConsoleTitle("Emily Dickinson Console"); + c_WinUI_Console_ClearScreen(); + + c_WinUI_Console_WriteXY(0, 1, "Faith is a fine invention.", ALT1); + c_WinUI_Console_WriteXY(0, 2, "For gentlemen who see;", ALT1); + c_WinUI_Console_WriteXY(0, 3, "But microscopes are prudent", ALT1); + c_WinUI_Console_WriteXY(0, 4, "In an emergency!", ALT1); + + getchar(); + // system("pause"); + return 0; +} diff --git a/c_WinUI_Console.c b/c_WinUI_Console.c new file mode 100644 index 0000000..b447734 --- /dev/null +++ b/c_WinUI_Console.c @@ -0,0 +1,52 @@ +#include + +static void BlankLine(HANDLE hOut, int y) { + DWORD NumWritten; + COORD c; + c.X = 0; + c.Y = y; + FillConsoleOutputCharacter(hOut, ' ', 80, c, &NumWritten); +} + +void c_WinUI_Console_ClearScreen() { + HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); + for (int i=0; i<25; i++) { + BlankLine(hOut, i); + } + c_WinUI_Console_GotoXY(0, 0); +} + +void c_WinUI_Console_WriteStr(const char* str) { + if (!str) return; + DWORD NumWritten; + WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), str, strlen(str), &NumWritten, NULL); +} + +void c_WinUI_Console_WriteXY(int x, int y, const char* s, WORD attr) { + if (!s) return; + + HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); + COORD c; + DWORD result; + + c.X = x; + c.Y = y; + + SetConsoleTextAttribute(hOut, attr); + SetConsoleCursorPosition(hOut, c); + WriteConsole(hOut, s, strlen(s), &result, NULL); +} + +void c_WinUI_Console_GotoXY(int x, int y) { + COORD c; + c.X = x; + c.Y = y; + SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c); +} + +void c_WinUI_Console_BlankLine(int y) { + HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); + BlankLine(hOut, y); +} + + diff --git a/c_WinUI_Console.h b/c_WinUI_Console.h new file mode 100644 index 0000000..a1ca411 --- /dev/null +++ b/c_WinUI_Console.h @@ -0,0 +1,28 @@ +#ifndef INCLUDED_C_WINUI_CONSOLE_H +#define INCLUDED_C_WINUI_CONSOLE_H + +#ifndef INCLUDED_WINDOWS_H +#define INCLUDED_WINDOWS_H +#include +#endif /*INCLUDED_WINDOWS_H*/ + +#ifndef INCLUDED_STDIO_H +#define INCLUDED_STDIO_H +#include +#endif /*INCLUDED_STDIO_H*/ + + +/* ------------------------------------------------------------------------------------------------------------------ */ +/* */ + +void c_WinUI_Console_ClearScreen(); + +void c_WinUI_Console_WriteXY(int x, int y, const char* s, WORD attr); + +void c_WinUI_Console_GotoXY(int x, int y); + +void c_WinUI_Console_BlankLine(int y); + +void c_WinUI_Console_WriteStr(const char* str); + +#endif /*INCLUDED_C_WINUI_CONSOLE_H*/