Menü[Gelöst]
-
da du dich mit GetAsyncKeyState so und so schon an Windows bindest, kannst du dich auch gleich noch an den MSVC binden...
außerdem geht deine Lösung wirklich nicht - und nur weil man fkt in anderen definieren kann, sollte man das nicht unbedingt tun, wenn es keinen Sinn hat ^^
#include <conio.h> int main() { int key; do { while (!_kbhit()); key = getch(); switch(key) { case VK_LEFT: //... break; case VK_RIGHT: //... break; }; } while(key != VK_RETURN); }sollte so in etwa funktionieren ^^
ist natürlich auch nur als skizze gedacht - wenn du nicht mehr weiterkommst, kannst du dich ja wieder melden ^^bb
-
Danke! Kannst du den Code noch bissle Kommentieren?

Und hab grad bisschen damit rumprobiert und hab festgestellt, dass das ja nur geht, wenn ich 2 Menüpunkte hab...ich brauch ja aber 4^^ Weil wenn man beim ersten punkt ist und drück nach rechts, dann gehts zum 2. ... soweit so gut, aber dann fängts ja von vorne an und dann ich jetzt wieder nach rechts drücke, dann gehts ja wieder auf den 2. punkt...den 3. und 4. punkt kann man mit der lösung nicht erreichen!
oder irre ich mich?
-
int main() { int key; int menuePunkt = 0; do { while (!_kbhit()); //Eigngabe Puffer leeren(?) key = getch(); //Zeichen auslesen switch(key) { case VK_LEFT: if(menuePunkt > 0) menuePunkt--; break; case VK_RIGHT: if(menuePunkt < 3) menuePunkt++; break; }; } while(key != VK_RETURN); //Solange nicht Enter gedrückt switch(menuePunkt) { case 0: //Menüpunkt 1 ausgewählt break; case 1: //Menüpunkt 2 ausgewählt break; //... }; }
-
Naja aber jetzt kann man ja weider nur zwischen 2en hin und her schalten...^^
Ich brauch aber 4
Deine Lösung ist ja ähnlich mit der vorigen und da gehts auch net
-
Du solltest schon Programmieren können...
... if(menuePunkt > 0) menuePunkt--; ... if(menuePunkt < 3) menuePunkt++; ...0 - 1 - 2 - 3 -> 4 Möglichkeiten
-
#include <conio.h> void draw_menue(int menue_id); int main() { int key; int menuepkt = 0; do { int tmp_menuepkt = menuepkt; while (!_kbhit()); //solange keine taste gedrückt wurde, nichts machen key = getch(); //welche taste wurde gedrückt switch(key) //... und was heißt das für uns? { case VK_LEFT: //nach links menuepkt = std::max(0, menuepkt-1); //alternativ auch die sache mit dem if ^^ break; case VK_RIGHT: menuepkt = std::min(4, menuepkt+1); break; }; if(tmp_meuepkt != menuepkt) { //draw_menue malt dann halt - da du ein cls hast, könnte es sonst passieren, dass es flackert, wenn du nach links drückst - also hab ich es mal so gemacht, dass es nur neu malt, wenn sich hier was verändert hat draw_menue(menuepkt); } } while(key != VK_RETURN); //solange die gedrückte taste nicht enter war } #include <iostream> void draw_menue(int menue_id) { system("cls"); switch(menue_id) { case 0: std::cout << "HALLO" << std::endl; break; case 1: std::cout << "SCHOENE" << std::endl; break; case 2: std::cout << "TOLLE" << std::endl; break; case 3: std::cout << "WELT!" << std::endl; break; } }das ganze dann noch ein wenig in klassen / fkt auslagern und es könnte so gar fast hübsch aussehen ^^
bb
-
Guten Morgen,
also laut den 2 Links hier sollte eure Loesung nicht funktioniern (nicht selbst getestet):
SideWinder
MSDNIch habs au so gemacht wie es da beschrieben wird:
while(bEnd == false) { iInput = getch(); switch(iInput) { case SPEZIAL_KEY: /* also 0 oder 0xE0 */ { iInput = getch(); switch(iInput) { case 80: /* arrow key down */ ...... } } default: /* normale einfabe behandeln oder ignorieren */ } }Und hier noch Tastaturcodes
Den rest sollteste selber schreiben koenne
Peace & Blessed Love C0de4Fun
PS:
unskilled schrieb:
/*...*/ system("cls"); /*...*/....es könnte so gar fast hübsch aussehen ^^
bb
Bin ich ned so ganz der Meinung, wegen dem system("cls"). Wie schon erwaehnt, wenn du dich schon an Windows bindes benutz au die Funktionen davon wie z.B. FillConsoleOutputCharacter
-
stimmt - hatte ich auch irgendwann schon mal gehört - nur wieder vergessen, weil nie gebraucht ^^
Bin ich ned so ganz der Meinung, wegen dem system("cls"). Wie schon erwaehnt, wenn du dich schon an Windows bindes benutz au die Funktionen davon wie z.B. FillConsoleOutputCharacter
Er hatte es nun mal zuvor selbst verwendet(das cls) und ich hab ja jedes ma dazu gesagt, dass das, was ich geschrieben habe, nicht die lösung sondern lediglich nen schritt in die richtung sein soll...
bb
-
Danke erstmal an alle die sich so viele Gedanken für mich gemacht haben!
Ich habe mich erstmal unskilled's Version angenommen.Weil das eins zu eins beim Compilieren haufenweise fehler gab und ich das ja auch nicht eins zu eins verwenden will(wollts nur mal kurz testn) hab ichs nochmal so ähnlich selbst versucht:int key; int menue_id_alt = 1; int menue_id = 1; void draw_menue(int menue_id); void HM() { do { int key; int menue_id_alt = 1; while(!_kbhit()); key = getch(); switch(key) { case VK_RIGHT: if(menue_id >= 4) { menue_id++; break; } case VK_LEFT: if(menue_id > 0) { menue_id--; } } if(menue_id != menue_id_alt) { menue_id_alt = menue_id; draw_menue(menue_id); } } while(key != VK_RETURN); } void draw_menue(int menue_id) { system("color f9"); switch(menue_id) { system("cls"); case 1: cout << "[New] Load Readme Exit"; HM(); break; case 2: cout << " New [Load] Readme Exit"; HM(); break; case 3: cout << " New Load [Readme] Exit"; HM(); break; case 4: cout << " New Load Readme [Exit]"; HM(); break; } }Aber wenn ich das ausführe(es lässt sich ohne probleme compilen) dann is nur schwarzer Bildschirm und das Eingabestrichle blinkt!
(Zur Info: void HM() deshalb, weil ich funktions.cpp in meiner main.cpp included hab für funktionsauslagerung und so^^)Danke schon an alle die geholfen haben!
-
1. Du solltest beim programmieren immer bei 0 anfangen zu zählen.(Ist hier jetzt nicht so wichtig)
case VK_RIGHT: if(menue_id >= 4) //sollte "< 4" heißen { menue_id++; break; } case VK_LEFT: if(menue_id > 0) //sollte "> 1" heißen, da du ja bei 1 anfängst zu zählen { menue_id--; }3. Wieso hast du zwei mal "menue_id_alt" & "key"?
4. Du musst "menue_id_alt" und "menue_id" am Anfang unterschiedlich setzen, damit er das Menü zeichnet.
5. Wieso rufst du in draw_menue() HM() auf?
Grüße SWW13
-
SWW13 schrieb:
3. Wieso hast du zwei mal "menue_id_alt" & "key"?
4. Du musst "menue_id_alt" und "menue_id" am Anfang unterschiedlich setzen, damit er das Menü zeichnet.
5. Wieso rufst du in draw_menue() HM() auf?
3. aus Versehen ^^
4.Jo stimmt...leichtsinnsfehler

5.Weil sonst wird doch das Programm nach einem Durchlauf beendet oder?
Achja und ">0" stimm glaub ich nicht, weil sonst würde es ja auch den menüpunkt um eins verringern, wenn der menüpunkt 1 angewählt ist und einen menüpunkt 0 gibt es ja nicht!
Danke

PS: Hab diese Änderungen vorgenommen, aber funktioniert immer noch nicht
weiß einer worans liegt?
-
Finn schrieb:
...
5.Weil sonst wird doch das Programm nach einem Durchlauf beendet oder?
...
PS: Hab diese Änderungen vorgenommen, aber funktioniert immer noch nicht
weiß einer worans liegt?Nein, du hast Ja in HM eine Schleife do{...}while(Bedingung).
Mir fällt jetzt spontan nichts mehr auf, geh doch mal mit dem Debugger drüber.Grüße SWW13
-
fehler waren drin, weil du was vergessen hast zu includen ^^
dann gabs ja noch das problem mit _getch - hab ich aber bei google direkt was von volkard gefunden : >
keine ahnung, ob man sich das enum irgendwie sparen kann und aus den bestehenden windows-makros(VK_LEFT/VK_RIGHT/...) die werte für die tasten bekommt#include <iostream> #include <algorithm> #include <conio.h> #define NOMINMAX #include <windows.h> #undef NOMINMAX void draw_menue(int menue_id); namespace keys { enum T { LEFT = 587, RIGHT = 589 }; int getPressedKey() //http://www.c-plusplus.net/forum/viewtopic-var-t-is-231918.html { int result=_getch(); if(result==0) result=256+_getch(); else if(result==224) result=512+_getch(); return result; } } int main() { int key; int menuepkt = 0; draw_menue(menuepkt); do { int tmp_menuepkt = menuepkt; while (!_kbhit()); //solange keine taste gedrückt wurde, nichts machen key = keys::getPressedKey(); //welche taste wurde gedrückt switch(key) //... und was heißt das für uns? { case keys::LEFT: //nach links menuepkt = std::max(0, menuepkt-1); //alternativ auch die sache mit dem if ^^ break; case keys::RIGHT: menuepkt = std::min(3, menuepkt+1); break; }; if(tmp_menuepkt != menuepkt) { //draw_menue malt dann halt - da du ein cls hast, könnte es sonst passieren, dass es flackert, wenn du nach links drückst - also hab ich es mal so gemacht, dass es nur neu malt, wenn sich hier was verändert hat draw_menue(menuepkt); } } while(key != VK_RETURN); //solange die gedrückte taste nicht enter war } void draw_menue(int menue_id) { system("cls"); switch(menue_id) { case 0: std::cout << "HALLO" << std::endl; break; case 1: std::cout << "SCHOENE" << std::endl; break; case 2: std::cout << "TOLLE" << std::endl; break; case 3: std::cout << "WELT!" << std::endl; break; } }bb
-
@ unskilled: Ich hab included... -.- Und einfach Code ausm Internet zu nehmen und zu posten hilft nicht wirklich weiter!
Code Update:
int key; int menue_id_alt; int menue_id; void draw_menue(int menue_id); void HM() { menue_id = 1; menue_id_alt = 0; do { while(!_kbhit()); key = getch(); switch(key) { case VK_RIGHT: if(menue_id < 4) { menue_id++; break; } case VK_LEFT: if(menue_id > 0) { menue_id--; } break; } if(menue_id != menue_id_alt) { menue_id_alt = menue_id; draw_menue(menue_id); } } while(key != VK_RETURN); } void draw_menue(int menue_id) { system("color f9"); switch(menue_id) { system("cls"); case 1: menue_id_alt = 1; cout << "[New] Load Readme Exit"; break; case 2: menue_id_alt = 2; cout << " New [Load] Readme Exit"; break; case 3: menue_id_alt = 3; cout << " New Load [Readme] Exit"; break; case 4: menue_id_alt = 4; cout << " New Load Readme [Exit]"; break; } }Erst is schwarzer bildschirm und wenn ich nach rechts drück, dann zeigts zumindest schonmal "[New] Load Readme Exit" an! Aber dann geht nix mehr...

-
Du sollst ihn ja auch nicht nehmen - aber gucken, wie es geht...
bb
PS: Der Fehler liegt daran, dass _getch() eben nicht das zurückgibt, was du erwartest...
Unabhängig davon sind aber deine beiden switchs komisch - ich würd so gar fast sagen, eins ist falsch und das andere ist nur buggy
-
@Finn liesst du dir die Beitraege ueberhaupt durch?
Wie schon in meinem vorherigen Post beschrieben liegt das daran das du z.B. _getch 2mal aufrufen musst wenn ein spezial key(wie z.B. arrow key) gedrueckt wurde.
Hab jetzt nochmal deine Loesung probiert und mit dem debugger verfolgt.1. aufruf von _getch() liefert 224 zurueck
2. aufruf von _getch() liefert 77 zurueckAlles genau so wie es in den Links von mir beschriebn ist.
IDE VC++2k8Da machst echt keine Spass anderen zu helfen, wenn die einfach die Posts von einem ueberlesen

Peace & Blessed Love C0de4Fun
-
Öhm die 2 Links hab ich erst jetzt gelesen...aber wie die müssen 2 mal aufgerufen werden? Kannstes erklären? Auf der msdn Seite raff ichs irgendwie net...bzw. kannste zeigen was ich jetzt noch einbauen muss in den Code?
@ unskilled: Wieso sind die switchs falsch und buggy?

-
Finn schrieb:
Öhm die 2 Links hab ich erst jetzt gelesen...aber wie die müssen 2 mal aufgerufen werden? Kannstes erklären? Auf der msdn Seite raff ichs irgendwie net...bzw. kannste zeigen was ich jetzt noch einbauen muss in den Code?
Haste dir des au mal durchgelesen oder wenigstes meinen ersten Post? Wennste das ned verstehtst dann kann ich dir leider au ned helfen.
Desweiteren hab ich dir ein Code Stueck gepostet wie ich es gemacht hab.
Tut mir ja leid aber ich glaub du sollst lieber was anderes machen und mit dem Programmieren fortfahren wenn du aelter bist.
Sorry my humble opinion
-
C0de4Fun schrieb:
...
Da machst echt keine Spass anderen zu helfen, wenn die einfach die Posts von einem ueberlesen
...Unskilled hat die Lösung doch schon gepostet ... mit Link
int getPressedKey() //http://www.c-plusplus.net/forum/viewtopic-var-t-is-231918.html { int result=_getch(); if(result==0) result=256+_getch(); else if(result==224) result=512+_getch(); return result; }Weil ich es jetzt eh schon zum testen eingebaut hab, hier der Code:
Aber les in Zukunft gefälligst die Antworten, sie dienen zur Lösung deiner Probleme.#include <iostream> #include <algorithm> #include <conio.h> #include <windows.h> using namespace std; namespace keys { enum T { LEFT = 587, RIGHT = 589 }; int getPressedKey() //http://www.c-plusplus.net/forum/viewtopic-var-t-is-231918.html { int result=_getch(); if(result==0) result=256+_getch(); else if(result==224) result=512+_getch(); return result; } } int key; int menue_id_alt; int menue_id; void draw_menue(int menue_id); void HM() { menue_id = 1; menue_id_alt = 0; //Menü am Anfang zeichnen draw_menue(menue_id); do { while(!_kbhit()); key = keys::getPressedKey(); switch(key) { case keys::RIGHT: if(menue_id < 4) { menue_id++; } break; case keys::LEFT: if(menue_id > 1) { menue_id--; } break; } if(menue_id != menue_id_alt) { menue_id_alt = menue_id; draw_menue(menue_id); } } while(key != VK_RETURN); } void draw_menue(int menue_id) { system("color f9"); switch(menue_id) { system("cls"); case 1: cout << "[New] Load Readme Exit" << endl; break; case 2: cout << " New [Load] Readme Exit" << endl; break; case 3: cout << " New Load [Readme] Exit" << endl; break; case 4: cout << " New Load Readme [Exit]" << endl; break; } }
-
Also jetzt mal nicht zum Thread:
WARUM werden eigentlich alle unter 20 des öfteren beschimpft, zu jung zu sein zum programmieren??? Ich meine, ich verstehs ja, wenn man zu nem 10 jährigen sagt, dass er lieber noch ein paar Jahre warten soll, aber was spricht denn bitte dagegen, dass einer mit 14 oder 15 programmieren lernt?! Vorallem da man in dem Alter ja noch ein viel höheres Lernpotenzial hat als einer der meinetwegen 35 ist!
Also wenn dann solche Kommentare kommen, da reg ich mich echt auf...
Weil ich deinen Thread da am Anfang net so ernst genommen hab, weil ich da noch nen anderen Lösungsversuch gemacht hab??

Naja trotzdem an alle..Danke für die Bemühungen! Danke...funktioniert
Und ja trotzdem: Sry, dass ich deinen Beitrag net gelesn hab