在 Windows 控制台程式中,光標不僅標示輸入插入點,更可作為簡易繪圖的「畫筆」。本文系統介紹 SetConsoleCursorPosition、GetConsoleCursorInfo、SetConsoleCursorInfo 三大 API,並給出完整可編譯範例,助你實現光標任意定位、閃爍控制、大小調整等效果。
| API | 用途 | 關鍵參數 |
|---|---|---|
SetConsoleCursorPosition | 設置光標坐標 | HANDLE hConsoleOutput, COORD dwCursorPosition |
GetConsoleCursorInfo | 獲取光標屬性 | HANDLE hConsoleOutput, PCONSOLE_CURSOR_INFO lpConsoleCursorInfo |
SetConsoleCursorInfo | 設置光標屬性 | HANDLE hConsoleOutput, const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo |
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize; // 光標高度佔字符單元百分比,1~100
BOOL bVisible; // TRUE=可見,FALSE=隱藏
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
#include <windows.h>
#include <stdio.h>
int main(void) {
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos = {0, 0};
CONSOLE_CURSOR_INFO cursorInfo;
// 1. 隱藏光標
GetConsoleCursorInfo(hOut, &cursorInfo);
cursorInfo.bVisible = FALSE;
SetConsoleCursorInfo(hOut, &cursorInfo);
printf("光標已隱藏,3 秒後恢復...\n");
Sleep(3000);
// 2. 恢復並放大光標
cursorInfo.bVisible = TRUE;
cursorInfo.dwSize = 50; // 佔半個字符高
SetConsoleCursorInfo(hOut, &cursorInfo);
// 3. 光標跳躍演示
for (int y = 0; y < 10; ++y) {
pos.Y = y;
pos.X = y * 2;
SetConsoleCursorPosition(hOut, pos);
printf("★");
Sleep(200);
}
// 4. 歸位
pos.X = 0; pos.Y = 12;
SetConsoleCursorPosition(hOut, pos);
printf("\n演示結束。\n");
return 0;
}
COORD 以字符單元為單位,(0,0) 為左上角,X 向右、Y 向下。GetConsoleScreenBufferInfo 確認 dwSize。dwSize 為百分比,非像素;100 表示全塊光標(傳統 DOS 風格)。STD_OUTPUT_HANDLE 可能無效,建議檢查返回值。