2010-04-28 17 views
11

Wie kann ich die Cursorposition in einer Win32-Konsolenanwendung festlegen? Vorzugsweise möchte ich vermeiden, ein Handle zu machen und die Windows-Konsolenfunktionen zu verwenden. (Ich verbrachte den ganzen Vormittag damit, durch die dunkle Gasse zu rennen; das schafft mehr Probleme, als es löst.) Ich erinnere mich, dass ich das relativ einfach gemacht habe, als ich mit stdio am College war, aber ich kann keine Beispiele dafür finden . Irgendwelche Gedanken oder Vorschläge würden sehr geschätzt werden. Vielen Dank.Festlegen der Cursorposition in einer Win32-Konsolenanwendung

Weitere Details

Hier ist, was ich versuche 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 nie auf den Bildschirm gesendet. Gibt es noch etwas, was ich tun sollte? Vielen Dank.

Antwort

9

Siehe SetConsoleCursorPosition API

Edit:

Verwenden WriteConsoleOutputCharacter(), die den Griff in Ihrer aktiven Puffer in der Konsole übernimmt und auch können Sie seine Position.

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); 
+0

'SetConsoleCursorPosition' ist eine Funktion von Windows-Konsole, die ich festgestellt, dass ich mit vermeiden möchte. –

+0

Also ging ich mit dem Hans-Vorschlag, 'GetStdHandle (STD_OUTPUT_HANDLE)' zu verwenden, um das Handle zu der vorhandenen Konsole zu bekommen, aber es stellte sich heraus, dass ich 'WriteConsoleOutputCharacter()' ebenfalls verwenden musste. Ich weiß nicht, warum dieser Anruf den Trick macht, aber es funktioniert jetzt. Vielen Dank! –

12

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

Edit: ein Wrapper für sie 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); 
} 
+0

Das 'gotoxy' ist, was ich im Sinn hatte, aber ich fand, dass, obwohl die' SetConsoleCursorPosition' API die Cursorposition korrekt festlegt, wenn ich versuche Text mit 'printf' an die Konsole zu senden Ort, an dem sich der Cursor befand, bevor die API aufgerufen wurde. –

+0

@Jim: Es wäre interessant zu wissen, welcher Compiler das macht. Ich habe seit Jahren Code wie diesen mit Microsofts Compiler verwendet und das Verhalten, das Sie beschreiben, nie gesehen. –

+0

Bitte beachten Sie die zusätzlichen Details, die ich der Frage hinzugefügt habe. Vielen Dank. –

1

Sie wahrscheinlich ANSI excape code sequences verwendet haben, die funktionieren nicht mit Windows 32-Bit-Konsole-Anwendungen.

+0

Hmmm, das ist eine Möglichkeit. Vielen Dank. –

4

Ja, Sie haben vergessen, SetConsoleActiveScreenBuffer zu rufen. Was genau war dein Ziel? Verwenden Sie GetStdHandle(STD_OUTPUT_HANDLE), um eine Kennung für die vorhandene Konsole zu erhalten.

1
#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; 
} 
Verwandte Themen