[C++] Inny sposób na czyszczenie okna konsoli niż system("cls")
Ostatnio zmodyfikowano 2014-03-06 19:34
00Andre Temat założony przez niniejszego użytkownika |
[C++] Inny sposób na czyszczenie okna konsoli niż system("cls") » 2014-03-05 22:49:15 Siemka.
Mam taki mały dokuczający problem, ponieważ piszę rożne projekty i nie raz jest potrzebne wyczyszczenie okna konsoli i przy częstych wyczyszczeniach dochodzi do efektu Migania okna konsoli ;c
Jest jakiś inny sposób na czyszczenie ekranu bez tego Migania ? ;d
00Andre |
|
00Andre Temat założony przez niniejszego użytkownika |
» 2014-03-06 08:39:35 Znalazłem, ale mam mały problem #include <iostream> #include <windows.h>
using namespace std;
void gotoxy( int x, int y ) { COORD cord; cord.X = x; cord.Y = y; SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), cord ); }
void Czyszczenie() { gotoxy( 0, 0 ); for( int a = 0; a < 500; a++ ) cout << "" << endl; gotoxy( 0, 0 ); }
int main() { cout << "Tekst"; Sleep( 1000 ) Czyszczenie(); Sleep( 1000 ) cout << "Memo"; return 0; }
|
|
RazzorFlame |
» 2014-03-06 10:56:00 Sprawdzaj czy jakiś znak w danej linii został zapisany i wtedy czyść. Jest też pewien szkopuł. Szukanie np. pojedynczych znaczków w konsoli jest żmudne. Lepiej zrób sobie klase: class ConsoleOutputInfo { public: std::vector < int > zapisaneWiersze; void onOut() { static HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE ); CONSOLE_SCREEN_BUFFER_INFO CSBinfo; GetConsoleScreenBufferInfo( hOut, & CSBInfo ); int y = CSBInfo.dwCursorPosition.Y; zapisaneWiersze.push_back( y ); } void clear() { for( unsigned int i = 0; i < zapisaneWiersze.size(); i++ ) { gotoxy( 0, zapisaneWiersze[ i ] ); printf( "\33[2K\r" ); } } };
Wtedy przy wyświetlaniu robisz tak: ConsoleOutputInfo info; info.onOut(); cout << "tekst" << endl; info.clear();
|
|
00Andre Temat założony przez niniejszego użytkownika |
» 2014-03-06 13:38:14 Jeszcze nie zaczynałem klasy, jest inny sposób bez klas ? |
|
RazzorFlame |
» 2014-03-06 14:26:33 To nie ma znaczenia. Proszsz bez klas jak tak potrzebujesz: std::vector < int > zapisaneWiersze; void CONSOLEonOut() { static HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE ); CONSOLE_SCREEN_BUFFER_INFO CSBinfo; GetConsoleScreenBufferInfo( hOut, & CSBInfo ); int y = CSBInfo.dwCursorPosition.Y; zapisaneWiersze.push_back( y ); } void CONSOLEclear() { for( unsigned int i = 0; i < zapisaneWiersze.size(); i++ ) { gotoxy( 0, zapisaneWiersze[ i ] ); printf( "\33[2K\r" ); } }
I potem: CONSOLEonOut(); cout << "tekst" << endl; CONSOLEclear();
Ważne by "zapisaneWiersze" był zmienną globalną lub przekazywaną do funkcji CONSOLEonOut i CONSOLEclear. |
|
Adik80 |
» 2014-03-06 18:16:26 Windowsowa konsola obsluguje escape kody??? Jesli tak to nie lepiej zamiast czyscic kazda linie osobno wyczyscic caly ekran? "\033[2J" ? |
|
szymeczek31 |
» 2014-03-06 19:34:16 Poradnik - Czyszczenie ekranu: 1.Dodajemy nagłówek #include <windows.h> . 2.Napisz taką funkcję(przed main): void cls() { HANDLE hStdout; hStdout = GetStdHandle( STD_OUTPUT_HANDLE ); COORD coordScreen = { 0, 0 }; DWORD cCharsWritten; CONSOLE_SCREEN_BUFFER_INFO csbi; DWORD dwConSize; if( !GetConsoleScreenBufferInfo( hStdout, & csbi ) ) return; dwConSize = csbi.dwSize.X * csbi.dwSize.Y; if( !FillConsoleOutputCharacter( hStdout,( TCHAR ) ' ', dwConSize, coordScreen, & cCharsWritten ) ) return; if( !GetConsoleScreenBufferInfo( hStdout, & csbi ) ) return; if( !FillConsoleOutputAttribute( hStdout, csbi.wAttributes, dwConSize, coordScreen, & cCharsWritten ) ) return; SetConsoleCursorPosition( hStdout, coordScreen ); }
3.Aktywujemy w kodzie pisząc cls(); . Poradnik na poziomie amatorskim chyba zrozumiesz :P. |
|
« 1 » |