Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# 在C语言中,如何在不移动光标的情况下将字符输出到控制台?_C#_.net_Console_Console Application - Fatal编程技术网

C# 在C语言中,如何在不移动光标的情况下将字符输出到控制台?

C# 在C语言中,如何在不移动光标的情况下将字符输出到控制台?,c#,.net,console,console-application,C#,.net,Console,Console Application,我目前正在使用C.NET4.5来设计一个控制台应用程序。我遇到的问题是,在使用Console.Writechar c之后,光标总是移动到下一个单元格,因此当光标到达行的最后一个单元格时,它会移动到下一行,从而打乱所有布局。是否可以在不移动光标的情况下向控制台输出具有背景和前景颜色的字符 我使用的代码如下所示: Console.BackgroundColor = bgColor; Console.ForegroundColor = fgColor; Console.SetCursorPositio

我目前正在使用C.NET4.5来设计一个控制台应用程序。我遇到的问题是,在使用Console.Writechar c之后,光标总是移动到下一个单元格,因此当光标到达行的最后一个单元格时,它会移动到下一行,从而打乱所有布局。是否可以在不移动光标的情况下向控制台输出具有背景和前景颜色的字符

我使用的代码如下所示:

Console.BackgroundColor = bgColor;
Console.ForegroundColor = fgColor;
Console.SetCursorPosition(currX, currY);
Console.Write(c);
假设currX和currY为整数,bgColor和fgColor为控制台颜色,c为字符

谢谢。

根据,它只提供对标准输出流的访问,而不提供对屏幕缓冲区的访问,尽管您可以更改缓冲区的某些属性,例如其大小。MoveBufferArea是另一个明显的例外,但实际上并不适用于这里1

Win32 API确实提供对控制台缓冲区的访问。您可能希望p/invoke或。p/invoke声明

值得注意的是:

WriteConsoleOutput对光标位置没有影响

哦,您可能希望Unicode版本以W结尾,因为.NET字符串都是UTF-16

1它允许您以两种方式提供内容:已经在缓冲区中的内容-但首先要将其放在缓冲区中是个问题,或者从提供的字符和属性中获取内容-但这仅用于填充源区域,而目的地不是可选的。

根据,它仅提供对标准输出流的访问,虽然您可以更改缓冲区的某些属性,例如其大小,但不能更改屏幕缓冲区。MoveBufferArea是另一个明显的例外,但实际上并不适用于这里1

Win32 API确实提供对控制台缓冲区的访问。您可能希望p/invoke或。p/invoke声明

值得注意的是:

WriteConsoleOutput对光标位置没有影响

哦,您可能希望Unicode版本以W结尾,因为.NET字符串都是UTF-16

1它允许您以两种方式提供内容:内容已经在缓冲区中,但首先要解决的问题是如何将其放到缓冲区中,或者从提供的字符和属性中获取内容,但这仅用于填充源区域,而目的地不是可选的。

尝试类似于

Console.Write("b");
Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
Console.Write("c");
对我来说,这只是打印b,然后用c替换。实际上,前两行一起写入控制台而不移动光标。您可以得出这样的结论,因为当您编写c时,它会覆盖b,而不是将其放在下一个位置

您甚至可以编写一个助手方法:

static void WriteWithoutMove(string s) 
{
    Console.Write(s);
    Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
}
这就是你要找的吗?

试试

Console.Write("b");
Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
Console.Write("c");
对我来说,这只是打印b,然后用c替换。实际上,前两行一起写入控制台而不移动光标。您可以得出这样的结论,因为当您编写c时,它会覆盖b,而不是将其放在下一个位置

您甚至可以编写一个助手方法:

static void WriteWithoutMove(string s) 
{
    Console.Write(s);
    Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
}

这就是您要找的吗?

我记得旧的DOS,例如BASIC命令:

locate(21,50)
print "Qty[26]";
注:
这个用于粘贴文本光标并添加1个字符,如果您使用的是is TAB CHR$8

我记得以前的DOS,例如BASIC命令:

locate(21,50)
print "Qty[26]";
注:
这个用于粘贴文本光标并添加1个字符,如果使用is选项卡CHR$8

您需要更具体地说明如何使用SetCursorPosition,因为这显然是这里的问题。您应该能够打印并简单地将光标位置备份1个字符,然后就可以开始了。有点尴尬的是,您可以在不使用该功能的情况下将页面滚动到右下角的位置写入。我使用SetCursorPosition来写入特定的单元格。问题是,如果我写到一行的79位,它就会转到下一行。我认为问题是我应该使用其他不是控制台的东西。写,但我不知道是什么。我还检查了MSDN,但没有发现任何问题。@500 InternalServerError,您是否建议使用MoveBufferArea而不是使用单单元格区域写入?在执行Console.Writec之后,您可以使用SetCursorPosition再次重置位置。您需要更具体地说明如何使用SetCursorPosition,因为这显然是这里的问题所在。您应该能够打印并简单地将光标位置备份1个字符,然后就可以开始了。有点尴尬的是,您可以在不使用该功能的情况下将页面滚动到右下角的位置写入。我使用SetCursorPosition来写入特定的单元格。问题是,如果我写到一行的79位,它就会转到下一行。我认为问题是我应该使用其他不是控制台的东西。写,但我不知道是什么。我还检查了MSDN,但没有结果。@500 InternalServerError,您是否建议使用MoveBufferArea而不是使用一个单元格区域进行写入?在执行Console.Wr之后,您可以使用SetCursorPosition再次重置位置
itec,并不是那么简单。如果他在一行末尾写一个字符,光标将向下移动到下一行。如果他写到控制台窗口最后一行的最后一个位置,窗口就会滚动。@JimMischel,这是个好主意。OP将需要跟踪每次写入内容时写入的最后一个位置,并在希望不移动写入时将该位置重新设置为前一个位置。我将尝试此解决方案和缓冲区解决方案。我将在有时间尝试时更新。此解决方案无法运行,因为在最后一行的最后一列写入字符时,无法阻止滚动。这是一种过度思考。只需保存旧的光标位置,执行任意操作,然后恢复旧位置。不需要关心缓冲区宽度等,它不是那么简单。如果他在一行末尾写一个字符,光标将向下移动到下一行。如果他写到控制台窗口最后一行的最后一个位置,窗口就会滚动。@JimMischel,这是个好主意。OP将需要跟踪每次写入内容时写入的最后一个位置,并在希望不移动写入时将该位置重新设置为前一个位置。我将尝试此解决方案和缓冲区解决方案。我将在有时间尝试时更新。此解决方案无法运行,因为在最后一行的最后一列写入字符时,无法阻止滚动。这是一种过度思考。只需保存旧的光标位置,执行任意操作,然后恢复旧位置。不需要关心缓冲区宽度等。