【问题标题】:Move text cursor to particular screen coordinate?将文本光标移动到特定的屏幕坐标?
【发布时间】:2012-05-11 05:13:20
【问题描述】:

如何在 C 或 C++ 中将光标设置在控制台上所需的位置?

我记得有一个名为gotoxy(x,y) 的函数,但我认为它已被弃用。有没有其他选择?

【问题讨论】:

  • 这不是标准 C 或 C++ 的一部分。您必须使用 API。你指的是哪种光标?老鼠?终端中的键盘光标?
  • 一旦您想要的不仅仅是线性文本输出,请完全远离控制台。在开发人员和用户方面,有太多需要担心的特质。获取支持2D图形的库(SFML,SDL),并使用图形文本输出函数输出文本。
  • 如果您在 Unix 上,cursesncurses 库提供您所追求的设施。
  • 或许你可以试试these suggestions
  • @BenjaminLindley:我不同意。 Windows 控制台非常适合许多简单的 2D 文本任务,而且比使用通用多媒体库要简单得多。

标签: c++ c windows console


【解决方案1】:

如果您在谈论ncurses 库,您所追求的功能是move (row, column)

【讨论】:

    【解决方案2】:

    我想出了这个来设置光标。

    #include <iostream>
    
    void setPos(std::ostream& _os, const std::streamsize& _x, const std::streamsize& _y)
    {
        char tmp = _os.fill();
    
        if(_y>0) {
                _os.fill('\n');
                _os.width(_y);
                _os << '\n';
        }
        if(_x>0) {
                _os.fill(' ');
                _os.width(_x);
                _os << ' ';
        }
        _os.flush();
        _os.fill(tmp);
    }
    
    int main(int argc, char **argv)
    {
        setPos(std::cout, 5, 5);
        std::cout << "foo" << std::endl;
        return 0;
    }
    

    要做到更多,您需要对分辨率或 ncurses 之类的库进行假设。

    【讨论】:

    • 与 gotoxy 不同,您的函数只能向前移动光标。此外,该位置相对于解决方案中的当前光标位置 - 如果光标位于 (x,y),则对 setPos(a,b) 的调用将移动到 ((y==0?x:0) +a,y+b) - 所以新的 x 坐标取决于您为 y 传递的参数。
    • 没错。它通过所需的偏移量移动输出。事实上,它通过产生输出来做到这一点。如果我没记错的话,我将类似这样的东西用于类似表格的输出格式。
    • 如果你打印\r 然后继续前进,你可以前进到任意列,对吧?如果您知道终端的宽度,您将只能控制 Y 坐标,因为输出会自然地每隔一段时间换行。如果它确实有效,我会从 \r\n 开始,以确保您从 (0,0) 开始,并确保没有同时打印。
    【解决方案3】:

    C 和 C++ 都没有屏幕或控制台的概念;他们只看到字节流,没有固有的显示特征。有许多第三方 API(例如 ncurses)可以帮助您做到这一点。

    如果您想要一个快速的解决方案并且您正在使用的终端理解ANSI escape sequences,那么您可以执行以下操作

    printf("\033[%d;%dH", row, col);
    

    将光标移动到特定的行和列(左上角为 {1,1})。不过,您最好使用 ncurses(或您平台的等价物)。

    【讨论】:

      【解决方案4】:

      使用SetConsoleCursorPosition

      MSDN 库的同一部分中还有许多其他功能。其中一些可能也很有用。

      【讨论】:

        【解决方案5】:

        我使用了一个非常简单的方法。除非您真正深入到控制台应用程序中,否则您不需要过度了解 HANDLE 是什么,COORD 对象位于 windows.h 标准库中,并且有两个成员数据整数 X 和 Y。0,0 是左上角角和 Y 增加向下屏幕。您可以使用此命令并继续使用 std::cout

        #include <windows.h>
        
        int main(void){
        //initialize objects for cursor manipulation
        HANDLE hStdout;
        COORD destCoord;
        hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
        
        //position cursor at start of window
        destCoord.X = 0;
        destCoord.Y = 0;
        SetConsoleCursorPosition(hStdout, destCoord);
        }
        

        【讨论】:

          【解决方案6】:

          这是在stackoverflow上...

          `#include <stdio.h>
          
          // ESC-H, ESC-J (I remember using this sequence on VTs)
          #define clear() printf("\033[H\033[J")
          
          //ESC-BRACK-column;row (same here, used on terminals on an early intranet)
          #define gotoxy(x,y) printf("\033[%d;%dH", (y), (x))
          
          int main(void)
          {
              clear();
              gotoxy(23, 12);
              printf("x");
              gotoxy(1, 24);
              return 0;
          }`
          

          【讨论】:

            【解决方案7】:

            您可以使用它来将光标设置到屏幕上的特定坐标,然后简单地使用 cout

            #include <iostream>
            #include <windows.h>
            
            using namespace std;
            
            void set_cursor(int,int);
            
            int main()
            {
                 int x=0 , y=0;
                 set_cursor(x,y);
                 cout<<"Mohammad Usman Sajid";
            
                 return 0;
            }
            
            void set_cursor(int x = 0 , int y = 0)
            {
                HANDLE handle;
                COORD coordinates;
                handle = GetStdHandle(STD_OUTPUT_HANDLE);
                coordinates.X = x;
                coordinates.Y = y;
                SetConsoleCursorPosition ( handle , coordinates );
            }
            

            【讨论】:

              【解决方案8】:

              对于 Windows:#include

              #define cursor(x, y) SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), (COORD){x, y})

              对于 Linux:

              #define cursor(x,y) printf("\033[%d;%dH", x, y)

              【讨论】:

                猜你喜欢
                • 2020-05-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-09-09
                • 1970-01-01
                相关资源
                最近更新 更多