Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Meta en 27 Julio 2020, 15:45 pm



Título: Se muestra o no el cursor depende de...
Publicado por: Meta en 27 Julio 2020, 15:45 pm
Hola:

En C++ nativo con Visual Studio Community 2019, tengo este código,  que no se muestra el cursor.

Código
  1. #include <iostream>
  2. #include <windows.h> // Para mostrar texto en el título de la ventana.
  3. #include <stdio.h>   // Cambio color de fondo y letras.
  4.  
  5. using namespace std;
  6. //using std::cout;
  7. //using std::cin;
  8.  
  9. // Función posición del cursor.
  10. void gotoxy(int x, int y)
  11. {
  12. HANDLE hcon;
  13. hcon = GetStdHandle(STD_OUTPUT_HANDLE);
  14. COORD dwPos;
  15. dwPos.X = x;
  16. dwPos.Y = y;
  17. SetConsoleCursorPosition(hcon, dwPos);
  18. }
  19.  
  20. int main()
  21. {
  22.     // Mostrar caracteres correctamente en pantalla y título de la ventana.
  23. SetConsoleOutputCP(65001);
  24. wchar_t titulo[128];
  25. MultiByteToWideChar(CP_UTF8, 0, "Título de la ventana. Win32 C++ 2019.", -1, titulo, 128);
  26. SetConsoleTitle(titulo);
  27.  
  28. // Tamaño de la pantalla. Se cambia en los dos últimos dígitos.
  29. SMALL_RECT r = { 0, 0, 49, 9 }; // X = 49, Y = 9.
  30. SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r);
  31.  
  32. // Cambio color de 8 (gris), color letras 0 (negro).
  33. //system("color 80");
  34.  
  35. // Ocultar cursor.
  36. CONSOLE_CURSOR_INFO cci;
  37. GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
  38. cci.bVisible = 0; // 0 oculta. 1 muestra cursor.
  39. SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
  40.  
  41. // Mostrar textos en pantalla.
  42. cout << "Terminarías. Conocerías. Título. Analógico. \n";
  43. cout << "Muchas gracias mi muy distinguido amigo.";
  44.  
  45. // Limpiar pantalla.
  46. system("cls");
  47.  
  48. // Mostrar textos en pantalla.
  49. cout << "Se escribe este texto después de haber " << endl;
  50. cout << "borrado el anterior." << endl;
  51.  
  52. // Posición del cursor.
  53. gotoxy(5, 5);
  54.  
  55. cout << "Posición." << endl;
  56.  
  57. // Ocultar cursor.
  58. CONSOLE_CURSOR_INFO cci2;
  59. GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci2);
  60. cci2.bVisible = 1; // 0 oculta. 1 muestra cursor.
  61. SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci2);
  62.  
  63. // Esperando pulsar Enter para salir.
  64. cin.get();
  65. return 0;
  66. }

Si quito este código.
Código
  1. // Cambio color de 8 (gris), color letras 0 (negro).
  2. system("color 80");

Se muestra el cursor parpadeando como siempre.

¿Esto es normal?

Para mi no lo es, una cosa es cambiar el color de la ventana y letras, es independiente al parpadeo del cursor si está activado o no.

Saludos.


Título: Re: Se muestra o no el cursor depende de...
Publicado por: Serapis en 30 Julio 2020, 18:25 pm
El cursor, también tiene su color...

En general usa un color inverso al del color del fondo así se asegura que se vea al no coincidir, pero el inverso de H808080 es... el mismo valor o casi H797979, en la práctica dos colores que se diferencian en casi nada no se aprecian como distintos.

El cursor, usa dos colores, uno para el tiempo 'visible' y otro para el tiempo 'invisible', cuando dichos colores son distintos, se percibe el parpadeo, cuando ambos colores son iguales o casi, no se percibe parpadeo, pero ese parpadeo se produce siempre (es decir se alterna entre dos colores siempre).

...pasa situaciones similares cuando un programa elige un color 'transparente' y luego una imagen acaba incluyendo dicho color en su gama... malogrando así la visualización correcta.

También sucede con 'objetos que simulan una textura '3D', como botones, cuadros de texto, etc... usar uno de los colores que se usan para generar dicho relieve, viene a anular parcialmente el relieve, pués forma parte del fondo que le rodea.

Cuando uno altera colores, deber tener claro, si tendrá 'efectos secudarios'... y en general hay que evitar usar ciertos colores (como el 'rosa chicle' o  el 'gris medio' (H808080), es un color a evitar) en programas (ventanas) que no son 100% tuyos... pués puede no saberse que postura/función podrían tener tales colores...
El caso más típico a evitar es usar el mismo color para el texto que para el fondo... (pués no se distinguiría el texto).


Título: Re: Se muestra o no el cursor depende de...
Publicado por: Meta en 31 Julio 2020, 02:19 am
Buenas:

Pues sí, es tal como lo dices, nunca lo he imaginado, ya que con otros lenguajes como C#, incluso el C++ CLR .net no me pasa, si cambio las letras, cambio el cursor automaticamente también.

Código
  1. system("color 1F");

Así está mejor.

Muchísimas gracias.  ;-)