如何将输出居中对齐于屏幕 - C++?

4

我正在开发一个C++控制台应用程序。我希望在应用程序窗口屏幕的中心(水平+垂直)执行和打印所有内容,如下所示。

 --------------------------------
|                               |
|                               |
|         User : xyz            |
|         Pass : ****           |
|                               |
|                               |
 --------------------------------

我想要按照上面指示运行整个程序,有没有什么方法可以做到?如果有任何帮助或建议将不胜感激。


你尝试过什么?你是否在使用 iostreams?区域的宽度完全固定,还是将根据用户终端的宽度而变化? - BoBTFish
操作系统是Windows。 - ashu
@BoBTFish 我正在使用iostreams 应用程序窗口的宽度不是固定的。它将是用户终端的任何宽度... - ashu
2
@AshutoshGangwar:看一下这篇帖子吧:ncurses-like for windows - nouney
3个回答

4

这个怎么样 (在线示例):

#include <iostream>
#include <string>
#include <vector>


void centerify_output(std::string str, int num_cols) {
    // Calculate left padding
    int padding_left = (num_cols / 2) - (str.size() / 2);

    // Put padding spaces
    for(int i = 0; i < padding_left; ++i) std::cout << ' ';

    // Print the message
    std::cout << str;
}


int main() {
    std::vector<std::string> lines = {
        "---------------------------------",
        "|                               |",
        "|                               |",
        "|         User : xyz            |",
        "|         Pass : ****           |",
        "|                               |",
        "|                               |",
        "---------------------------------",
    };

    int num_cols = 100;

    // VIRTUAL BORDER
    std::cout << std::endl;
    for(int i = 0; i < num_cols; ++i) std::cout << ' ';
    std::cout << '|' << std::endl;

    // OUTPUT
    for(int i = 0; i < lines.size(); ++i) {
        centerify_output(lines[i], num_cols);
        std::cout << std::endl;
    }

    // VIRTUAL BORDER
    std::cout << std::endl;
    for(int i = 0; i < num_cols; ++i) std::cout << ' ';
    std::cout << '|' << std::endl;
}

你明白了吗?当垂直居中输出时,您只需在控制台顶部放置填充结束行即可。

3

WIN的示例:

#include <windows.h>

int main()
{ 
    HANDLE screen = GetStdHandle( STD_OUTPUT_HANDLE );

    COORD max_size = GetLargestConsoleWindowSize( screen );

    char s[] = "Hello world!";

    COORD pos;
    pos.X = (max_size.X - sizeof(s) ) / 2;
    pos.Y = max_size.Y / 2;
    SetConsoleCursorPosition( screen, pos );

    LPDWORD written;
    WriteConsole( screen, s, sizeof(s), written, 0 );

    return 0;
}

2

如果您想保持应用程序在控制台中,但想进行一些布局,我建议使用ncurses,因为它可以更好地控制打印位置,并且还可以创建菜单、消息框和其他类似GUI的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接