Cursor in 2D Array



  • Hallo,
    Ich habe in VS-Code ein 2D char Array und lasse mir dieses auf der Konsole ausgeben. Das Array möchte ich mit dem Cursor bearbeiten können (Werte ändern). Habe schon einiges über verschiedene Funktionen und librarys wie conio.h gelesen , welche aber alle nicht von C++ erkannt werden. schlussendlich habe ich trotz langer suche nicht wirklich eine Lösung finden können und hoffe Ihr könnt mir weiter helfen.



  • C++ kann das nicht direkt, sondern Du musst die Funktionen des jeweiligen Betriebssystem für dessen Konsole verwenden. Du kannst sie aber aus einem C++-Programm aufrufen.



  • Ich würde gerne in meinem Array Navigieren ohne Enter drücken zu müssen. Ich habe auch schon versucht mit cin.get oder getchar zu arbeiten, allerdings mit wenig Erfolg. Wenn ich jetzt unter Windows meinen Cursor über die Pfeiltasten steuern möchte, welche Funktion muss ich mir da anschauen?



  • @Ealazar Wie @zeropage bereits schrieb, ist das alles nicht so einfach.
    Natürlich könntest du eine eigene Konsole schreiben in der du mit Pfeiltasten navigieren kannst aber einfach so in der "normalen" Konsole wird das schwer.

    Wenn du wirklich alles unter Windows selbst machen willst, ist vlt das hier ein guter Startpunkt: https://docs.microsoft.com/en-us/windows/win32/learnwin32/learn-to-program-for-windows

    Ich würde aber eher zu einer GUI Library wie QT oder wxWidgets raten, wenn du mit mehr User Input arbeiten möchtest, als über std::cin und std::cout.



  • Hast du dir schon die (Windows) Konsolenfunktionen angeschaut? Da gibt es u.a. SetConsoleCursorPosition sowie GetConsoleScreenBufferInfo.



  • @Ealazar sagte in Cursor in 2D Array:

    Wenn ich jetzt unter Windows meinen Cursor über die Pfeiltasten steuern möchte, welche Funktion muss ich mir da anschauen?

    Die einfachste Methode ist wohl:

    #include <windows.h>
    #include <iostream>
    #include <conio.h>
    
    
    using namespace std;
    
    
    void SetCursorPosition(SHORT x, SHORT y)
    {
        COORD pos = {x, y};
    
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
    }	
    
    void ClearScreen(void)
    {
        CONSOLE_SCREEN_BUFFER_INFO csbi;
        COORD target = {0, 0};
        DWORD written;
    
        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
        FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), ' ',
                                                csbi.dwSize.X * csbi.dwSize.Y,
                                                target, &written);
        FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7,
                                                csbi.dwSize.X * csbi.dwSize.Y,
                                                target, &written);
    
        SetCursorPosition(0, 0);
    }
    
    
    int main()
    {
       ClearScreen();
       
       int count{8};
       
       while(count)
       {
          int in = getch();
          if(in != 224)
             continue;
             
          in = getch();
          switch(in)
          {
             case 72:
                SetCursorPosition(5, 5);
                cout << "oben ";
                --count;
                break;
             case 75:
                SetCursorPosition(5, 5);
                cout << "links ";
                --count;
                break;
             case 77:
                SetCursorPosition(5, 5);
                cout << "rechts";
                --count;
                break;
             case 80:
                SetCursorPosition(5, 5);
                cout << "unten ";
                --count;
                break;
          }
       }
    }
    

Anmelden zum Antworten