Jak pozbyć się migającego kursora pozycji w konsoli? W menu mojego programu posługuję się strzałkami, a wspomniany kursor, niestety przesuwa się po ekranie z każdym obiegiem pętli i nieładnie to wygląda.
W programie korzystam z biblioteki <windows.h>. Pola wyboru na ekranie umieszczam za pomocą
std::cout << "";
w pozycji opisanej przez funkcję
gotoxy();
Klawisze wczytuję za pomocą
GetAsyncKeyState() & 1;
Co ciekawe, po wybraniu opcji z menu, a następnie powrocie do tego menu - migać (z różną częstotliwością - małą, ale widoczną) zaczynają też pola wyboru (z wyjątkiem pierwszego). Zaraz po uruchomieniu tego programu nie ma takiego problemu.
Kolejnym problemem jest wciśnięty klawisz enter. Ustawiłem, że po wciśnięciu
GetAsyncKeyState( VK_RETURN ) & 1;
wychodzę z pętli. Niestety okazuje się, że klawisz po wyjściu jeszcze jest wciśnięty, co skutkuje różnymi problemami, np. wciśnięciem pola w następnym menu kontekstowym. Rozwiązuję ten problem linią
std::cin.get();
. Znacie lepsze rozwiązanie? Bo przy innych klawiszach ono już nie działa i np. jeśli po wybraniu pola gdzie chciałbym wypisać liczbę, automatycznie wypisują mi się klawisze, które wcześniej (przed uruchomieniem tej funkcji) wcisnąłem. Jest możliwość jakby zresetowania stanu wciśniętych klawiszy?
#include <iostream>
#include <windows.h>
void gotoxy( int x, int y )
{
COORD c;
c.X = x - 1;
c.Y = y - 1;
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), c );
}
int main()
{
int poziom_gry, wyb_poz_gry = 1;
std::cout << "\nWybierz poziom trudnosci:";
while( 1 )
{
gotoxy( 10, 10 );
if( wyb_poz_gry == 1 )
SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x70 );
std::cout << "\t[1] - zwykly (10x10 - 16 bomb)\t ";
SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x07 );
gotoxy( 10, 12 );
if( wyb_poz_gry == 2 )
SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x70 );
std::cout << "\t[2] - trudny (17x17 - 40 bomb)\t ";
SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x07 );
gotoxy( 10, 14 );
if( wyb_poz_gry == 3 )
SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x70 );
std::cout << "\t[3] - latwy (9x9 - 10 bomb) \t ";
SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x07 );
if( GetAsyncKeyState( VK_DOWN ) & 1 )
{
if( wyb_poz_gry == 3 )
wyb_poz_gry = 1;
else
wyb_poz_gry++;
}
if( GetAsyncKeyState( VK_UP ) & 1 )
{
if( wyb_poz_gry == 1 )
wyb_poz_gry = 3;
else
wyb_poz_gry--;
}
if( GetAsyncKeyState( VK_RETURN ) & 1 )
break;
}
std::cin.get();
gotoxy( 1, 15 );
std::cout << "Wybrany poziom: " << wyb_poz_gry;
std::cin.get();
return( 0 );
}
PS Dopiero uczę się programowania, więc jeśli ktoś ma pomysł jak mój kod można zapisać jeszcze w krótszej wersji to proszę o podpowiedzi.