4

我想做的事:

光标最初在屏幕的左上角闪烁:

剩余 160 个字符
_

当我按“i”时:

剩余 159 个字符

一世

当我按'a'时:

剩余 158 个字符

当我按“m”时:

剩余 157 个字符

我是

等等。

需要做什么(根据我):

  1. 只需要清除屏幕的前三个字符。
  2. 更新屏幕上新按下的键

我试过的:

我试图清除整个屏幕并将之前的所有内容写回它。

为什么我对我所做的不满意:

因为它给人一种生涩的外观。而且入口并不顺利。

我需要你帮助我:

某些内置功能或其他技术仅清除部分屏幕。

我的规格:

视窗 XP SP 3

IDE:Visual C++ 2010 Express

4

3 回答 3

5

首先要理解的是,C++ 没有屏幕的概念,作为语言的标准部分。标准输出可能是文件,打印机和 cout 不知道区别。

然而,屏幕“设备”本身通常更智能一些,并且可以识别一些命令。其中应用最广泛的是 '\r' - 回车和 '\n' - 换行。'\r' 将光标移动到行首,'\n' 前进到下一行,但这不符合您的需求,因为您已经尝试过。

似乎这里唯一的前进方式是使用curses(其中ncurses只是一种实现,尽管Linux中的标准实现)。它为您提供了一个虚拟屏幕,其中包含用于更新它们的各种命令。然后它只采用更改的部分,并以优化的方式更新终端。

这只是使用 ncurses 的典型 C 程序的一个示例,值得一看:

#include <ncurses.h>

int main()
{   
    int ch;

    initscr();              /* Start curses mode        */
    raw();                  /* Line buffering disabled  */
    keypad(stdscr, TRUE);   /* We get F1, F2 etc..      */
    noecho();               /* Don't echo() while we do getch */

    printw("Type any character to see it in bold\n");
    ch = getch();           /* If raw() hadn't been called
                             * we have to press enter before it
                             * gets to the program      */

    printw("The pressed key is ");
    attron(A_BOLD);
    printw("%c", ch);
    attroff(A_BOLD);

    refresh();          /* Print it on to the real screen */
    getch();            /* Wait for user input */
    endwin();           /* End curses mode        */

    return 0;
}

printw() 函数写入“虚构”屏幕。它将内容放入缓冲区并更新一些标志并进行其他一些内部 ncurses 簿记。它实际上不会向您的真实屏幕(控制台窗口)写入任何内容。

您可以根据需要编写尽可能多的 printw() ,但是这些内容不会显示在真实屏幕上,直到您的程序执行其他操作以使“虚构的”屏幕缓冲区内容进入真实屏幕。

导致从 printw() 缓冲区更新真实屏幕的一件事是 refresh() (正如上面的源代码示例所做的那样)。

于 2013-02-25T09:05:51.630 回答
2

Win32控制台不支持转义序列。您可以使用控制台 API

从控制台清除 (0, 0) 的前 3 个字符的小示例

#include <windows.h>

int main()
{
   HANDLE hOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);

   COORD coord = {0,0};
   ::SetConsoleCursorPosition(hOutput, coord);

   char buff[] = "   ";
   ::WriteConsoleA(hOutput, buff, 3, NULL, NULL);

   return 0;
}

如果您不喜欢Console API并希望使用ncurses模拟,请参见此处

于 2013-02-25T09:30:11.940 回答
1

如果要管理完整的屏幕,curses是要走的路。否则,您只需使用转义序列就可以做很多事情;例如,参见http://en.wikipedia.org/wiki/ANSI_escape_code 。(从历史上看,这样的序列从一个终端到另一个终端是不同的,curses 最初是一种解决这个问题的方法。今天,ANSI 转义码对于窗口系统下的控制台窗口非常普遍,被 Windows 控制台窗口和 xterm 使用.)

除了封装实际序列外,还curses 支持面向字符的输入,无论有无回显。这在没有诅咒的情况下更难做到,而且仍然非常不便携。

于 2013-02-25T09:14:15.960 回答