【问题标题】:how to position the cursor on the screen?如何将光标定位在屏幕上?
【发布时间】:2014-11-12 14:33:02
【问题描述】:

我是编程新手,目前正在学习 C 中的数组。我正在制作一个拼图,其中包含安装在框架上的 15 个带编号的方形块,其中一个是空的。它允许用户点击任何箭头键(上、下、左、右)。用户将继续按箭头键,直到数字不按升序排列。这些棋子可以水平和垂直移动。 我的问题是我不知道如何定位光标。我知道一个库函数 gotoxy() 但我认为它在 Turbo C/C++ 中使用过。我正在使用 Code Blocks.I在谷歌上搜索但无法得到结果。是的,我说的是键盘光标和使用窗口操作系统。请帮忙! :)

【问题讨论】:

  • 你的意思是鼠标光标吗?你在说什么光标?
  • @jean-loup 我认为 OP 指的是控制台光标。顺便说一句,这取决于您使用的平台(即 Windows 或 Unix/Linux)
  • 这需要如何完成取决于程序将在其中运行的终端设备的类型。支持大多数终端是一项艰巨的工作,并且有像 ncurses 这样经过数十年改进的完整库.也就是说,大多数常见的终端设备都支持 VT220/ANSI 转义序列来移动光标——你可以搜索它们,它们可能就足够了。参见例如here

标签: c ide codeblocks cursor-position


【解决方案1】:

在过去,MS/DOS 使用特殊的驱动程序 ANSI.SYS 来模拟 ANSI 命令代码。看起来这个不错的旧驱动程序可以在 Windows XP 下使用(但您需要在 config.sys 中配置它),但我发现一些文章说它不再适用于 Windows 7 及更高版本。

所以 ANSI(或 vt100 或 vt220)代码在 Linux 或 Unix 终端中很有用,但在 Windows 下,我的建议是直接使用在 Wincon.h 中声明的 Windows API 控制台函数 - 但您应该始终包含 Windows.h使用 Windows API 函数时。

您需要使用 Windows SDK 作为参考,但这里有一个小程序,在位置 15,5 处写有foo_bar

#include <windows.h>
#include <tchar.h> // compatibility 8/16 bits characters

int _tmain(int argc, const LPSTR *argv) {
    HANDLE hStdOut = ::GetStdHandle(STD_OUTPUT_HANDLE); // console output handle
    COORD dwCursorPosition;
    DWORD nb;
    dwCursorPosition.X = 15;
    dwCursorPosition.Y = 5;
    ::WriteConsoleOutputCharacter(hStdOut, _T("foo_bar"), 7, dwCursorPosition, &nb);

    return 0;
}

参考:MSDN 上的Console Reference

【讨论】:

  • 编译后显示错误“window.h : No such file or directory”
  • 我写了windows.h - 注意s
  • 哦..它的工作原理太棒了。谢谢你。顺便说一句,我正在学习 C,所以我无法理解你上面写的任何程序。你能用 C 解释一下吗。真的对我有帮助。
  • 既然要使用低级IO函数,问题不在于C语言,而在于Windows API。 _tmain 是 Microsoft 用于兼容 8/16 位字符(在 tchar.h 中声明)的程序入口点(类似于标准 main)。 HANDLE 是不透明类型,DWORD 是无符号 32 位整数,COORD 是结构的 typedef。 COORDGetStdHandleWriteConsoleOutputCharacter 都在我帖子末尾给出的链接中进行了描述。
  • 如果您想使用 Windows API,您需要 Windows SDK(只需 google 即可)。很抱歉,除了像往常一样搜索windows API tutorial 之外,我没有什么可以推荐给你的。但是恕我直言,首先使用不使用 API 函数的简单程序来学习 C,然后在您对它感到满意时再学习 Windows API
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 2020-05-26
  • 1970-01-01
相关资源
最近更新 更多