Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[TuT] Wyśrodkowanie tekstu w stosunku do bufora konsoli


Rekomendowane odpowiedzi

Opublikowano

Witam!

Jak pewnie wiecie, nie mamy w C++ standardowej instrukcji, która by nam środkowała tekst. Chciałbym wam zaprezentować jak pobrać informacje o rozmiarze (buforze) konsoli i w oparciu o te informacje wyśrodkować tekst. Zacznijmy od kodu, który będzie pobierał wysokość i szerokość do dwóch zmiennych:

int width;
int height;

int bufferinfo()
{
	CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
	HANDLE hConsoleOut = GetStdHandle( STD_OUTPUT_HANDLE );
	GetConsoleScreenBufferInfo( hConsoleOut, &csbiInfo );
	width = csbiInfo.dwSize.X;
	height = csbiInfo.dwSize.Y;

	return 0;
}

W zmiennej width znajdzie się szerokość, a height wysokość. Następnie, załóżmy że tekst który chcemy wyświetlić znajduje się w zmiennej "text":

string tekst = "To jest przykladowy tekst";

Do wyśrodkowania tekstu wykorzystamy instrukcję setw z biblioteki iomanip (standardowa biblioteka). SetW umożliwia nam napisanie jakiegoś tekstu w odległości podanej przez nas w nawiasie, np. pisząc: 

cout << setw(10) << "tekst";

uzyskamy napis tekst oddalony o 10 znaków od lewej ściany naszej konsoli. Pewnie się już domyślacie jak wyśrodkować nasz tekst. Wzór na to jest następujący:

(dlugosc_tekstu + szerokosc)/2

Długość tekstu możemy uzyskać za pomocą metody .length():

int szerokosc = nazwa_zmiennej.length();

Oto jak będzie wyglądał nas skończony kod:

#include <Windows.h>
#include <iostream>
#include <string>
#include <iomanip>

using namespace std;

int width;
int height;

int bufferinfo()
{
	CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
	HANDLE hConsoleOut = GetStdHandle( STD_OUTPUT_HANDLE );
	GetConsoleScreenBufferInfo( hConsoleOut, &csbiInfo );
	width = csbiInfo.dwSize.X;
	height = csbiInfo.dwSize.Y;

	return 0;
}

int main()
{
        bufferinfo();
        string zmienna = "To jest przykladowy tekst";
        cout << setw(((zmienna.length()) + width)/2) << zmienna;
}

Biblioteki, które musimy dołączyć to: string(jeśli nasza zmienna jest stringiem), Windows.h, iomanip, iostream.

 

Mam nadzieję, że poradnik wam się przyda :D

 

//Wzór na idealny środek:

setw(((width*height)/2) - (zmienna.length() + width))

3587513.png


Potrzebujesz pomocy? Pisz śmiało na PW/Skype/Gadu-Gadu!


(albo napisz na forum... ^.^)

Opublikowano

Po co wysokosc ?

 

Wysokośc jeśli ktoś by chciał sobię wyśrodkować od góry D: Bo czemu nie? Idealny środeczek: 

setw(((width*height)/2) - (zmienna.length() + width))

3587513.png


Potrzebujesz pomocy? Pisz śmiało na PW/Skype/Gadu-Gadu!


(albo napisz na forum... ^.^)

Opublikowano

Jak juz to kod tak musialby wygladac 

 cout<< setw(((width*height)/2) - (zmienna.length() + width))<<zmienna<< setw(((width*height)/2))<<"";

Przy rozmiarach buforu ekranu 80x300 nie zaciekawie to wyglada

 

Myślisz, że lepiej by było gdybym zrobił to na rozmiarze okna?

3587513.png


Potrzebujesz pomocy? Pisz śmiało na PW/Skype/Gadu-Gadu!


(albo napisz na forum... ^.^)

Opublikowano

To będzie to? http://msdn.microsoft.com/en-us/library/windows/desktop/ms683193(v=vs.85).aspx

 

//Wysłałem prośbę o zmienienie tytułu na Wyśrodkowanie tekstu w stosunku do bufora konsoli. Najwyżej zrobię drugi TuT o wymiarach okna a nie bufora ;)

3587513.png


Potrzebujesz pomocy? Pisz śmiało na PW/Skype/Gadu-Gadu!


(albo napisz na forum... ^.^)

Opublikowano

Lepiej zrobić sobie jakiś bufor (char[wys][szer]), działać na nim, a pod koniec wypisać wys wierszy zawierających po szer znaków. Dużo poręczniejsze i unika się latania po konsoli.

 

Co do samego pobierania rozmiaru. Na razie taka jak jest to u ciebie (rozmiar buforu) to jest to mało użyteczne.

 

 

Możesz pokombinować z

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682071%28v=vs.85%29.aspx //wielkość czcionki

http://msdn.microsoft.com/en-us/library/windows/desktop/ms683175%28v=vs.85%29.aspx //do pobrania HWND

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633519%28v=vs.85%29.aspx //wielkosc okna (moze da się wyliczyć ilość wierszy i kolumn)

Opublikowano
#include <iostream>
#include <iomanip>
#define _WIN32_WINNT 0x0500
#include <windows.h>

using namespace std;
int main ()
{
COORD pos;
pos.X = 80;
pos.Y = 25; 
SetConsoleScreenBufferSize( GetStdHandle( STD_OUTPUT_HANDLE ), pos );

string s="ala ma kota";
	cout<<setw((((pos.Y*pos.X)/2)+((s.length())+pos.X)/2))<<s<<setw(((pos.Y*pos.X)/2))<<"";

//cout.width(((pos.Y*pos.X)/2)+((s.length()) + pos.X)/2);
//cout<<s;
//cout.width((pos.Y*pos.X)/2);
//cout<<"";

system("pause>nul");
}

Oczko rzuc na to okiem ;] , mogloby byc takie cus ?   ( dzialac ,dziala poprawnie)

Opublikowano
#include <iostream>
#include <iomanip>
#define _WIN32_WINNT 0x0500
#include <windows.h>

using namespace std;
int main ()
{
COORD pos;
pos.X = 80;
pos.Y = 25; 
SetConsoleScreenBufferSize( GetStdHandle( STD_OUTPUT_HANDLE ), pos );

string s="ala ma kota";
	cout<<setw((((pos.Y*pos.X)/2)+((s.length())+pos.X)/2))<<s<<setw(((pos.Y*pos.X)/2))<<"";

//cout.width(((pos.Y*pos.X)/2)+((s.length()) + pos.X)/2);
//cout<<s;
//cout.width((pos.Y*pos.X)/2);
//cout<<"";

system("pause>nul");
}

Oczko rzuc na to okiem ;] , mogloby byc takie cus ?   ( dzialac ,dziala poprawnie)

 

 

Ano działa. PS. Za pierwszym razem też korzystałem z cout.width ale czasami nie działał, albo działał żle :D

3587513.png


Potrzebujesz pomocy? Pisz śmiało na PW/Skype/Gadu-Gadu!


(albo napisz na forum... ^.^)

Opublikowano
SetConsoleScreenBufferSize( GetStdHandle( STD_OUTPUT_HANDLE ), pos );

 

Ja bym się wkurzył jakby mi ktoś przestawił wielkość buforu w konsoli bez mojej wiedzy.

 

W dodatku nie wiem po co to robić, skoro i tak zawsze dostaniesz standardowe 80x25 (tak jak podajesz). Chodzi tu o pobranie wielkości konsoli, niekoniecznie 80x25

Opublikowano

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633519(v=vs.85).aspx //wielkosc okna (moze da się wyliczyć ilość wierszy i kolumn)

Rozkminilem to , jak bedzie zle to powiedz , ale wydaje mi sie ,ze twoj pomysl jest dobry  ;)

 

 

@ EDIT

 

#include <iostream>
#define _WIN32_WINNT 0x0500
#include <windows.h>

using namespace std;

void gotoxy(int x, int y)
{
COORD pos = {x ,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}

int main ()
{

  HWND console = GetConsoleWindow();
  RECT r;
  GetWindowRect(console, &r); 
  
int x=(((r.right-r.left)-133)/8)+11;
int y=((r.bottom-r.top)-71)/12;

string s="ala ma kota";
gotoxy(x/2-(s.length()/2),y/2);
cout<<s;
gotoxy(x,y);

system("pause>nul");
}

Opublikowano

Nigdy nie modyfikuj w funkcji zmiennych globalnych. 

Nigdy nie komunikuj się z funkcją poprzez zmienne globalne. 

 

Przesyłaj do funkcji zmienne przez referencję, np. "void bufferinfo(int &width, int &height);" lub opakuj ( rozsądnie ) w klasę. 

 

Nigdy też nie zwracaj typu int jeśli zawsze zwracasz to samo. Jeśli zawsze zwracasz to samo, to tak jakbyś nic nie zwracał - a do tego służy void. 

 

Unikaj informowania o błędach poprzez return. O ile nie piszesz dla Google'a, korzystaj z wyjątków. 

Ta sygnatura jest pusta.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...