在Win32控制台应用程序中设置光标位置

时间:2010-04-28 18:52:47

标签: c++ console-application cursor-position

如何在Win32控制台应用程序中设置光标位置?最好,我想避免使用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永远不会发送到屏幕。我还应该做些什么吗?感谢。

5 个答案:

答案 0 :(得分:12)

使用控制台功能,您可以使用SetConsoleCursorPosition。没有它们(或者至少不直接使用它们),您可以在ncurses库中使用gotoxy之类的内容。

编辑:它的包装非常简单:

// 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);
}

答案 1 :(得分:10)

请参阅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);

答案 2 :(得分:4)

是的,你忘了打电话给SetConsoleActiveScreenBuffer。创建自己的究竟是什么意思?使用GetStdHandle(STD_OUTPUT_HANDLE)获取现有控制台的句柄。

答案 3 :(得分:1)

您可能正在使用ANSI excape code sequences,它不适用于Windows 32位控制台应用程序。

答案 4 :(得分: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;
}