C# 24位彩色Ansi Win32获取屏幕缓冲区位置的背景属性和字符
请参阅我正在编写的.NET Core的24位彩色ANSI库的输出中的下图。我想改进DrawBox函数,它将矩形轮廓绘制到渐变框中,以在写入新字符时保留屏幕缓冲区中的基线背景色属性 ReadConsoleOutput允许我获取特定位置的屏幕缓冲区,但CHAR_INFO获取反映标准16色版本的属性。有没有办法在某个屏幕缓冲区位置获取字符的前景和背景属性的24位颜色C# 24位彩色Ansi Win32获取屏幕缓冲区位置的背景属性和字符,c#,winapi,console,C#,Winapi,Console,请参阅我正在编写的.NET Core的24位彩色ANSI库的输出中的下图。我想改进DrawBox函数,它将矩形轮廓绘制到渐变框中,以在写入新字符时保留屏幕缓冲区中的基线背景色属性 ReadConsoleOutput允许我获取特定位置的屏幕缓冲区,但CHAR_INFO获取反映标准16色版本的属性。有没有办法在某个屏幕缓冲区位置获取字符的前景和背景属性的24位颜色 这是我在此期间使用的解决方法,它只是简单地在结果中手动跟踪背景值,以便如果我想与新前景合成,我可以在特定的x/y值下进行合成
这是我在此期间使用的解决方法,它只是简单地在结果中手动跟踪背景值,以便如果我想与新前景合成,我可以在特定的x/y值下进行合成
var background1 = GradientRectangle(
new Point() { X = 2, Y = 2 },
new Size() { Width = 40, Height = 10 },
new RGBColor() { R = 0, G = 0, B = 127 },
new RGBColor() { R = 0, G = 0, B = 0 },
' ', true);
public List<RGBColor> GradientRectangle(Point startPoint, Size size, RGBColor startColor, RGBColor endColor, ushort character = (ushort)' ', bool horizontal = false)
{
List<RGBColor> result = new List<RGBColor>();
if (horizontal)
{
int idx = 0;
for (int x = startPoint.X; x <= startPoint.X + size.Width; x++)
{
float t = (float)idx / (float)size.Width;
RGBColor lerpColor = startColor.Lerp(endColor, t);
SetBackgroundColor(lerpColor);
for (int y = startPoint.Y; y <= startPoint.Y + size.Height; y++)
{
SetCursor(new Point() { X = x, Y = y });
Console.Write(""+(char)character);
}
result.Add(lerpColor);
idx++;
}
}
else
{
int idx = 0;
for (int y = startPoint.Y; y <= startPoint.Y + size.Height; y++)
{
float t = (float)idx / (float)size.Height;
SetCursor(new Point() { X = startPoint.X, Y = y });
RGBColor lerpColor = startColor.Lerp(endColor, t);
SetBackgroundColor(lerpColor);
Console.Write("".PadLeft(size.Width+1, (char)character));
result.Add(lerpColor);
idx++;
}
}
return result;
}
var background1=GradientRectangle(
新点(){X=2,Y=2},
新尺寸(){Width=40,Height=10},
新的RGBColor(){R=0,G=0,B=127},
新的RGBColor(){R=0,G=0,B=0},
“是的,没错);
公共列表GradientRectangle(点起始点,大小,RGBColor起始颜色,RGBColor结束颜色,ushort字符=(ushort)',bool水平=false)
{
列表结果=新列表();
如果(水平)
{
int-idx=0;
对于(int x=startPoint.x;x是否要获取角色的RGB值?@Straightsun MSFT是的,这是正确的,当我查看ReadConsoleOutput生成的属性时,它让我知道属性的红色、绿色和蓝色位标志已设置,但仅此而已,我不知道如何获取扩展RGB早期由esc[38;2;RG;Bm或esc生成的颜色值[48;2;R;G;Bm在同一控制台上执行应用程序之前可能产生的屏幕外缓冲区。@Streetsun MSFT我认为删除了您的其他评论,您的研究结果是不利的?似乎应该在VT标准中作为csi代码全面实施。win32控制台窗口不支持渐变背景。您的项目如何开发渐变颜色?我是否可以认为您的目的是读取窗口上任何点的RGB颜色值?请参见此内容。@C#中的Straightsun MSFT非常容易,只需定义x/y/大小/宽度的开始和结束颜色之间的线性插值,然后esc[48;2;R;G;Bm VT编码并使用空格字符。但是,这会完全覆盖屏幕缓冲区的现有矩形。因此,作为此矩形渐变函数的一种解决方法,我现在返回一个线性插值颜色数组。我将很快发布C#的控制台库。