Konsolen Manipulation



  • Hi Leute!

    Ich spiele im Moment ein wenig mit der Konsole rum und will einen kleinen Text-editor programmieren. Aufjedenfall kann ich meinen cursor aktuell nur mit den tasten w,a,s und d bewegen. ich würde aber gerne die pfeiltasten nutzen. weiß jemand den char-wert den ich hierfür abfangen muss? oder geht das ganz anders?

    dann noch eine frage, und zwar suche ich schon seit einer weile eine übersicht der befehle die man so benutzen kann um etwas mit der konsole anzustellen. zum beispiel um an eine bestimmte stelle der konsole was zu zu platzieren. gibts da ne referenz zu?

    danke schonmal!

    liebe grüße



    1. FAQ!: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39324.html

    2. conio.h (Borland) und gotoxy benutzen oder windows.h einbinden (wenn du nen MS-Compiler benutzt) und dann gotoxy selbst schreiben:

    void gotoxy(int x, int y) {
    
        COORD Position = {x,y};
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Position);
    }
    


  • hm... danke, aber irgendwie hilft mir das grad nix.... mein aktueller code:

    #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()
    {
    	int x=1,y=1;
    	char taste;
    
    	gotoxy(x,y);
    
    	do
    	{
    		taste = getch();
    
    		if (!kbhit())
    		{
    			switch (taste)
    			{
    				default:	cout << taste;
    							x++;
    							break;
    
    				case 'e':	break;
    
    				case 'w':	y--;
    							gotoxy(x,y);
    							break;
    
    				case 'd':	x++;
    							gotoxy(x,y);
    							break;
    
    				case 's':	y++;
    							gotoxy(x,y);
    							break;
    
    				case 'a':	x--;
    							gotoxy(x,y);
    							break;
    			}
    		}
    	} while (taste!='e');
    }
    


  • #include <conio.h>
    #include <iostream>
    
    int main()
    {
        int c;
        do
        {
            c = getch();
            std::cout << c << std::endl;
        }
        while (c != 32); // leertaste zum abbrechen
        return 0;
    }
    

    guck dir mal an, was passiert, wenn du pfeiltasten benutzt.



  • Lies dir doch mal den verlinkten FAQ-Artikel durch - Sondertasten werden durch Zwei-Zeichen-Kombinationen dargestellt, z.B. Links = 0,75.

    btw sieht die Reihenfolge der Eingabfunktionen etwas merkwürdig aus. Besser wäre es so rum:

    do
    {
      if(kbhit())
      {
        taste=getch();
        switch(taste)
        {...}
      }
    }
    while(...)
    


  • cool danke! mit den pfeiltasten funzt jetzt alles wunderbar...

    aber wie kann ich denn jetzt noch weitere dinge manipulieren... beispielsweise ohne eingabe irgendwas auf die konsole bringen. an stelle x=15 und y=20 soll zum beispiel ein + erscheinen. da gibts doch auch irgendnen befehl StdConsoleOutputChr oder irgendson käse

    dann fällt mir noch was ein grad... die werte der tastatur überschneiden sich... dadurch das ich die 75 zum beispiel abfange als pfeiltaste kann ich einen gro´buchstaben nicht mehr machen, weil der die selbe zahl besitzt.... gibts da ne lösung zu?



  • @Position: in irgendeiner Bibliothek gibt es gotoxy() dafür.

    @Unterscheidung: Da mußt du auch das '\0' abfangen:

    ch=getch()
    if(ch=='\0')
    {
      ch=getch();
      //Steuerzeichen 0,ch verarbeiten
    }
    else
    {
      //ASCII-Zeichen ch verarbeiten
    }
    

    (im if-Teil kannst du die 75 als Links deuten, im else-Teil wäre es ein 'B')



  • danke schonmal... leider bekomm ichs nicht hin...

    was für ein typ ist die variable ch? und ich suche keine funktion mit der ich den cursor platzieren kann sondern wo ich irgendwo auf der console etwas ausgeben kann.



  • CStoll schrieb:

    @Position: in irgendeiner Bibliothek gibt es gotoxy() dafür.

    Auf Windows wie bereits geschrieben durch Borland in conio.h implementiert, bei Microsoft-Compilern ist diese nicht in der conio.h implementiert, dazu muss eine eigene Implementierung geschrieben werde (s. oben) und windows.h eingebunden werden.

    @ViperNeo:

    #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()
    {
        int x=1,y=1;
        char taste;
    
        gotoxy(x,y);
    /* ... */
    

    Das ist falsch.
    Entweder (Borland):

    #include <conio.h>
    
    int main() {
      gotoxy(15,20);
      cout << '+';
    }
    

    oder (Microsoft):

    #include <windows.h>
    
    void gotoxy(int x, int y) {
    
        COORD Position = {x,y};
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Position);
    }
    
    int main() {
      gotoxy(15,20);
      cout << '+';
    }
    

    Also ich habe bei VS2003 die letztere Methode bereits einmal verwendet und das funktionierte wunderbar.

    getch() liefert einen int zurück.



  • ja aber ich will nicht mit dem cursor dahinspringen!! ich will mit dem cursor auf x=1 und y=1 bleiben aber bei x=15 und y=20 was einfügen. das geht mit irgendner output funktion die mir grad entfallen ist... ich werde morgen mal meinen lehrer befragen und es hier posten.

    aufjedenfall ist meine gotoxy funktion korrekt. die ist genau dasselbe wie deine letztere version!!

    conio.h brauch ich für getch()



  • Ja, kann auch sein das ich ne andere Funktion übersehen habe, tut mir leid. Habe mich nur gewundert das du trotzdem conio.h benutzt. 😉



  • Ausgaben erfolgen immer an der aktuellen Cursor-Position, wenn du also woanders schreiben willst, hilft nur eins:

    template<typename T>
    void writexy(int xneu,int yneu,const T& val)
    {
      int xalt=getxpos(),yalt=getypos();
      gotoxy(xneu,yneu);
      cout<<val;
      gotoxy(xalt,yalt);
    }
    //wobei du getxpos() und getypos() notfalls selber schreiben mußt
    


  • template<typename T>

    was ist denn das? bin noch bissl ein kleiner newb 🙂
    ja, hab gemerkt das es nur an der aktuellen cursor position geht. danke euch trotzallem für die antworten.

    ich will ja ein kleines text-editier programm machen. wie würdet ihr da vorgehen? ich wollte das ganze jetzt mit nem großen array arrangieren. aber weiß nicht ob das so sinnvoll ist. hat jemand ein beispielprog das ich mir anschauen könnte? wäre cool



  • Das ist ein Template. An dieser Stelle ein Funktionstemplate. Für den Parameter in den spitzen Klammern musst du einen Typ angeben. Bei der Funktion von CStoll wird dann beim dritten Parameter der Funktion ein Wert von dem eingesetzten Typ erwartet.

    Der Funktionsaufruf funktioniert ganz normal, wie du ihn kennst oder so:
    writexy<int>(x,y,3);



  • Du kannst bei der Angabe sogar das <int> weglassen - ein vernünftiger Compiler ist intelligent genug, aus dem Typ des Parameters das richtige T abzuleiten.

    @Neo: Ein Template ist sozusagen eine Funktionsschablone, aus der bei Bedarf "richtige" Funktionen erstellt werden können - auf die Weise kannst du theoretisch beliebige Datentypen ausgeben (solange es einen operator<<(ostream&,T) für deinen Typ T gibt).



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum DOS und Win32-Konsole verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten