Menü[Gelöst]
-
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
-
SWW13 schrieb:
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
Dir is aber schon bewusst das ich genau den gleichen Ansatz 5 6 Posts fruehr beschrieben hab ( auch mit Links )!?
Finn schrieb:
Naja trotzdem an alle..Danke für die Bemühungen! Danke...funktioniert
Und ja trotzdem: Sry, dass ich deinen Beitrag net gelesn hab
Joa klaro kein Problem dafuer gibts ja das hier. Aber wie gesagt wenn einfach Post ueberlesen werden find ichs einfach schade ;).
Und jetzt haet ich noch 2 Fragen zu Unskilled bzw Volkard Loesung:
1. Was bringt das _kbhit() in ner while Schleife ohne Rumpf? Is des nur verschwendet Prozessor Leistung? Klaro wennste zwischen drin was zeichnen willst brauchste die abfrage,
2. Was soll das +256 bei erster _getch call == 0 oder +512 bei erster _getch call == 0xe0.Peace & Blessed Love C0de4Fun
€ noch schnell ein Nachtrag zu Frage 1: bei mir sind zwischen 10% und 17% des Prozessors

-
@C0de4Fun: Sorry, ich dachte der erste Beitrag dazu war auch schon von unskilled.
Und zu 1.:
Wie unskilled schon kommentiert hat:while (!_kbhit()); //solange keine taste gedrückt wurde, nichts machenDamit mit nicht jedes mal die ganze Schleife durchlaufen wird, wenn eh nichts gedrückt wurde.
Der 2. Frage schließ ich mich mal an, ich versteh den Sinn auch nicht ganz.
-
SWW13 schrieb:
Und zu 1.:
Wie unskilled schon kommentiert hat:while (!_kbhit()); //solange keine taste gedrückt wurde, nichts machenDamit mit nicht jedes mal die ganze Schleife durchlaufen wird, wenn eh nichts gedrückt wurde.
Schon ja aber da ja _kbhit() ne funktion ist die prueft ob eine Taste gedrueckt wurde und dann gleich wieder zurueck kehrt, in der Schleife geschaut wird ob eine gedrueckt wurde und wenn nicht dann mach das gleich wieder. Is doch nur Resourcen verschwendung (imho). Und _getch() is halt ein blocking call der solang nichts macht bis ne Taste gedrueckt wird.
Was ich au noch grad gesehen hab:
MSDN schrieb:
Routine Required header Compatibility
_getch <conio.h> Win 98, Win Me, Win NT, Win 2000, Win XPnur so nebenbei
-
jopp, war dein ansatz ^^ ich hatte es ja zuvor auch falsch *g*
allerdings ist die MSDN-dokumentation da auch nich so der brüller -.-
und allgemein weiß ich nicht, wieso es dann überhaupt VK_LEFT gibt - das war das, was mich am längsten beschäftigt hat - wieso zum teufel gibt es das makro(die konstante), wenn ich sie nicht nutzen kann, weils nen ganz anderer wert ist?!zur while-schleife: unwissenheit - hab gerad erst noch ma nachgeguckt und gesehen, dass die fkt wirklich blockiert... dann ists natürlich überflüssig - übrigens wird das deine cpu zu ca. 100% auslasten - dein programm direkt vll nur 20% aber die restlichen % gehen an Windows-Prozesse...
zu volkards lösung:
ich hab den link extra dazugepostet, weil es für mich auch nicht offensichtlich war... allerdings erläutert er dort eben auch nicht, wieso - vll liest er ja das und sagt was dazu ^^
aber ich vermute mal, dass man eben einfach prüfen kann, welche kategorie es ist und um sicherzugehen, dass aus nem nach-rechts drücken nicht was anderes wird...
und es ohne die 256 und 512 zu machen, hätte ja auch keinerlei vorteile gebracht...
kenn mich mit winapi nicht gut genug aus, um zu wissen, ob es dort klug wäre, es wegzumachen.bb
PS:
Routine Required header Compatibility
_getch <conio.h> Win 98, Win Me, Win NT, Win 2000, Win XPich hab vista und hatte es getestet - also geht wahrscheinlich alles, was auf NT Basis ist!?
-
unskilled schrieb:
allerdings erläutert er dort eben auch nicht, wieso - vll liest er ja das und sagt was dazu ^^
-
volkard schrieb:
unskilled schrieb:
allerdings erläutert er dort eben auch nicht, wieso - vll liest er ja das und sagt was dazu ^^
gut hab ich gelesen. Aber iwie kann ich daraus nur schliess das dein Ansatz komisch bzw. falsch is.
Denn:For special keys, the getch function first returns ASCII 0. The next call will then return one of these special keys:
....
#define KEY_RIGHT 77
....Wenn ich jetzt die rechte Pfeiltaste drueck kommt doch bei diesem Quelltext:
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; }333 und nicht 589 raus und somit nicht die rechte Pfeiltaste!? Oder seh ich da was falsch?
Peace & Blessed Love C0de4Fun