immerwieder diese Pfeiltasten
-
hallo ich hab ma wieder problem.
also ich hab 2 menu punkte
menu1
menu2mit hilfe der pfeiltasten beweg ich einen pfeil der halt jedes mal neu gemacht wird wenn ich pfeilhoch oder runter drücke
das ganze geht über gotoxyso ich will jezze wenn der pfeil auf menu 1 steht und ich enter drücke menu1 ausführen wie mach ich das ??
-
Du mußt dir außer den gotoxy()-Aufrufen auch noch merken, wohin du den Pfeil gerade geschoben hast.
(PS: Irgendwie kommt mir die Frage bekannt vor)
-
ja so in der art hat mer schomal
also ich kann das doch theoretisch mit if machen oder ?
muss ich dazu den pfeil in ne variable schreiben ?if (pfeil=menu1)
{
goto menu1 <hätte das halt mit goto dann gemacht
}
-
sinngemäß ja:
(mal eine Variante für n Menüpunkte)lösche_pfeil(menu); if(taste==nach unten) { menu+=1; if(menu>maxmenu) menu=maxmenu; } elseif(taste==nach oben) { menu-=1; if(menu<1) menu=1; } elseif(taste==enter) switch(menu) { case 1:return sub1(); case 2:return sub2(); ... } zeichne_pfeil(menu);
PS: Nimm lieber Unterfunktionen als dieses goto-gezerre
-
hm kannste ma anhand diesem beispiel erklären?
cout <<""<<endl; cout <<"Was m"<<z<<"chten Sie tun?"<<endl; cout <<"--------------------"<<endl; cout <<b<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<c<<endl; cout <<d<< "[K]undendaten erfassen " << d<<endl; cout <<d<< "[N]euen Kunden hinzuf\201gen "<< d<<endl; cout <<d<< "[S]uchen nach Kunden " << d<<endl; cout <<e<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<a<<f<<endl; cout <<"Ihre Eingabe : "; }
also das war ursprünglich mit cin gedacht ich möchte das nun aber mit nen pfeil und den pfeiltasten machen
-
Für die Bewegung kannst du schon den obigen Code entsprechend verwenden, mit maxmenu=3 und den Funktionen für einlesen, hinzufügen und suchen in der switch-Anweisung. Dazu benötigst du noch die Funktionen zum Löschen und setzen des Pfeils:
//löscht Pfeil vor Menüpunkt 'menu' void loesche_pfeil(int menu) { gotoxy(2,4+menu);//Spalte 2, Zeile 5... cout<<' '; } //setzt Pfeil vor Menüpunkt 'menu' void setze_pfeil(int menu) { gotoxy(2,4+menu); cout<<'>'; }
(Die Zeilenwerte mußt du eventuell noch anpassen, so daß der Pfeil in der richtigen Zeile auftaucht - ich bin jetzt davon ausgegangen, daß deine Ausgabe am oberen Bildschirmrand beginnt)
-
aber ich kann den pfeil nicht ohne gotoxy bewegen ? oder gibts noch ne andere funktion mit der ich des machen kann ?
-
Mir fällt auf Anhieb keine ein. Du könntest höchstens die ganze Bildschirmmaske in ein string-Array schreiben und nach jedem Tastendruck aktualisieren und neu ausgeben.
-
CStoll (off) schrieb:
Mir fällt auf Anhieb keine ein. Du könntest höchstens die ganze Bildschirmmaske in ein string-Array schreiben und nach jedem Tastendruck aktualisieren und neu ausgeben.
Nix gut. Erstens performancemäßig im Keller und zweitens kennst du die Größe des Bildschirmpuffers nicht, das heißt dein Array könnte zu klein sein und du hast ekelhafte Bildbrüche.
(Natürlich kann man die Größe des Bildschirmpuffers abfragen, aber natürlich kann man auch gotoxy() verwenden.)
MfG SideWinder
-
SideWinder schrieb:
CStoll (off) schrieb:
Mir fällt auf Anhieb keine ein. Du könntest höchstens die ganze Bildschirmmaske in ein string-Array schreiben und nach jedem Tastendruck aktualisieren und neu ausgeben.
Nix gut. Erstens performancemäßig im Keller und zweitens kennst du die Größe des Bildschirmpuffers nicht, das heißt dein Array könnte zu klein sein und du hast ekelhafte Bildbrüche.
Erstens ist mir klar, aber er hat ja nicht nach einer performanten Alternative gefragt
und zweitens könnte man notfalls umgehen, indem man dynamische Arrays (vector<string>) verwendet.
Aber soviel ist klar: Wenn man versucht, eine Bibliotheksfunktion "nachzubauen", hängt man beinahe immer hinter dem Original hinterher.
-
hmpf geht nit -.-
-
Zwischenfrage: was heißt "geht nit" genau?
-
hab das umgeschrieben aber geht nix 20 fehler -.- un auch linker fehler ^^
-
Wie sieht das Programm denn aus - und was für Fehler kommen dabei?
(meist sind die Meldungen des Compilers recht aufschlußreich, auch wenn die Ursache mitunter etwas oberhalb der Fehlerstelle liegt)
-
hab ne andere Idee
#include "iostream" #include "windows.h" #include "conio.h" using namespace std; int xpos(int p) {return 33;} int ypos(int p) {return 8+7*p;} void gotoxy(short x, short y) { HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); COORD position = { x , y }; SetConsoleCursorPosition(hStdout, position); } int main() { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO CCI; GetConsoleCursorInfo(hOut, &CCI); CCI.bVisible = false; SetConsoleCursorInfo(hOut, &CCI); 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; int befehlszahl=2; int p=0; 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') { ch=0; if (kbhit()) ch=getch (); { if (ch==72) { gotoxy(xpos(pos),ypos(pos));cout<<" "; pos=(pos-1)%befehlszahl; gotoxy(xpos(pos),ypos(pos));cout<<"==>"; } if (ch==80) { gotoxy(xpos(pos),ypos(pos));cout<<" "; pos=(pos+1)%befehlszahl; gotoxy(xpos(pos),ypos(pos));cout<<"==>"; } } gotoxy(1,1); switch(pos) { case 0:cout<<"oberster Befehl";break; case 1:cout<<"zweiter Befehl";break; } } }
kann ich nicht für das Switch(pos)
ne if machen mit ENTER Taste?
also if (pos=1) und dann mit kbhit halt für enter taste zum bestätigen?
-
wenn du aus der Schleife raus bist, war ENTER die letzte Taste, also brauchst du das nicht mehr zu kontrollieren. Und in pos steht die Nummer des zuletzt gewählten Menüpunktes - wie du die auswertest, ist deine Angelegenheit.
-
#include "iostream" #include "windows.h" #include "conio.h" using namespace std; int xpos(int p) {return 33;} int ypos(int p) {return 8+7*p;} void gotoxy(short x, short y) { HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); COORD position = { x , y }; SetConsoleCursorPosition(hStdout, position); } int main() { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO CCI; GetConsoleCursorInfo(hOut, &CCI); CCI.bVisible = false; SetConsoleCursorInfo(hOut, &CCI); 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; int befehlszahl=2; int p=0; 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') { ch=0; if (kbhit()) ch=getch (); { if (ch==72) { gotoxy(xpos(pos),ypos(pos));cout<<" "; pos=(pos-1)%befehlszahl; gotoxy(xpos(pos),ypos(pos));cout<<"==>"; } if (ch==80) { gotoxy(xpos(pos),ypos(pos));cout<<" "; pos=(pos+1)%befehlszahl; gotoxy(xpos(pos),ypos(pos));cout<<"==>"; } } gotoxy(1,1); switch(pos) { ch=0; case 0:cout<<"oberster Befehl";break; case 1:cout<<"zweiter Befehl";break; while (ch!='\n') { if (kbhit()) ch=getch (); { if (ch==13) { if (pos==0) { gotoxy(27,18); cout<<"muhkuh"<<endl; } } } } } } }
?!
-
Sieht dein Quellcode wirklich so aus? Akzeptiert das dein Compiler?
steve02 schrieb:
if (kbhit()) ch=getch (); {
mit dem ; ist der if() zu ende. D.h. der Block danach, der mit { beginnt wird immer ausgeführt. Das macht zwar nichts, sieht aber etwas seltsam aus.
switch(pos) { --> ch=0; <-- case 0:cout<<"oberster Befehl";break; case 1:cout<<"zweiter Befehl";break; --> while (ch!='\n') { if (kbhit()) ch=getch (); { if (ch==13) { if (pos==0) { gotoxy(27,18); cout<<"muhkuh"<<endl; } } } } <-- } } }
Die markierten Bereiche dürften zumindest eine Warnung erzeugen. Die Initialisierung von ch solltest du vor dem switch() machen. Der Block mit dem while() wird normalerweise nie ausgeführt, da du kurz davor schon ein break hast.
Hier mal ein Beispiel, wie ich das aufbauen würde (Pseudocode!):
... while(!ende) { if(anders_menu) //Wenn sich was am Menü geändert hat zeig_hauptmenu(sel_punkt); //Menü darstellen mach_was(); //hier kann man z.B. so Spielereien wie eine Uhr einbauen if(kbhit()) //nur Reagieren, wenn auch eine Taste gedrückt wurde; kann man weglassen, wenn man keine Spielereien hat ;) { switch(getch()) { case 0: //Sondertasten, wie Pfeiltasten switch(getch()) { case pfeil_hoch: //Pfeil-Hoch-Taste if(sel_punkt > min_punkt) --sel_punkt; break; case pfeil_runter: //Pfeil-Runter-Taste if(sel_punkt < max_punkt) ++sel_punkt; break; } break; case ESC: //Escape-Taste ende = 1; break; case ENTER: //Enter-Taste zeig_untermenu(sel_punkt); break; } } else { Sleep(1); //WinAPI-Funktion, die x Millisekunden wartet und dabei Systemressourcen wieder an das OS (Windows) abgibt. } } ...
Edit: Sleep() eingefügt
-
@AJ:
Wie schnell laeuft das Ding? Ich habe mal was aehnliches gemacht und das hat dann mit 100%CPU auf einen Tastendruck gewartet... da ich es ned besser wusste hab ich dann irgendwo etwas wie: if(!kbhit()) sleep(50); gemacht. Was die CPU auslastung auf 1% gesenkt hat.
Wie würdest Du das lösen und wo würdest Du sowas reinpacken zB. in deinem Vorschlag?
-
AJ schrieb:
steve02 schrieb:
if (kbhit()) ch=getch (); {
mit dem ; ist der if() zu ende. D.h. der Block danach, der mit { beginnt wird immer ausgeführt. Das macht zwar nichts, sieht aber etwas seltsam aus.
Wofür überhaupt kbhit()? Es wird noch eh nichts anderes gemacht?!
AJ schrieb:
switch(pos) { --> ch=0; <-- case 0:cout<<"oberster Befehl";break; case 1:cout<<"zweiter Befehl";break; --> while (ch!='\n') { if (kbhit()) ch=getch (); { if (ch==13) { if (pos==0) { gotoxy(27,18); cout<<"muhkuh"<<endl; } } } } <-- } } }
Die markierten Bereiche dürften zumindest eine Warnung erzeugen. Die Initialisierung von ch solltest du vor dem switch() machen. Der Block mit dem while() wird normalerweise nie ausgeführt, da du kurz davor schon ein break hast.
Doch, wenn pos weder 0 noch 1 ist.
-
Sgt. Nukem schrieb:
AJ schrieb:
Die markierten Bereiche dürften zumindest eine Warnung erzeugen. Die Initialisierung von ch solltest du vor dem switch() machen. Der Block mit dem while() wird normalerweise nie ausgeführt, da du kurz davor schon ein break hast.
Doch, wenn pos weder 0 noch 1 ist.
Falsch: Wenn keine der case-Bedingungen zutrifft, wird entweder der Block hinter "default:" ausgeführt oder der Inhalt des switch() komplett übersprungen - was vor dem ersten case bzw. zwischen einem break und dem nächsten case bzw. dem Blockende steht, ist unerreichbar.
@steve: Und selbst wenn, an dieser Stelle ist die Schleife unnötig, weil der switch() in dem Moment erreicht wird, wenn du auf die ENTER-Taste gedrückt hast:
//Kurzfassung: while(ch!='\n')//Abbruch der Schleife mit ENTER { if(kbhit()) { ch=getch(); if(ch==...)//Auswertung der Tasten ... } }; //Hier hat der User ENTER gedrückt und seinen Wunsch-Menüpunkt ausgewählt - welcher das ist, steht in pos //also mußt du an dieser Stelle den Inhalt von pos auswerten, um die richtige Fortsetzung zu finden