Menu Steuerung



  • Hallo,

    ich habe mir ein kleines Menu gemacht und möchte dies nun mit den Pfeiltasten steuern.
    ich hab soweit alles das größte problem is aber das "zeichnen" eines Pfeils

    anbei der Code

    #include "iostream"
    #include "windows.h"
    #include "conio.h"
    
    using namespace std;
    
    void gotoxy(short x, short y)
    {
        HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD position = { x , y };
    
        SetConsoleCursorPosition(hStdout, position);
    }
    void main()
    {
    	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    	CONSOLE_CURSOR_INFO CCI;
    	GetConsoleCursorInfo(hOut, &CCI);
    	CCI.bVisible = false;
    	SetConsoleCursorInfo(hOut, &CCI);
    
    	int x=27;
    	char taste;
    	int y=8;
    	char a=205,b=201,c=187,d=186,e=200,f=188,g=205,h=209,k;
    
    	gotoxy(27, 6);                                           cout <<"                        "<<b<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<c<<endl;
    	gotoxy(27, 7);                                                         cout <<"                        "<<d<<"            "<<d<<endl;
    	gotoxy(27, 8);                                                         cout <<"                        "<<d<<"    TEST    "<<d<<endl;
    	gotoxy(27, 9);                                                         cout <<"                        "<<d<<"            "<<d<<endl;
    	gotoxy(27, 10);                                                         cout <<"                        "<<e<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<f<<endl;
    	gotoxy(27, 11);                                                         cout <<""<<endl;
    	gotoxy(27, 12);                                                         cout <<""<<endl;
    	gotoxy(27, 13);                                                         cout <<"                        "<<b<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<c<<endl;
    	gotoxy(27, 14);                                                         cout <<"                        "<<d<<"            "<<d<<endl;
    	gotoxy(27, 15);                                                         cout <<"                        "<<d<<"    TEST    "<<d<<endl;
    	gotoxy(27, 16);                                                         cout <<"                        "<<d<<"            "<<d<<endl;
    	gotoxy(27, 17);                                                         cout <<"                        "<<e<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<f<<endl;
    
    	gotoxy(x,y);
    
    	while (true)
        {      
            char ch=0;  
            if (kbhit()) ch=getch ();
            {
                if (ch==72) {
                    cout << "P" << endl;
    				y--;
                    gotoxy(x,y);
                }          
                if (ch==80) {
                    cout << "gedr\201ckt" << endl;
    				y++;
                    gotoxy(x,y);
            }
        }
        return 0;
    }
    

    also ich möchte einen Pfeil oder ähnliches mit dem ich die 2 Punkte anwählen kann
    also mit gotoxy un so is nit das Problem das Problem is das wenn ich das einfach nur mit nem cout mache die ausgabe bleibt



  • du musst mit gotoxy in die zeile springen in der du vorher warst und da den pfeil "übermalen"

    angenommen du hast bei gotoxy(5,5) "->" und willst jetzt zu gotoxy(5,6) "->", dann musst du wieder zu gotoxy(5,5) " ".



  • hm,

    kannste des als kleenes c++ Beispiel zeigen
    steh grad auf der Leitung 🙂



  • Pfeil zeichnen:

    gotoxy(5,5);
    cout<<"->";
    

    Pfeil löschen (=überschreiben):

    gotoxy(5,5);
    cout<<"  ";
    


  • so sieht es jezze aus

    while (true)
        {      
            char ch=0;  
            if (kbhit()) ch=getch ();
            {
                if (ch==72) 
    			{
    		cout << "------->" << endl; 
                    gotoxy(27,8);
                }          
                if (ch==80) 
    			{
                    cout << "------->" << endl;
                    gotoxy(27,15);
                }
        }
    

    wenn ich Pfeilhoch bzw Pfeilrunter drücke bleib der "cout Pfeil"da wie änder ich das?



  • indem du (mit gotoxy()) an die richtige Position gehst und entsprechend viele Leerzeichen drüberschreibst.

    PS: if hoffe, das alleinstehende if ist ein Tipfehler 😉



  • ehm jo warn tipfehler...

    ich hab das so mal gemacht

    if (ch==72) 
    	{
    		cout <<"----->"<<endl;
                    gotoxy(27,8);
                    gotoxy(27,15);
                    cout <<"      "<<endl;
                }
    

    aber so gehts nich



  • aber so gehts nich

    Klar, ist ja auch die verkehrte Reihenfolge 😉

    if(ch==72)
    {
      gotoxy(27,8);//Zielposition des Pfeils
      cout<<"---->";
      gotoxy(27,15);//alte Position des Pfeils
      cout<<"     ";
    }
    

    (für ch==80 mußt du die gotoxy()-Aufrufe austauschen)



  • geht gut 🙂

    wie mach ich des jezze das wenn ich noch mal nach unten drücke er wieder oben ist bzw wenn ich oben bin und noch ma nach oben drück er wieder unten is ? 🙂



  • Fass doch mal dein ganzes Problem in ein Thema zusammen 😉

    Also: Du mußt mitschreiben, an welcher Stelle des Menüs du dich gerade befindest. Dann kannst du es erstens leichter erweitern (z.B. durch einen dritten Menüpunkt) und zweitens nach der Auswahl feststellen, wo du zuletzt warst:

    int pos=0;//speichert die aktuelle Position im Menü
    //...
    char ch=0;//aus technischen Gründen vor die Schleife gezogen
    while (ch!='\n')
    {      
      ch=0;  
      if (kbhit()) ch=getch ();
    
      if (ch==72) 
      {
        gotoxy(xpos(pos),ypos(pos));cout<<"   ";
        pos=(pos-1)%befehlszahl;//ein Feld hoch
        gotoxy(xpos(pos),ypos(pos));cout<<"==>";
      }
      if (ch==80) 
      {
        gotoxy(xpos(pos),ypos(pos));cout<<"   ";
        pos=(pos+1)%befehlszahl;//ein Feld runter
        gotoxy(xpos(pos),ypos(pos));cout<<"==>";
      }
    }
    
    gotoxy(1,1);//oben links
    switch(pos)
    {
    case 0:cout<<"oberster Befehl";break;
    case 1:cout<<"zweiter Befehl";break;
    //...
    }
    

    xpos() und ypos() bestimmen die Position des Pfeils je nach gewähltem Menubefehl. Für dein Beispiel reicht z.B.:

    int xpos(int p)
    {return 27;}
    int ypos(int p)
    {return 8+7*p;}
    

    PS: Da ich zu faul bin, das hier doppelt zu beantworten, das obige Fragment sollte auch die Frage aus "Menu Eingabe" lösen - mit ENTER (='\n') wird die Schleife verlassen und in pos steht hinterher drin, welcher Befehl ausgewählt war.



  • hm da ich grad noch mal auf der leitung stehe möchte ich dich noch ma bitten
    den quellcode komplett einzubetten da ich ma wieder fehler bekomm ^^

    #include "iostream"
    #include "windows.h"
    #include "conio.h"
    
    using namespace std;
    
    void gotoxy(short x, short y)
    {
        HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD position = { x , y };
    
        SetConsoleCursorPosition(hStdout, position);
    }
    void main()
    {
    	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    	CONSOLE_CURSOR_INFO CCI;
    	GetConsoleCursorInfo(hOut, &CCI);
    	CCI.bVisible = false;
    	SetConsoleCursorInfo(hOut, &CCI);
    
    	int xpos(int p)
    	{return 27;}
    	int ypos(int p)
    	{return 8+7*p;}
    	int x=33;
    	int pos=0;
    	char taste;
    	int y=8;
    	char a=205,b=201,c=187,d=186,e=200,f=188,g=205,h=209,k=62;
    
    	gotoxy(27, 6); cout <<"                        "<<b<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<c<<endl;
    	gotoxy(27, 7); cout <<"                        "<<d<<"            "<<d<<endl;
    	gotoxy(27, 8); cout <<"                        "<<d<<"    TEST    "<<d<<endl;
    	gotoxy(27, 9); cout <<"                        "<<d<<"            "<<d<<endl;
    	gotoxy(27, 10);cout <<"                        "<<e<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<f<<endl;
    	gotoxy(27, 11);cout <<"      ==>"<<endl;
    	gotoxy(27, 12);cout <<""<<endl;
    	gotoxy(27, 13);cout <<"                        "<<b<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<c<<endl;
    	gotoxy(27, 14);cout <<"                        "<<d<<"            "<<d<<endl;
    	gotoxy(27, 15);cout <<"                        "<<d<<"    TEST    "<<d<<endl;
    	gotoxy(27, 16);cout <<"                        "<<d<<"            "<<d<<endl;
    	gotoxy(27, 17);cout <<"                        "<<e<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<f<<endl;
    
    	gotoxy(x,y);
    	char ch=0;
    
    	while (ch!='\n')
        {      
    
            if (kbhit()) ch=getch ();
            {
                if (ch==72)
    			{
        gotoxy(xpos(pos),ypos(pos));cout<<"   ";
        pos=(pos-1)%befehlszahl;//ein Feld hoch
        gotoxy(xpos(pos),ypos(pos));cout<<"==>";
    			}
    		if (ch==80)
    		{
        gotoxy(xpos(pos),ypos(pos));cout<<"   ";
        pos=(pos+1)%befehlszahl;//ein Feld runter
        gotoxy(xpos(pos),ypos(pos));cout<<"==>";
    		}
    		}
    
    gotoxy(1,1);//oben links
    switch(pos)
    {
    case 0:cout<<"oberster Befehl";break;
    case 1:cout<<"zweiter Befehl";break; 
    }
    	}
    }
    

    so siehts aus aber geht nit weiter ^^ oder habsch was falsch gemacht?

    btw du wirst ab heut mein persölicher held sein 😉



  • Wie sieht denn der Fehler aus, der da kommt? Mir fällt auf Anhieb nur auf, daß du nach am Beginn der while()-Schleife ch noch zurücksetzen solltest - sonst rattert das Programm so schnell durch dein Menü, daß du nicht mehr hinterherkommst.

    PS: Außerdem benötigst du noch die beiden Hilfsfunktionen xpos() und ypos() aus meinem letzten Beitrag und eine Variable oder Konstante namens 'befehlszahl' (belegt mit dem Wert 2).



  • ja wo muss das :

    int xpos(int p)
    {return 27;}
    int ypos(int p)
    {return 8+7*p;}
    

    hin ? ^^



  • irgenwo oberhalb der main()-Funktion (kannst dir noch aussuchen, ob du das vor oder nach der gotoxy() hinpackst).

    PS: Was mir vorher noch nicht aufgefallen ist - das muß "int main()" heißen.



  • schau ma oben bei dem Quelltext da hab ich das hingemacht mit xpos...
    dann schreibt er mir aber beim debuggen das dieser return befehl falsch is



  • Das gehört doch nicht in die main-Funktion, sondern davor.



  • ahh aber nu hab ich ne endlosschleife ^^



  • Und wo? Kannst du mal den aktuellen Quelltext posten, damit man das überprüfen kann?

    (aus meiner Sicht sieht das obige Programm fast korrekt aus - abgesehen von den falsch platzierten Funktionsdefinitionen)



  • OT: Ihr werden hier wohl doch noch ein Ende finden, oder??? 😃



  • hm ja wäre nit schlecht ^^

    aber immer wenn ich jezze das prog starte und nach oben drücke ehm ja dann hab ich quasi ne endloss schleife 😉


Anmelden zum Antworten