4

I am working on a C++ console app. I want to execute and print all the stuff at the centre of app window screen (horizontally + vertically) as shown below.

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

I want to run my whole program as pointed out above. Is there any way to do so? Any help or suggestion would be appreciated.

4
  • What have you tried? Are you using iostreams? Is the width of the area completely fixed, or will it be whatever width the user has their terminal? Commented Jun 7, 2013 at 9:12
  • @nouney Os is Windows Commented Jun 7, 2013 at 9:13
  • @BoBTFish I am using iostreams Width of app window is not fixed. It will be whatever width the user has their terminal... Commented Jun 7, 2013 at 9:16
  • 2
    @AshutoshGangwar : take a look at this post so : ncurses-like for windows Commented Jun 7, 2013 at 9:16

3 Answers 3

4

How about this (LIVE EXAMPLE):

#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;
}

You get the idea. When centering the output vertically, you just put padding end lines at the top of the console.

Sign up to request clarification or add additional context in comments.

Comments

3

Example for 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;
}

Comments

2

If you want to keep your application in a console, but want to do some layouts I'd recommend using ncurses as it gives you more control on where you print, and also gives you a possibility to create menus, message boxes and other GUI-like stuff.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.