【问题标题】:24-bit Color Ansi Win32 Get Background attribute and character at screen buffer location24 位彩色 Ansi Win32 获取屏幕缓冲区位置的背景属性和字符
【发布时间】:2020-06-05 02:11:19
【问题描述】:

从我正在编写的 .NET Core 的 24 位颜色 ANSI 库的输出中查看下图。我想改进 DrawBox 函数,该函数将矩形轮廓绘制到渐变框,以在写入新字符时保留屏幕缓冲区中的底层背景颜色属性。

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

https://docs.microsoft.com/en-us/windows/console/readconsoleoutput

https://docs.microsoft.com/en-us/windows/console/char-info-str

【问题讨论】:

  • 你想获取一个字符的RGB值吗?
  • @StriveSun-MSFT 是的,这是正确的,当我查看 ReadConsoleOutput 生成的属性时,它让我知道该属性的红色、绿色和蓝色位标志已设置,但仅此而已事实上,我不知道如何并且想知道如何获取先前由 esc[38;2;RG;Bm 或 esc[48;2;R;G;Bm off 生成的颜色的扩展 RGB 值在同一控制台上执行应用程序之前可能已生成的屏幕缓冲区。
  • @StriveSun-MSFT 我认为您的其他 cmets 被删除,您的研究结果是不利的?似乎应该在 VT 标准中作为 csi 代码全面实施。
  • win32 控制台窗口不支持渐变背景。您的项目如何开发渐变色?我可以认为您的目的是读取窗口上任何点的 RGB 颜色值吗?请参阅link
  • @StriveSun-MSFT 在 C# 中非常容易,只是定义了 x/y/size/width 的开始和结束颜色之间的线性插值,然后 esc[48;2;R;G;Bm VT代码并使用空格字符。但是,这会完全覆盖屏幕缓冲区的现有矩形。因此,作为这个矩形渐变函数的解决方法,我现在返回一个线性插值颜色数组。我将很快为 C# 发布一个控制台库。

标签: c# winapi console


【解决方案1】:

这是我在此期间使用的解决方法,它只是为了在结果中手动跟踪背景值,所以如果我想与新的前景进行合成,我可以在特定的 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;
    }

【讨论】:

    猜你喜欢
    • 2014-08-05
    • 2012-09-14
    • 2012-02-11
    • 2014-10-03
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    相关资源
    最近更新 更多