WriteConsoleOutput неправильный интервал - PullRequest
0 голосов
/ 01 января 2019

Почему символы написаны в 1 ячейке?API консоли Windows, но теперь я столкнулся с проблемой, которая сломала мне мозг. Должна отображаться просто строка, но отображаются точки

Мой код:

[StructLayout(LayoutKind.Sequential)]
public struct CONSOLE_SCREEN_BUFFER_INFO
{
    public COORD dwSize;
    public COORD dwCursorPosition;
    public short wAttributes;
    public SmallRect srWindow;
    public COORD dwMaximumWindowSize;
}
[StructLayout(LayoutKind.Explicit)]
public struct CharInfo
{
    [FieldOffset(0)]
    internal char UnicodeChar;
    [FieldOffset(0)]
    internal short AsciiChar;
    [FieldOffset(2)]
    internal COLOR Attributes;
}
[StructLayout(LayoutKind.Sequential)]
public struct SmallRect
{
    public short Left;
    public short Top;
    public short Right;
    public short Bottom;
}
[StructLayout(LayoutKind.Sequential)]
public struct COORD
{
    public short X;
    public short Y;
    public COORD(short X, short Y)
    {
        this.X = X;
        this.Y = Y;
    }
}
public class Engine
{
    public short Width { get; protected set; }
    public short Height { get; protected set; }
    public CharInfo[] buffer;
    protected SmallRect rect;
    protected const int STDIN = -10;
    protected const int STDOUT = -11;
    protected const int STDERR = -12;
    public Engine(short width = 80, short height = 25)
    {
        Width = width;
        Height = height;
        buffer = new CharInfo[width * height];
        rect  = new SmallRect() { Left = 0, Top = 0, Right = width, Bottom = height };
        SetConsoleCP(437); SetConsoleOutputCP(437);
        Console.SetBufferSize(width, height);
        Console.SetWindowSize(width, height);
    }
    public void SetPixel(short x, short y, Character symbol, COLOR color)
    {
        SetPixel(x, y, new CharInfo() {Attributes = color, UnicodeChar = (char)symbol });
    }
    protected void SetPixel(short x, short y, CharInfo @char)
    {
        if (x >= 0 && y >= 0 && x < Width && y < Height)
        {
            buffer[y * Width + x] = @char;
        }
        WriteConsoleOutput(GetStdHandle(STDOUT), buffer, new COORD(80, 25), new COORD(0, 0), ref rect);
    }

    [DllImport("kernel32.dll",SetLastError =true)]
    static extern bool SetConsoleOutputCP(uint CodePageId);

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool SetConsoleCP(uint CodePageId);

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool WriteConsoleOutput(IntPtr hConsoleOutput, CharInfo[] buffer, COORD bufferSize, COORD bufferCoord, ref SmallRect region);

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern IntPtr GetStdHandle(int handle);

    [DllImport("kernel32.dll")]
    static extern uint GetLastError();

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool GetConsoleScreenBufferInfo(IntPtr hConsoleOutput, out CONSOLE_SCREEN_BUFFER_INFO buffer);

}


 class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        Engine e = new Engine();
        for (short i = 0; i < 10; i++)
        {
            e.SetPixel(i, 1, Character.Full, COLOR.FG_RED);
        }
        Console.ReadLine();
    }
}

вывод результата:

result

1 Ответ

0 голосов
/ 01 января 2019

Хотя вы не показываете это, я считаю, что ваше определение ЦВЕТ неверно.COLOR - это, вероятно, тип enum.Убедитесь, что у него базовый тип short, а не int.

enum COLOR : short
{
    FW_RED = 0x0004,
}

Если вы опустите ": short", компилятор создаст структуру CharInfo размером 6 байт вместо 4 байт.

При правильном определении я получаю полную строку:

full line

...