Windows控制台函数:移动光标位置函数SetConsoleCursorPosition()

目录

什么是 SetConsoleCursorPosition?

它长什么样?

什么是 COORD?

怎么用它?

它有什么用?

跟 C++ 标准库有什么不一样?

注意事项

再试一个有趣的例子

什么是 SetConsoleCursorPosition?

SetConsoleCursorPosition 是一个 Windows API 函数,用来移动控制台的光标位置。你可以把它想成一个遥控器,告诉屏幕上的那个闪烁小光标(就是输入文字时跳动的那个小线):“嘿,去这个位置等着!”

在控制台程序里,默认情况下,光标会随着你输入或输出的文字自动移动。但如果你想自己控制它,比如让文字出现在屏幕的特定位置(像画图或做游戏那样),就需要用这个函数。

它长什么样?

  • Set:表示设置(改变)某个值或状态。

  • Console:指的是控制台,即 Windows 终端窗口。

  • Cursor:指的是光标,在控制台中,光标表示当前输入或输出的文本位置。

  • Position:指的是位置,即光标所在的坐标。

在代码里,SetConsoleCursorPosition 是这样的:

BOOL SetConsoleCursorPosition(
    HANDLE hConsoleOutput,    // 屏幕的“钥匙”
    COORD dwCursorPosition    // 光标要去的地方
);
  • HANDLE hConsoleOutput: 这是你用 GetStdHandle(STD_OUTPUT_HANDLE) 拿到的屏幕钥匙。

  • COORD dwCursorPosition: 一个坐标,告诉函数光标要去哪里。COORD 是一个小结构体,包含 X(水平位置)和 Y(垂直位置)。

  • 返回值是 BOOL:成功返回 TRUE,失败返回 FALSE。

什么是 COORD?

COORD 是一个 Windows 定义的小东西,长这样:

typedef struct _COORD {
    SHORT X; // 横坐标(列号,从 0 开始)
    SHORT Y; // 纵坐标(行号,从 0 开始)
} COORD;
  • X 是列号,从左到右数(0 是最左边)。

  • Y 是行号,从上到下数(0 是最上面)。

怎么用它?

假设你想把光标移动到第 5 行、第 10 列,然后在那里写“Hello”,可以这样做:

#include <windows.h>

int main() {
    // 1. 拿到屏幕的“钥匙”
    HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);
    if (screen == INVALID_HANDLE_VALUE) {
        return 1; // 钥匙坏了,退出
    }

    // 2. 设置光标要去的地方
    COORD position;    // 准备一个坐标
    position.X = 10;   // 第 10 列
    position.Y = 5;    // 第 5 行

    // 3. 移动光标
    SetConsoleCursorPosition(screen, position);

    // 4. 在新位置写东西
    const char* message = "Hello";
    DWORD written;
    WriteConsoleA(screen, message, strlen(message), &written, NULL);

    return 0;
}

一步步解释:

  1. 拿到钥匙:

    • 用 GetStdHandle(STD_OUTPUT_HANDLE) 拿到屏幕的钥匙,存在 screen 里。

  2. 准备坐标:

    • COORD position 是一个坐标变量。

    • position.X = 10 表示光标移到第 10 列(从左边数第 11 个位置,因为从 0 开始)。

    • position.Y = 5 表示光标移到第 5 行(从顶部数第 6 行)。

  3. 移动光标:

    • SetConsoleCursorPosition(screen, position) 用屏幕钥匙把光标送到指定位置。

  4. 写东西:

    • 用 WriteConsoleA 在光标的新位置写下“Hello”。

运行这个程序,你会看到“Hello”出现在控制台的第 5 行、第 10 列,而不是默认的左上角。

它有什么用?

  • 控制输出位置:比如你想在屏幕上画一个表格,或者让文字跳来跳去。

  • 做小游戏:像贪吃蛇、俄罗斯方块这种控制台游戏,需要不停移动光标来更新画面。

  • 美化界面:让你的程序看起来更有条理,而不是全挤在左上角。

跟 C++ 标准库有什么不一样?

C++ 的 std::cout 没法直接控制光标位置。如果你用 std::cout << "Hello";,文字会紧接着上一次输出的地方出现,想跳到别的地方得靠一些奇怪的办法(比如输出很多空格或换行)。而 SetConsoleCursorPosition 让你直接“遥控”光标,想去哪就去哪。

注意事项

  1. 屏幕大小:

    • 控制台有边界(默认可能是 80 列 × 25 行,具体看你的设置)。如果 X 或 Y 超出范围,函数会失败。

    • 比如,设 position.X = 100 而你的屏幕只有 80 列,就会出错。

  2. 检查返回值:

    • 最好检查一下是否成功:

if (!SetConsoleCursorPosition(screen, position)) {
    return 1; // 出错了
}

     3.光标不会自动回来:

  • 移动光标后,下次输出会从新位置开始,不会自动回到左上角。

再试一个有趣的例子

我们让光标跳来跳去,写几个单词:

#include <windows.h>

int main() {
    HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);
    if (screen == INVALID_HANDLE_VALUE) {
        return 1;
    }

    COORD pos;
    DWORD written;

    // 在 (5, 2) 写 "Top"
    pos.X = 5; pos.Y = 2;
    SetConsoleCursorPosition(screen, pos);
    WriteConsoleA(screen, "Top", 3, &written, NULL);

    // 在 (10, 5) 写 "Middle"
    pos.X = 10; pos.Y = 5;
    SetConsoleCursorPosition(screen, pos);
    WriteConsoleA(screen, "Middle", 6, &written, NULL);

    // 在 (2, 8) 写 "Bottom"
    pos.X = 2; pos.Y = 8;
    SetConsoleCursorPosition(screen, pos);
    WriteConsoleA(screen, "Bottom", 6, &written, NULL);

    return 0;
}

运行后,你会看到“Top”、“Middle”、“Bottom”出现在控制台的不同位置,像个小布局。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值