Wie kriege ich die aktuelle Cursorposition heraus?



  • Gibt es einen befehl oder Funktion mit der man die aktuelle Position des Textcursors herausfindet. hab mal was mit GetConsoleCursorInfo ausprobiert, klappt nicht, ist zu hoch für mich. Wenn es dies nicht als schon im MVC enthaltenden befehl gibt, kann mir einer die Funktion schreiben, brache die eigentlich noch heute oder morgen früh.

    THX im Voraus.
    Morpheus2k

    [ Dieser Beitrag wurde am 17.06.2002 um 22:15 Uhr von Morpheus2k editiert. ]



  • vielleicht hilft das .. geklaut aus marcus improved konsole...

    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    HANDLE m_Hnd = GetStdHandle(STD_OUTPUT_HANDLE);
    //gibt spalte des cursor
    int wherex(void)
    {
       CONSOLE_SCREEN_BUFFER_INFO screen_info;
       GetConsoleScreenBufferInfo(m_Hnd, &screen_info);
       return screen_info.dwCursorPosition.X + 1;
    }
    
    //gibt zeile
    int wherey(void)
    {
       CONSOLE_SCREEN_BUFFER_INFO screen_info;
       GetConsoleScreenBufferInfo(m_Hnd, &screen_info);
       return screen_info.dwCursorPosition.Y + 1;
    }
    
    int main(void)
    {
        cout<<endl;
        cout<<endl;
        cout<<endl;
        cout<<wherey()<<endl<<endl;
        cout<<wherex();
        return 0;
    }
    


  • Oder du versuchst es mal hiermit das habe ich geschrieben man kann die Cursor position bestimmen und Farben wählen

    #include <windows.h>
    #include <iostream.h>
    #include <conio.h>

    //****************Funktion für die Fenstergröße*********************************************************************
    void Resize ( DWORD SizeX , DWORD SizeY , HANDLE StdOutput )
    {
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    COORD c = GetLargestConsoleWindowSize ( StdOutput );
    SMALL_RECT sr;

    GetConsoleScreenBufferInfo ( StdOutput , &csbi );

    sr.Bottom = min ( SizeX , c.X ) - 1;
    sr.Right = min ( SizeY , c.Y ) - 1;
    sr.Top = sr.Left = 0;

    c.X = SizeX;
    c.Y = SizeY;

    if ( csbi.dwSize.X > SizeX || csbi.dwSize.Y > SizeY )
    {
    SetConsoleWindowInfo ( StdOutput , TRUE , &sr );
    SetConsoleScreenBufferSize ( StdOutput , c );
    }
    else
    {
    SetConsoleScreenBufferSize ( StdOutput , c);
    SetConsoleWindowInfo ( StdOutput , TRUE , &sr );
    }
    }
    //*****************************************************************************************************

    void main (void)
    {
    HANDLE StdOutput = GetStdHandle ( STD_OUTPUT_HANDLE );
    Resize(1,1,StdOutput);

    // typedef struct _CONSOLE_SCREEN_BUFFER_INFO { // csbi
    // COORD dwSize;
    // COORD dwCursorPosition;
    // WORD wAttributes;
    // SMALL_RECT srWindow;
    // COORD dwMaximumWindowSize;
    // } CONSOLE_SCREEN_BUFFER_INFO ;

    // typedef struct _COORD { // coord.
    // SHORT X; // horizontal coordinate
    // SHORT Y; // vertical coordinate
    // } COORD;

    // typedef struct _SMALL_RECT { // srct
    // SHORT Left;
    // SHORT Top;
    // SHORT Right;
    // SHORT Bottom;
    // } SMALL_RECT;

    // typedef struct _CHAR_INFO { // chi
    // union { /* Unicode or ANSI character */
    // WCHAR UnicodeChar;
    // CHAR AsciiChar;
    // } Char;
    // WORD Attributes; // text and background colors
    // } CHAR_INFO, *PCHAR_INFO;

    // typedef struct _CONSOLE_CURSOR_INFO { // cci
    // DWORD dwSize;
    // BOOL bVisible;
    // } CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;

    int ch,ind1;

    HANDLE hConsoleOutput; // handle to console screen buffer

    CONSOLE_SCREEN_BUFFER_INFO screen_info;
    SMALL_RECT screensize;
    const COORD upperleftcorner={0,0};
    COORD buffsize;
    _CHAR_INFO * buffer;
    _CHAR_INFO charinfo;

    SMALL_RECT QuellBereich;
    SMALL_RECT BetroffenerBereich;
    COORD ZielKoord;
    _CHAR_INFO Fueller;

    CONSOLE_CURSOR_INFO CursorInfo;
    COORD CursorPos;

    // ================================================================================

    hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hConsoleOutput == INVALID_HANDLE_VALUE)
    {
    return;
    }

    GetConsoleScreenBufferInfo(hConsoleOutput,&screen_info);

    screensize.Left = 0;
    screensize.Top = 0;
    screensize.Right = screen_info.dwSize.X - 1; // 80 - 1 = 79
    screensize.Bottom = screen_info.dwSize.Y - 1; // 25 - 1 = 24

    buffsize.X = screen_info.dwSize.X;
    buffsize.Y = screen_info.dwSize.Y;

    buffer = new _CHAR_INFO[screen_info.dwSize.X * screen_info.dwSize.Y];

    for(int i=0; i < screen_info.dwSize.X * screen_info.dwSize.Y; i++)
    {
    if (i<880)
    {
    charinfo.Char.AsciiChar = ' ';
    charinfo.Attributes =
    BACKGROUND_BLUE |
    FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY;
    }
    else
    {
    charinfo.Char.AsciiChar = ' ';
    charinfo.Attributes =
    BACKGROUND_GREEN | BACKGROUND_INTENSITY |
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY;
    }

    buffer[i] = charinfo;
    }

    SetConsoleTitle("Booooahhhhhh eyhh, voll iin Faaabe");
    WriteConsoleOutput(hConsoleOutput,buffer,buffsize,upperleftcorner,&screensize);

    delete[] buffer;

    cout << "\n\n" << "hConsoleOutput ............ " << hConsoleOutput;
    cout << "\n\n" << "Size(Cols/Rows) ............ " << screen_info.dwSize.X
    << " " << screen_info.dwSize.Y;
    cout << "\n" << "CursorPos(Col/Row) .......... " << screen_info.dwCursorPosition.X
    << " " << screen_info.dwCursorPosition.Y;
    cout << "\n" << "Attribute ................. " << screen_info.wAttributes;
    cout << "\n" << "ScreenSize(LeftTopRightBot).. " << screen_info.srWindow.Left
    << " " << screen_info.srWindow.Top
    << " " << screen_info.srWindow.Right
    << " " << screen_info.srWindow.Bottom;
    cout << "\n" << "WindowSize(Cols/Rows) ..... " << screen_info.dwMaximumWindowSize.X
    << " " << screen_info.dwMaximumWindowSize.Y;
    cout << "\n" << endl;

    // BOOL WriteConsoleOutputAttribute(
    // HANDLE hConsoleOutput, // handle to a console screen buffer
    // CONST WORD *lpAttribute, // pointer to buffer to write attributes
    // // from
    // DWORD nLength, // number of character cells to write to
    // COORD wWriteCoord, // coordinates of first cell to write to
    // LPDWORD lpNumberOfAttrsWritten
    // // pointer to number of cells written to
    // );

    CursorInfo.dwSize = 39;
    CursorInfo.bVisible = FALSE;
    SetConsoleCursorInfo(hConsoleOutput,&CursorInfo);

    CursorPos.X = 25;
    CursorPos.Y = 12;
    SetConsoleCursorPosition(hConsoleOutput,CursorPos);

    ind1 = 0;
    do
    {
    ch = _getch();
    ch = toupper(ch);
    if (ch == 'E')
    continue;

    ind1++;

    switch (ind1)
    {
    case 1 :
    QuellBereich.Left = 0;
    QuellBereich.Top = 0;
    QuellBereich.Right = 39;
    QuellBereich.Bottom = 10;

    BetroffenerBereich.Left = 0;
    BetroffenerBereich.Top = 0;
    BetroffenerBereich.Right = 79;
    BetroffenerBereich.Bottom = 10;

    ZielKoord.X = 40;
    ZielKoord.Y = 0;

    Fueller.Char.AsciiChar = ' ';
    Fueller.Attributes =
    BACKGROUND_GREEN | BACKGROUND_INTENSITY |
    FOREGROUND_GREEN | FOREGROUND_INTENSITY;

    ScrollConsoleScreenBuffer(hConsoleOutput,
    &QuellBereich,&BetroffenerBereich,
    ZielKoord,
    &Fueller);
    break;

    case 2 :
    QuellBereich.Left = 40;
    QuellBereich.Top = 0;
    QuellBereich.Right = 79;
    QuellBereich.Bottom = 10;

    BetroffenerBereich.Left = 40;
    BetroffenerBereich.Top = 0;
    BetroffenerBereich.Right = 79;
    BetroffenerBereich.Bottom = 24;

    ZielKoord.X = 40;
    ZielKoord.Y = 14;

    Fueller.Char.AsciiChar = ' ';
    Fueller.Attributes =
    BACKGROUND_GREEN | BACKGROUND_INTENSITY |
    FOREGROUND_GREEN | FOREGROUND_INTENSITY;

    ScrollConsoleScreenBuffer(hConsoleOutput,
    &QuellBereich,&BetroffenerBereich,
    ZielKoord,
    &Fueller);
    break;

    case 3 :
    QuellBereich.Left = 40;
    QuellBereich.Top = 14;
    QuellBereich.Right = 79;
    QuellBereich.Bottom = 24;

    BetroffenerBereich.Left = 0;
    BetroffenerBereich.Top = 14;
    BetroffenerBereich.Right = 79;
    BetroffenerBereich.Bottom = 24;

    ZielKoord.X = 0;
    ZielKoord.Y = 14;

    Fueller.Char.AsciiChar = ' ';
    Fueller.Attributes =
    BACKGROUND_GREEN | BACKGROUND_INTENSITY |
    FOREGROUND_GREEN | FOREGROUND_INTENSITY;

    ScrollConsoleScreenBuffer(hConsoleOutput,
    &QuellBereich,&BetroffenerBereich,
    ZielKoord,
    &Fueller);
    break;

    case 4 :
    QuellBereich.Left = 0;
    QuellBereich.Top = 14;
    QuellBereich.Right = 39;
    QuellBereich.Bottom = 24;

    BetroffenerBereich.Left = 0;
    BetroffenerBereich.Top = 0;
    BetroffenerBereich.Right = 39;
    BetroffenerBereich.Bottom = 24;

    ZielKoord.X = 0;
    ZielKoord.Y = 0;

    Fueller.Char.AsciiChar = ' ';
    Fueller.Attributes =
    BACKGROUND_GREEN | BACKGROUND_INTENSITY |
    FOREGROUND_GREEN | FOREGROUND_INTENSITY;

    ScrollConsoleScreenBuffer(hConsoleOutput,
    &QuellBereich,&BetroffenerBereich,
    ZielKoord,
    &Fueller);
    ind1 = 0;
    break;
    }

    } while( ch != 'E' );

    }



  • sorry das mit der Fenstergröße musst du rausnehmen



  • Ich muss ma meinen Senf dazugeben. 😃
    Also:
    @Florian

    1. Wieso benutzt du keine CodeTags?!?
    2. Wieso schreibst du eine Funktion auf, nach dernet gefragt wurde?
      -> Ist zwar nett, aber man muss ja nix machen, was man nicht brauch. 😉

    @Elise
    Hast du den Code aus der Improved Console?

    @Florian && Morpheus2k
    Wieso habt Ihr net in die FAQ zur Improved Console geschaut, da gibbet beide Funktionen, und die Funk vonm Florian noch viel kürzer. 😉
    (Sorry kann sein, dass ich net ganz so nett war, aber man kann doch lesen, und oben über der Threadaufzählung steht, "Bitte immer erst ma in die FAQ schauen", also sollte man es auch machen. 😉 )

    🙄

    @Side
    😉 😃 😉



  • @HolyMetaler

    [senf] schon mal mein posting richtig gelesen? da steht daß ich es aus der improved konsole habe... erste zeile *grins*[/senf]

    ps: SideWinder nummer 2??

    [ Dieser Beitrag wurde am 18.06.2002 um 10:15 Uhr von elise editiert. ]



  • Oooops, war noch net wach, und hab es überlesen 🙄, sollte mir morgens ma nen Kaffe, oder wat mehr Cola gönnen. 😉

    *schiefsing* OOps, I did it again... *schiefsing*



  • Wieso danach wurde doch gefragt und man kann damit die Cursor position bestimmen.Und ausserdem hab ich es nicht aus der improved console also schieb nicht gleich so ein heißen.

    PS: ich weiß gar nicht wie man das mit dem Code macht und was du meinst



  • Ok ok, ich war noch müde, ..., aber der Code ist viel zu lang!, da man es auch kürzer machen kann. Nochmals sorry, aber das mit den Codetags ist net schwer, unter dem Editfeld, sind so schöne Buttons, auf einem steht c++ Code drauf, da klickst du druff, und dann zwischen die [...] und [...] schreibst du dann den Code. 😉
    p.s. Ich hatte es schon gelesen gehabt, nur hatte ich es als setzen interprtiert. Sorry.

    [ Dieser Beitrag wurde am 18.06.2002 um 11:06 Uhr von HolyMetaler editiert. ]



  • Es gibt da schon ein Allheilmittel. Will jetzt nicht näher darauf eingehen - Tip: Konsolen-FAQ.

    Thread closed.

    MfG SideWinder


Anmelden zum Antworten