Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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# 24位彩色Ansi Win32获取屏幕缓冲区位置的背景属性和字符_C#_Winapi_Console - Fatal编程技术网

C# 24位彩色Ansi Win32获取屏幕缓冲区位置的背景属性和字符

C# 24位彩色Ansi Win32获取屏幕缓冲区位置的背景属性和字符,c#,winapi,console,C#,Winapi,Console,请参阅我正在编写的.NET Core的24位彩色ANSI库的输出中的下图。我想改进DrawBox函数,它将矩形轮廓绘制到渐变框中,以在写入新字符时保留屏幕缓冲区中的基线背景色属性 ReadConsoleOutput允许我获取特定位置的屏幕缓冲区,但CHAR_INFO获取反映标准16色版本的属性。有没有办法在某个屏幕缓冲区位置获取字符的前景和背景属性的24位颜色 这是我在此期间使用的解决方法,它只是简单地在结果中手动跟踪背景值,以便如果我想与新前景合成,我可以在特定的x/y值下进行合成

请参阅我正在编写的.NET Core的24位彩色ANSI库的输出中的下图。我想改进DrawBox函数,它将矩形轮廓绘制到渐变框中,以在写入新字符时保留屏幕缓冲区中的基线背景色属性

ReadConsoleOutput允许我获取特定位置的屏幕缓冲区,但CHAR_INFO获取反映标准16色版本的属性。有没有办法在某个屏幕缓冲区位置获取字符的前景和背景属性的24位颜色


这是我在此期间使用的解决方法,它只是简单地在结果中手动跟踪背景值,以便如果我想与新前景合成,我可以在特定的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#的控制台库。