kiedyś napisałem sobie klasę do obsługi konsoli może Ci się przyda. Kod pisany dobrych kilka lat temu bez zajomości winapi więc nie ręczę za jego merytoryczną treść. Ale jako tako działa.
#ifndef consol
#define consol
#include <windows>
#include <iostream>
class console
{
public :
char znak;
HANDLE hOut;
console() {}
console(int szerokosc,int wysokosc)
{
ustaw_okno(szerokosc,wysokosc);
kolor(15);
kursor_off();
}
// ustawia rozmiar konsoli s - szerokosc w - wysokosc
void ustaw_okno(int s,int w)
{
HWND console = GetConsoleWindow();
COORD c = {s, w};
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), c);
ShowWindow(console, SW_MAXIMIZE);
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
}
// czysci ekran konsoli
void clrscr()
{
system( "cls" );
}
// wylacza kursor
void kursor_off()
{
::HANDLE hConsoleOut = ::GetStdHandle( STD_OUTPUT_HANDLE );
::CONSOLE_CURSOR_INFO hCCI;
::GetConsoleCursorInfo( hConsoleOut, &hCCI );
hCCI.bVisible = FALSE;
::SetConsoleCursorInfo( hConsoleOut, &hCCI );
}
// wlacza kursor
void kursor_on()
{
::HANDLE hConsoleOut = ::GetStdHandle( STD_OUTPUT_HANDLE );
::CONSOLE_CURSOR_INFO hCCI;
::GetConsoleCursorInfo( hConsoleOut, &hCCI );
if ( hCCI.bVisible != TRUE )
{
hCCI.bVisible = TRUE;
::SetConsoleCursorInfo( hConsoleOut, &hCCI );
}
}
// skok kursora do pozycji X i Y
void gotoxy(int x,int y)
{
COORD c={x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
// zmienia kolor napisow color
// 0.czarny
// 1.ciemny niebieski
// 2.ciemny zielony
// 3.ciemny blekitny
// 4.ciemny czerwony
// 5.fioletowy
// 6.ciemny zolty
// 7.jasny szary
// 8.ciemny szary
// 9.jasny niebieski
// 10.jasny zielony
// 11.jasny blekitny
// 12.jasny czerwony
// 13.rozowy
// 14.jasny zolty
// 15.bialy
void kolor(int color)
{
SetConsoleTextAttribute(hOut,color);
}
void background(int color)
{
}
// gX = wspolzedne gorny rog X, gY wspolzedne gorny rog Y
// dX i dY -- || -- dolne rogi
// color - kolor
// chr = numer znaku ascii
// pusta - czy czyscic wnetrze ramki przy rysowaniu
void ramka(int gX,int gY,int dX, int dY, int color, int chr,bool pusta)
{
int i,j;
kolor(color);
for(i=gX; i<=dX; i++)
{
gotoxy(i,gY);
std :: cout << char(chr);
gotoxy(i,dY);
std :: cout << char(chr);
}
for(j=gY; j<=dY; j++)
{
gotoxy(gX,j);
std :: cout << char(chr);
gotoxy(dX,j);
std :: cout << char(chr);
}
if (pusta == false)
{
for (j=gY+1; j<=dY-1; j++)
{
for (i=gX+1;i<=dX-1; i++)
{
gotoxy(i,j);
std :: cout << char(255);
}
}
}
}
// ramka rysowana za pomoca 2 cienkich lini
// gX = wspolzedne gorny rog X, gY wspolzedne gorny rog Y
// dX i dY -- || -- dolne rogi
// color - kolor
// pusta - czy czyscic wnetrze ramki przy rysowaniu
void ramka_dwuliniowa(int gX,int gY,int dX, int dY, int color, bool pusta)
{
int i,j;
kolor(color);
for(i=gX; i<=dX; i++)
{
gotoxy(i,gY);
std :: cout << char(205);
gotoxy(i,dY);
std :: cout << char(205);
}
for(j=gY; j<=dY; j++)
{
gotoxy(gX,j);
std :: cout << char(186);
gotoxy(dX,j);
std :: cout << char(186);
}
gotoxy(gX,gY);
std :: cout << char(201);
gotoxy(dX,dY);
std :: cout << char(188);
gotoxy(gX,dY);
std :: cout << char(200);
gotoxy(dX,gY);
std :: cout << char(187);
if (pusta == false)
{
for (j=gY+1; j<=dY-1; j++)
{
for (i=gX+1;i<=dX-1; i++)
{
gotoxy(i,j);
std :: cout << char(255);
}
}
}
}
// ramka rysowana za pomoca 1 cienkiej lini
// gX = wspolzedne gorny rog X, gY wspolzedne gorny rog Y
// dX i dY -- || -- dolne rogi
// color - kolor
// pusta - czy czyscic wnetrze ramki przy rysowaniu
void ramka_liniowa(int gX,int gY,int dX, int dY, int color, bool pusta)
{
int i,j;
kolor(color);
for(i=gX; i<=dX; i++)
{
gotoxy(i,gY);
std :: cout << char(196);
gotoxy(i,dY);
std :: cout << char(196);
}
for(j=gY; j<=dY; j++)
{
gotoxy(gX,j);
std :: cout << char(179);
gotoxy(dX,j);
std :: cout << char(179);
}
gotoxy(gX,gY);
std :: cout << char(218);
gotoxy(dX,dY);
std :: cout << char(217);
gotoxy(gX,dY);
std :: cout << char(192);
gotoxy(dX,gY);
std :: cout << char(191);
if (pusta == false)
{
for (j=gY+1; j<=dY-1; j++)
{
for (i=gX+1;i<=dX-1; i++)
{
gotoxy(i,j);
std :: cout << char(255);
}
}
}
}
// wyswietla tekst na danej pozycji na ekranie
// x i y - pozycja na erkanie
// s - napis
void textXY(int x,int y,std :: string s)
{
gotoxy(x,y);
std :: cout << s;
}
void textXY(int x,int y,char s)
{
gotoxy(x,y);
std :: cout << s;
}
// wyswietla pojustowany tekst
// x i y - pozycja na ekranie
// s - napis
// dkugosc_wiersza - co ile znakow kursor ma przechodzic do nowego wiersza
void textXY(int x,int y, std :: string s,int dlugosc_wiersza)
{
unsigned int i = 0 ,j = 0,last = 0 ,obieg_petli = 0,ograniczenie = 0;
bool czy_przejsc_do_nastepnej = false;
ograniczenie = dlugosc_wiersza + last;
gotoxy(x,y);
for (unsigned i = 0; i<s.length(); i++)
{
if (czy_przejsc_do_nastepnej == true) gotoxy(x,y);
czy_przejsc_do_nastepnej = false;
if ((i >= dlugosc_wiersza + j) && (s[i] == ' '))
{
y++;
last = i + 1;
czy_przejsc_do_nastepnej = true;
obieg_petli++;
j = j + dlugosc_wiersza;
} else
{
std :: cout << s[i];
}
}
}
// wysrodkowany tekst (1 linijkowy)
void textY(int y,std :: string s)
{
int srodek;
srodek = 40 - s.length() / 2;
gotoxy(srodek,y);
std :: cout << s;
}
std::string toString(int n)
{
std::string tmp, ret;
if(n < 0)
{
ret = "-";
n = -n;
}
do
{
tmp += n % 10 + 48;
n -= n % 10;
}
while(n /= 10);
for(int i = tmp.size()-1; i >= 0; i--)
ret += tmp[i];
return ret;
}
};
#endif