Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Inny sposób na czyszczenie okna konsoli niż system("cls")

Ostatnio zmodyfikowano 2014-03-06 19:34
Autor Wiadomość
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
P-105711
00Andre
Temat założony przez niniejszego użytkownika
» 2014-03-06 08:39:35
Znalazłem, ale mam mały problem
C/C++
#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 );
    // Tutaj nie używam 500 linijek, a tylko 1 to jest ok
    // ale chce aby była jakaś wartość która by pokazywała ile w konsoli było zapisane
    // np jak 5 lini coś tam zapisanych w konsoli to ustawi tą wartość na 5
   
    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;
}
P-105723
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:
C/C++
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:
C/C++
ConsoleOutputInfo info; //to tworzysz tylko raz!
info.onOut();
cout << "tekst" << endl;
info.clear();
P-105727
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 ?
P-105734
RazzorFlame
» 2014-03-06 14:26:33
To nie ma znaczenia. Proszsz bez klas jak tak potrzebujesz:
C/C++
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:
C/C++
CONSOLEonOut();
cout << "tekst" << endl;
CONSOLEclear();
Ważne by "zapisaneWiersze" był zmienną globalną lub przekazywaną do funkcji CONSOLEonOut i CONSOLEclear.
P-105735
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" ?
P-105756
szymeczek31
» 2014-03-06 19:34:16
Poradnik - Czyszczenie ekranu:

1.Dodajemy nagłówek
#include <windows.h>
.
2.Napisz taką funkcję(przed main):
C/C++
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.
P-105761
« 1 »
  Strona 1 z 1