WriteConsoleOutputCharacterW - 我的新行在哪里?

WriteConsoleOutputCharacterW - Where are my new lines?

本文关键字:在哪里 新行 我的 WriteConsoleOutputCharacterW      更新时间:2023-10-16

我正在尝试学习如何使用屏幕缓冲区,但我犯了一个我不明白的错误。这些是我的屏幕缓冲区的设置:

wchar_t* screen = new wchar_t[nScreenWidth * nScreenHeight];
for (int i = 0; i < nScreenWidth * nScreenHeight; i++) {
screen[i] = L' ';
}
HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
SetConsoleActiveScreenBuffer(hConsole);
DWORD dwBytesWritten = 0;
WriteConsoleOutputCharacterW(hConsole, screen, (nScreenWidth * nScreenHeight), { 0,0 }, &dwBytesWritten);

我设法将我的 2D 阵列打印到它,但奇怪的是它平放在我的终端窗口中(请参阅打印屏幕的链接(。

失败的 2D 阵列的小打印屏幕

就好像所有新行都被删除了一样。这是我将 2D 数组打印到"屏幕"的循环。

int g = 0;
while (g < 100) {
WriteConsoleOutputCharacterW(hConsole, screen, (nScreenWidth * nScreenHeight), { 0,0 }, &dwBytesWritten);
for (int i = 0; i < field.difficulty; i++) {
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
for (int y = 0; y < field.nFieldHeight; y++) {
for (int x = 0; x < field.nFieldWidth; x++) {
screen[(y + 2) * field.nFieldWidth + (x + 2)] = field.matrix[x][y];
}
}
}

每次打印字符时,是否有可能需要写入屏幕缓冲区中的坐标?

默认情况下,控制台窗口可重新调整大小,这会导致输出换行。您可以使用以下命令来防止这种情况:

// Get console window
HWND hwndWindow = GetConsoleWindow();
// Prevent resize & maximize
LONG lFlags = GetWindowLong(hwndWindow , GWL_STYLE) & ~WS_MAXIMIZEBOX & ~WS_SIZEBOX & ~WS_HSCROLL;
SetWindowLong(hwndWindow , GWL_STYLE, lFlags);
// Get console handle
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// Set window and buffer size
_SMALL_RECT consoleRect = { 0, 0, SCREEN_W - 1, SCREEN_H - 1 };
SetConsoleScreenBufferSize(hConsole, { SCREEN_W, SCREEN_H });
SetConsoleWindowInfo(hConsole, TRUE, &consoleRect);