Come posso sovrascrivere la stessa parte della console in un'app console C++ nativa di Windows, senza utilizzare una libreria di terze parti?

StackOverflow https://stackoverflow.com/questions/45286

  •  09-06-2019
  •  | 
  •  

Domanda

Ho un'app console che deve visualizzare lo stato degli elementi, ma invece di far scorrere il testo come un matto, preferirei vedere lo stato corrente continuare a essere visualizzato sulle stesse righe.Per fare un esempio:

Running... nn% complete
Buffer size: bbbb bytes

dovrebbe essere l'output, dove 'nn' è la percentuale corrente di completamento e 'bbbb' è la dimensione del buffer, aggiornata periodicamente sulle stesse righe della console.

Il primo approccio che ho adottato ha semplicemente stampato il numero corretto di backspace sulla console prima di stampare il nuovo stato, ma questo ha uno sfarfallio odioso di cui voglio eliminare.Voglio anche attenermi alla libreria standard o alla funzionalità fornita da MS (VC 8) in modo da non introdurre un'altra dipendenza per questa semplice esigenza.

È stato utile?

Soluzione

Puoi usare SetConsoleCursorPosition.Dovrai chiamare OttieniStdHandle per ottenere un handle per il buffer di output.

Altri suggerimenti

Joseph, JP e CodingTheWheel hanno tutti fornito un prezioso aiuto.

Per il mio caso semplice, l'approccio più semplice sembrava essere basato su La risposta di CodingTheWheel:

// before entering update loop
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bufferInfo;
GetConsoleScreenBufferInfo(h, &bufferInfo);

// update loop
while (updating)
{
  // reset the cursor position to where it was each time
  SetConsoleCursorPosition(h, bufferInfo.dwCursorPosition);

  //...
  // insert combinations of sprintf, printf, etc. here
  //...
}

Per problemi più complicati, il file completo API della console come previsto da La risposta di JP, in coordinamento con gli esempi forniti tramite il collegamento da La risposta di Giuseppe potrebbe rivelarsi utile, ma ho trovato il lavoro necessario da utilizzare CHAR_INFO troppo noioso per un'app così semplice.

Se stampi usando e non usi una funzione che genererà una nuova riga o aggiungerà alla fine, il cursore tornerà all'inizio della riga e stamperà semplicemente sopra la cosa successiva che inserisci.Anche la generazione della stringa completa prima della stampa potrebbe ridurre lo sfarfallio.

AGGIORNAMENTO:La domanda è stata modificata in 2 righe di output anziché 1, il che rende la mia risposta non più completa.Probabilmente è necessario un approccio più complicato.JP ha l'idea giusta con il API della console.Credo che il seguente sito descriva in dettaglio molte delle cose di cui avrai bisogno per raggiungere il tuo obiettivo.Il sito afferma inoltre che la chiave per ridurre lo sfarfallio è eseguire il rendering di tutto fuori dallo schermo prima di visualizzarlo.Questo è vero ogni volta che visualizzi qualcosa sullo schermo, sia esso testo o grafica (2D o 3D).

http://www.benryves.com/tutorials/?t=winconsole

Nel caso in cui il suggerimento di Joseph non ti dia abbastanza flessibilità, dai un'occhiata alla Console API: http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx.

In Linux, puoi ottenere questo risultato stampando \b e/o su stderr.Potrebbe essere necessario sperimentare per trovare la giusta combinazione di cose in Windows.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top