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

[WinAPI] Jak ukryć kursor w oknie konsoli?

Ostatnio zmodyfikowano 2013-01-31 23:36
Autor Wiadomość
kilroy
Temat założony przez niniejszego użytkownika
[WinAPI] Jak ukryć kursor w oknie konsoli?
» 2013-01-31 12:12:58
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?

C/C++
#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.
P-75442
DejaVu
» 2013-01-31 17:04:28
C/C++
void HideCursor()
{
    ::HANDLE hConsoleOut =::GetStdHandle( STD_OUTPUT_HANDLE );
    ::CONSOLE_CURSOR_INFO hCCI;
    ::GetConsoleCursorInfo( hConsoleOut, & hCCI );
    hCCI.bVisible = FALSE;
    ::SetConsoleCursorInfo( hConsoleOut, & hCCI );
}

void ShowCursor()
{
    ::HANDLE hConsoleOut =::GetStdHandle( STD_OUTPUT_HANDLE );
    ::CONSOLE_CURSOR_INFO hCCI;
    ::GetConsoleCursorInfo( hConsoleOut, & hCCI );
    if( hCCI.bVisible != TRUE )
    {
        hCCI.bVisible = TRUE;
        ::SetConsoleCursorInfo( hConsoleOut, & hCCI );
    }
}
Źródło: http://peb.pl/programowanie/656981-c-jak-wy-aczyae-kursor-w.html
P-75461
kilroy
Temat założony przez niniejszego użytkownika
» 2013-01-31 23:36:36
Dzięki DejaVu, kursor znika
P-75521
« 1 »
  Strona 1 z 1