Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Win32控制台应用程序中设置光标位置_C++_Console Application_Cursor Position - Fatal编程技术网

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

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

如何在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
永远不会发送到屏幕。还有什么我应该做的吗?谢谢。

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