it-swarm.com.de

Festlegen der Cursorposition in einer Win32-Konsolenanwendung

Wie kann ich die Cursorposition in einer Win32-Konsolenanwendung festlegen? Vorzugsweise möchte ich vermeiden, ein Handle zu erstellen und die Windows-Konsolenfunktionen zu verwenden. (Ich verbrachte den ganzen Morgen damit, diese dunkle Gasse entlangzulaufen; dies verursacht mehr Probleme, als es löst.) Ich erinnere mich, dass ich dies relativ einfach gemacht habe, als ich mit stdio im College war, aber ich kann keine Beispiele finden, wie es jetzt zu tun ist . Alle Gedanken oder Vorschläge wären sehr dankbar. Vielen Dank.

Weitere Details

Folgendes versuche ich jetzt zu tun:

COORD pos = {x, y};
HANDLE hConsole_c = CreateConsoleScreenBuffer( GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL );
char * str = "Some Text\r\n";
DWDORD len = strlen(str);

SetConsoleCursorPosition(hConsole_c, pos);
WriteConsole(hConsole_c, str, len, &dwBytesWritten, NULL);
CloseHandle(hConsole_c)

Die Textzeichenfolge str wird niemals an den Bildschirm gesendet. Gibt es noch etwas, was ich tun sollte? Vielen Dank.

14
Jim Fell

Siehe SetConsoleCursorPosition API

Bearbeiten:

Verwenden Sie WriteConsoleOutputCharacter (), um den Handle zu Ihrem aktiven Puffer in der Konsole zu bringen und dessen Position festzulegen.

int x = 5; int y = 6;
COORD pos = {x, y};
HANDLE hConsole_c = CreateConsoleScreenBuffer( GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
SetConsoleActiveScreenBuffer(hConsole_c);
char *str = "Some Text\r\n";
DWORD len = strlen(str);
DWORD dwBytesWritten = 0;
WriteConsoleOutputCharacter(hConsole_c, str, len, pos, &dwBytesWritten);
CloseHandle(hConsole_c);
10
cpx

Mit den Konsolenfunktionen würden Sie SetConsoleCursorPosition verwenden. Ohne sie (oder zumindest nicht direkt verwenden) könnten Sie etwas wie gotoxy in der Bibliothek ncurses verwenden.

Edit: ein Wrapper dafür ist ziemlich trivial:

// Untested, but simple enough it should at least be close to reality...
void gotoxy(int x, int y) { 
    COORD pos = {x, y};
    HANDLE output = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(output, pos);
}
12
Jerry Coffin

Ja, Sie haben vergessen, SetConsoleActiveScreenBuffer anzurufen. Was genau war der Punkt, an dem Sie Ihre eigene kreierten? Verwenden Sie GetStdHandle(STD_OUTPUT_HANDLE), um einen Zugriff auf die vorhandene Konsole zu erhalten.

4
Hans Passant

Sie haben wahrscheinlich ANSI-Escape-Code-Sequenzen verwendet, die nicht mit Windows-32-Bit-Konsolenanwendungen funktionieren.

1
Mark Ransom
#include <windows.h>
#include <iostream.h>
using namespace std;
int main(int argc, char *argv[])
{
  int x,y;
  cin>>x>>y;
  SetCursorPos(x,y); //set your co-ordinate
  Sleep(500);
  mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0); // moving cursor leftdown
  mouse_event(MOUSEEVENTF_LEFTUP,x,y,0,0); // moving cursor leftup //for accessing your required co-ordinate
  system("pause");
  return EXIT_SUCCESS;
}
1
udit043