Menu Steuerung
-
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
-
Das kommt davon, wenn du nur die Hälfte meiner Bemerkungen liest
CStoll schrieb:
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.
Oder nochmal ganz klar:
char ch; while(ch!='\n') { ch=0;//<- GANZ WICHTIG !!! if(kbhit() ch=getch() //... }
-
lalala
hm irgendwie gehts jezze ^^
tjo nu noch nen prob wenn ich nach oben drücke geht er auf posi1 wenn ich
noch ma nach oben drück dann geht der pfeil zu koords die ich nirgendsfestgelegt hab -.-
-
wie wärs z.B. damit:
if (ch==72 && ypos(pos)>5) { gotoxy(xpos(pos),ypos(pos)); cout<<" "; pos=(pos-1)%befehlszahl;//ein Feld hoch gotoxy(xpos(pos),ypos(pos)); cout<<"==>"; } if (ch==80 && ypos(pos)<11) { gotoxy(xpos(pos),ypos(pos)); cout<<" "; pos=(pos+1)%befehlszahl;//ein Feld runter gotoxy(xpos(pos),ypos(pos)); cout<<"==>"; }
Sprich du fragst einfach in den if's bevor du den Pfeil bewegst ypos ab und gibst halt an wie weit er nach oben bzw. nach unten gehen soll (hier z.B. 5 und 11)
Nichtsdestotrotz hätte ich ne Frage:
Ich hab den Code auch probiert, nur verlässt er bei mir die while Schleife nicht wenn ich Enter drücke.Kann mir nicht erklären warum...
-
@steve: kannst du mal den Debugger anwerfen und darauf achten, welche Werte pos jeweils bekommt? (kann sein, daß ich die Modulo-Arithmetik etwas falsch verstanden habe)
@holh:
1. Warum prüfst du dort nicht direkt den Wert von pos (sollte zwischen 0 und 1 liegen)?
2. Wenn er oben angekommen ist, sollte der Pfeil eigentlich ans untere Ende des Menüs wandernIch hab den Code auch probiert, nur verlässt er bei mir die while Schleife nicht wenn ich Enter drücke.
Kann mir nicht erklären warum...
Möglicherweise hast du die Abbruchbedingung falsch gesetzt.