Как я могу установить позицию курсора в Консольном приложении Win32? Предпочтительно, я хотел бы постараться не делать дескриптор и использовать Windows Console Functions. (Я потратил все утро бег что темная область; это создает больше проблем, чем это решает.) Я, кажется, вспоминаю выполнение этого относительно просто, когда я был в колледже с помощью stdio, но я не могу найти примеры того, как сделать это теперь. Любые мысли или предложения значительно ценились бы.Спасибо.
Дополнительные детали
Вот то, что я теперь пытаюсь сделать:
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)
Текстовая строка str
никогда не отправляется в экран. Есть ли что-то еще, что я должен делать?Спасибо.
См. SetConsoleCursorPosition API
Изменить:
Используйте WriteConsoleOutputCharacter (), который принимает дескриптор вашего активного буфера в консоли и также позволяет вам установить его положение.
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);
Используя функции консоли, вы должны использовать SetConsoleCursorPosition
. Без них (или, по крайней мере, не используя их напрямую) вы можете использовать что-то вроде gotoxy
в библиотеке ncurses .
Правка: оболочка для него довольно тривиальна:
// 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);
}
Да, вы забыли позвонить SetConsoleActiveScreenBuffer
. В чем именно заключалась цель создания собственного? Используйте GetStdHandle (STD_OUTPUT_HANDLE)
, чтобы получить дескриптор существующей консоли.
Вы, вероятно, использовали кодовые последовательности исключений ANSI , которые не работают с 32-разрядными консольными приложениями Windows.