C++ 在Win32控制台应用程序中设置光标位置
如何在Win32控制台应用程序中设置光标位置?最好,我希望避免使用句柄和Windows控制台功能。(我花了一上午的时间在那条黑暗的小巷里跑来跑去;它带来的问题比它解决的问题还多。)我似乎记得我在大学使用stdio时做这件事相对简单,但我现在找不到任何例子来说明如何做这件事。如有任何想法或建议,将不胜感激。谢谢 其他细节 以下是我现在要做的:C++ 在Win32控制台应用程序中设置光标位置,c++,console-application,cursor-position,C++,Console Application,Cursor Position,如何在Win32控制台应用程序中设置光标位置?最好,我希望避免使用句柄和Windows控制台功能。(我花了一上午的时间在那条黑暗的小巷里跑来跑去;它带来的问题比它解决的问题还多。)我似乎记得我在大学使用stdio时做这件事相对简单,但我现在找不到任何例子来说明如何做这件事。如有任何想法或建议,将不胜感激。谢谢 其他细节 以下是我现在要做的: COORD pos = {x, y}; HANDLE hConsole_c = CreateConsoleScreenBuffer( GENERIC_REA
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
永远不会发送到屏幕。还有什么我应该做的吗?谢谢。请参阅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);
使用控制台功能,您可以使用
设置控制台位置
。如果没有它们(或者至少不直接使用它们),您可以在库中使用类似于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);
}
您可能正在使用Windows 32位控制台应用程序无法使用的。是的,您忘了调用
SetConsoleActiveScreenBuffer
。创建自己的网站到底有什么意义?使用GetStdHandle(标准输出句柄)
获取现有控制台的句柄。\include
#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;
}
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
int x,y;
cin>>x>>y;
SetCursorPos(x,y);//设置坐标
睡眠(500);
鼠标事件(MOUSEEVENTF_LEFTDOWN,x,y,0,0);//向左向下移动光标
鼠标事件(MOUSEEVENTF_LEFTUP,x,y,0,0);//向左移动光标//访问所需坐标
系统(“暂停”);
返回退出成功;
}
gotoxy是我想到的,但我发现即使setConsoleUrsOrposition
API正确设置了光标位置,当我尝试使用printf
向控制台发送文本时,文本被输出到调用API之前光标所在的位置。@Jim:了解编译器是如何做到这一点的很有意思。多年来,我在Microsoft编译器中使用过类似的代码,但从未见过您描述的行为。请参阅我添加到问题中的其他详细信息。谢谢。@Jim:您正在创建并写入屏幕缓冲区(基本上只是一块内存),但没有写入控制台本身,也没有将您创建的屏幕缓冲区与控制台关联。Jerry,谢谢您的建议。最后,我编写了一个包装类来处理所有控制台操作。SetConsoleCursorPosition
是一个Windows控制台函数,我声明我不想使用它。因此,我最终同意Hans的建议,使用GetStdHandle(STD\u OUTPUT\u handle)
来获取现有控制台的句柄,但事实证明,我还需要使用WriteConsoleOutputCharacter()
。我不知道为什么那个电话会起作用,但现在起作用了。谢谢嗯,那是可能的。谢谢。好问题,这就是为什么我在这篇文章中,这是很容易做到的涡轮帕斯卡在预显卡PC(XT,AT和386)甚至作为一个高中生,作为最后的作业,我能够创建一个界面,输入到一个虚拟的机票预订系统的细节。。。得了A+,为什么现在这么难?需要更多信息。没有称为SetCursorPos的方法。@GavinWilliams方法出现在win 7中,但不知道win 10