Установка позиции курсора в консольном приложении Win32
Как установить позицию курсора в приложении Win32 Console? Предпочтительно, я хотел бы избежать создания дескриптора и использования функций консоли Windows. (Я провел все утро, бегая по темному переулку, и это создает больше проблем, чем решает.) Кажется, я вспоминаю это относительно просто, когда я учился в колледже, используя 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
никогда не отправляется на экран. Есть ли что-то еще, что я должен делать? Спасибо.
Ответы
Ответ 1
См. API SetConsoleCursorPosition
Edit:
Используйте 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);
Ответ 2
Используя функции консоли, вы должны использовать 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);
}
Ответ 3
Да, вы забыли позвонить SetConsoleActiveScreenBuffer
. В чем именно заключалась твоя задача? Используйте GetStdHandle(STD_OUTPUT_HANDLE)
, чтобы получить дескриптор существующей консоли.
Ответ 4
Вероятно, вы использовали последовательности кода ANSI excape, которые не работают с 32-битными консольными приложениями Windows.
Ответ 5
#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;
}