Großbuchstaben
-
Morgen!
Will mir ne Klasse für OGL schreiben, die Eingabefelder ermöglicht. Natürlich sollen auch Großbuchstaben drin sein, aber wie krieg ich das hin?!
Momentan sieht das Ganze so aus:
Ich hol mir die WIndows- Message UINT uMsg und die Parameter dafür WPARAM wParam in meine Klasse, um sie da zu bearbeiten. Die kleinen Buchstaben gehen noch super, weil easy:
if(uMsg == WM_KEYDOWN) // Damit bei längerem Tastendruck nicht mehrere Buchstaben erscheinen { switch(wParam) { case 'A': {strcat(string , "a");break;} case 'B': {strcat(string , "b");break;} // ... } }Auch Space und das Abfragen der Backspace- Taste lassen sich wohl so realisieren ... . Da aber jedesmal, wenn ich eine neue Taste drücke, die Windows- Message, sowie der dazugehörige Parameter überschrieben werden (ist das so?), krieg ich ja nie raus, ob vor dem Drücken eines Buchstabens die Shift- Taste runtergedrückt wurde, oder nicht. Ich kann ja auch nicht abfragen "Wenn Shift- Tast und Buchstabe gedrückt", weil beim Drücken des Buchstabens ja die Shift- Nachricht sofort überschrieben wird .... (oder?)
Hat da Jemand Ideen?

-
WM_CHAR?!
-
Hat sich erledigt ^^
Hab einfach ne BOOL- Variable angelegt, die auf TRUE steht, wenn die Taste gedrückt wurde, und auf FALSE, wenn sie wieder losgelassen ist. ... Hmm ... ich poste einfach mal, wen`s interessiert *g*
switch (uMsg) // Check For Windows Messages { case WM_KEYDOWN: // Is A Key Being Held Down? { keys[wParam] = TRUE; // If So, Mark It As TRUE } case WM_KEYUP: // Has A Key Been Released? { keys[wParam] = FALSE; // If So, Mark It As FALSE } break; }; /* DIE KLEINEN BUCHSTABEN */ ///////////////////////////// if((uMsg == WM_KEYDOWN) && (shifttaste == FALSE)) // Damit bei längerem Tastendruck nicht mehrere Buchstaben erscheinen { switch(wParam) { case 'A': {strcat(string , "a");break;} case 'B': {strcat(string , "b");break;} case 'C': {strcat(string , "c");break;} case 'D': {strcat(string , "d");break;} case 'E': {strcat(string , "e");break;} case 'F': {strcat(string , "f");break;} case 'G': {strcat(string , "g");break;} case 'H': {strcat(string , "h");break;} case 'I': {strcat(string , "i");break;} case 'J': {strcat(string , "j");break;} case 'K': {strcat(string , "k");break;} case 'L': {strcat(string , "l");break;} case 'M': {strcat(string , "m");break;} case 'N': {strcat(string , "n");break;} case 'O': {strcat(string , "o");break;} case 'P': {strcat(string , "p");break;} case 'Q': {strcat(string , "q");break;} case 'R': {strcat(string , "r");break;} case 'S': {strcat(string , "s");break;} case 'T': {strcat(string , "t");break;} case 'U': {strcat(string , "u");break;} case 'V': {strcat(string , "v");break;} case 'W': {strcat(string , "w");break;} case 'X': {strcat(string , "x");break;} case 'Y': {strcat(string , "y");break;} case 'Z': {strcat(string , "z");break;} } } /* LÖSCHEN */ ////////////// if ((uMsg == WM_KEYDOWN) && (wParam == VK_BACK)) { string[strlen(string)-1]='\0'; } /* SPACE */ //////////// if ((uMsg == WM_KEYDOWN) && (wParam == VK_SPACE)) { strcat(string, " "); } /* DIE GROßEN BUCHSTABEN */ //////////////////////////// if ((uMsg == WM_KEYDOWN) && (wParam == VK_SHIFT)) shifttaste = TRUE; if ((uMsg == WM_KEYUP) && (wParam == VK_SHIFT)) shifttaste = FALSE; if ((uMsg == WM_KEYDOWN) && (shifttaste == TRUE)) // Damit bei längerem Tastendruck nicht mehrere Buchstaben erscheinen { switch(wParam) { case 'A': {strcat(string , "A");break;} case 'B': {strcat(string , "B");break;} case 'C': {strcat(string , "C");break;} case 'D': {strcat(string , "D");break;} case 'E': {strcat(string , "E");break;} case 'F': {strcat(string , "F");break;} case 'G': {strcat(string , "G");break;} case 'H': {strcat(string , "H");break;} case 'I': {strcat(string , "I");break;} case 'J': {strcat(string , "J");break;} case 'K': {strcat(string , "K");break;} case 'L': {strcat(string , "L");break;} case 'M': {strcat(string , "M");break;} case 'N': {strcat(string , "N");break;} case 'O': {strcat(string , "O");break;} case 'P': {strcat(string , "P");break;} case 'Q': {strcat(string , "Q");break;} case 'R': {strcat(string , "R");break;} case 'S': {strcat(string , "S");break;} case 'T': {strcat(string , "T");break;} case 'U': {strcat(string , "U");break;} case 'V': {strcat(string , "V");break;} case 'W': {strcat(string , "W");break;} case 'X': {strcat(string , "X");break;} case 'Y': {strcat(string , "Y");break;} case 'Z': {strcat(string , "Z");break;} } }
-
Mit std::string könntest du dir diese riesigen switch-Monster elegant sparen. Und da du eh einen C++-Compiler benutzt...

-
Hmm .... kann sein .... Da kommt jetzt aber wieder mein absolutes Defizit in Sachen C++ Grundlagen und Allgemeinwissen zum Vorschein ... Ich hätt jetzt gesagt das is die Funktion "string" in der Klasse "std" ... hmm .... kann das mal Jemand für nen Dummen kurz erläutern / Hilfe zum weiteren Lernen geben?
-
nichts ganz

string ist ein typedef auf ne c++ templateklasse im namesbereich std.http://tutorial.schornboeck.net/inhalt.htm
http://www.cpp-tutor.de/cpp/toc.htm
http://cplus.kompf.de/artikel.htmlfalls du noch andere tutorials suchst oben rechts ist ein link.
-
Also ich hab mir jetzt mal n paar Tutorials angesehen, Danke für die links. Aber irgenwie seh ich noch nicht, wie mir das bei meinem code helfen soll.
Ich hab jetzt malchar buchstabe; buchstabe = wParam.substr(1,1);ausprobiert, aber da wParam ja kein String ist, funktioniert das auch nicht ... könntest du mir mal nen Verbesserungs- Code oder nen neuen Anstoß geben, was genau du meintest?
-
Z.B. so:
std::string s; if(wParam >= 'A' && wParam <= 'Z') { if(shifttaste) s += static_cast<char>(wParam); else s += tolower(static_cast<char>(wParam)); } else if(wParam == VK_SPACE) s += ' '; else if(wParam == VK_BACK && s.length() > 0) s = s.substr(0, s.length() - 1);btw, bei deinem Code ist die Behandlung von VK_BACK nicht korrekt, wenn der String kein Zeichen mehr enthält.