【发布时间】:2021-01-13 12:34:08
【问题描述】:
我只是在搞乱 CPP 和 Windows 控制台。我需要更改我拥有的屏幕缓冲区的特定部分,但它总是打印我想要的字符串加上一个空方框。
有没有办法去掉这个空白框?
int screen_w = 120;
int screen_h = 30;
void init_screen(wchar_t* screen_buffer, int screen_w, int screen_h) {
for (int i = 0; i < screen_h; ++i) {
for (int j = 0; j < screen_w; ++j) {
if (i != 0 && i != 2 && i != screen_h - 1 &&
j != 0 && j != screen_w - 1) {
screen_buffer[i * screen_w + j] = ' ';
} else {
screen_buffer[i * screen_w + j] = '#';
}
}
}
}
int main() {
int screen_s = screen_w * screen_h;
wchar_t *screen_buffer = 0;
screen_buffer = (wchar_t *) calloc(screen_s, sizeof *screen_buffer);
HANDLE c_handle = CreateConsoleScreenBuffer(
GENERIC_WRITE | GENERIC_READ,
0,
0,
CONSOLE_TEXTMODE_BUFFER,
0);
SetConsoleActiveScreenBuffer(c_handle);
DWORD bytes_written = 0;
init_screen(screen_buffer, screen_w, screen_h);
while (1) {
Sleep(1000 / 10);
WriteConsoleOutputCharacterW(c_handle, screen_buffer, screen_s, { 0, 0 }, &bytes_written);
wsprintfW(&screen_buffer[15 * screen_w + 60], L"hello world"); // THIS IS WHAT I DO.
// TRIED OTHER SIMILAR FUNCTIONS.
if (GetAsyncKeyState(VK_SPACE) & 0x8000) break;
}
free(screen_buffer = 0);
return 0;
}
它显示了什么:
########################################################################################################################
# #
########################################################################################################################
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# hello world▯ #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
########################################################################################################################```
【问题讨论】:
-
添加了,抱歉!
-
也许这是一个控制台编码的东西?我不知道...
-
wsprintfW将整个字符串文字复制到屏幕缓冲区中,包括 NUL 终止字符。你可能想要wmemcpy或类似的东西——不处理以 NUL 结尾的字符串。 -
还要注意wsprintfW 的文档说:注意不要使用....
-
Adrian Mole 我之前实际上是在使用 swprintf。还尝试了swprintf_s。总是一样的结果。
标签: c++ windows-console