¿Cómo puedo sobrescribir la misma parte de la consola en una aplicación de consola C++ nativa de Windows, sin utilizar una biblioteca de terceros?

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo una aplicación de consola que necesita mostrar el estado de los elementos, pero en lugar de que el texto se desplace como un loco, prefiero ver que el estado actual siga apareciendo en las mismas líneas.Por ejemplo:

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

debería ser la salida, donde 'nn' es el porcentaje actual completo y 'bbbb' es el tamaño del búfer, actualizado periódicamente en las mismas líneas de la consola.

El primer enfoque que tomé simplemente imprimió la cantidad correcta de retrocesos en la consola antes de imprimir el nuevo estado, pero esto tiene un desagradable parpadeo del que quiero deshacerme.También quiero ceñirme a la biblioteca estándar o a la funcionalidad proporcionada por MS (VC 8) para no introducir otra dependencia para esta simple necesidad.

¿Fue útil?

Solución

Puedes usar Establecer posición del cursor de la consola.tendrás que llamar ObtenerStdHandle para obtener un identificador del búfer de salida.

Otros consejos

Joseph, JP y CodingTheWheel brindaron una valiosa ayuda.

Para mi caso simple, el enfoque más sencillo parecía basarse en La respuesta de 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
  //...
}

Para problemas más complicados, el completo API de consola según lo dispuesto por La respuesta de J.P., en coordinación con los ejemplos proporcionados a través del enlace de la respuesta de joseph puede resultar útil, pero encontré el trabajo necesario para utilizar CHAR_INFO Demasiado tedioso para una aplicación tan sencilla.

Si imprime usando y no usa una función que genere una nueva línea o agregue al final, el cursor volverá al principio de la línea y simplemente imprimirá sobre lo siguiente que coloque.Generar la cadena completa antes de imprimir también podría reducir el parpadeo.

ACTUALIZAR:La pregunta se cambió a 2 líneas de resultado en lugar de 1, lo que hace que mi respuesta ya no esté completa.Probablemente sea necesario un enfoque más complicado.JP tiene la idea correcta con el API de consola.Creo que el siguiente sitio detalla muchas de las cosas que necesitará para lograr su objetivo.El sitio también menciona que la clave para reducir el parpadeo es mostrar todo fuera de la pantalla antes de mostrarlo.Esto es cierto siempre que muestra algo en la pantalla, ya sea texto o gráficos (2D o 3D).

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

En caso de que la sugerencia de Joseph no le brinde suficiente flexibilidad, eche un vistazo a la API de la consola: http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx.

En Linux, puede lograr esto imprimiendo \b y/o en stderr.Es posible que tengas que experimentar para encontrar la combinación correcta de elementos en Windows.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top