Windows API开发:如何在外部函数中访问CHAR_INFO结构体?
控制台缓冲区CHAR_INFO数组的函数封装解决方案
方案一:通过参数传递CHAR_INFO数组(推荐)
要将填充缓冲区的嵌套循环封装到独立函数中,你可以直接将CHAR_INFO数组作为指针参数传递给函数,同时传入缓冲区的宽高(避免依赖全局宏,提升函数灵活性)。函数写法如下:
// 填充控制台缓冲区的独立函数 void fillConsoleBuffer(CHAR_INFO* consoleBuffer, int width, int height) { for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { // 计算当前字符在数组中的索引 int index = x + width * y; consoleBuffer[index].Char.AsciiChar = 'a'; consoleBuffer[index].Attributes = rand() % 256; } } }
在main函数中调用时,直接传入栈上声明的consoleBuffer数组(数组名会自动退化为指针),以及定义好的宽高宏:
while(1){ fillConsoleBuffer(consoleBuffer, WIDTH, HEIGHT); WriteConsoleOutputA(wHnd, consoleBuffer, characterBufferSize, characterPosition, &consoleWriteArea); }
方案二:修复全局变量无效的问题
如果坚持使用全局变量,问题通常出在全局变量的声明位置:必须确保WIDTH和HEIGHT宏在全局数组声明之前定义,否则编译器无法计算数组大小。修改后的全局声明如下:
#include <windows.h> #include <stdio.h> #include <stdlib.h> #define WIDTH 70 #define HEIGHT 35 HANDLE wHnd; //Write Handle CHAR_INFO consoleBuffer[WIDTH * HEIGHT]; // 全局缓冲区,宏已提前定义
对应的填充函数无需参数,直接访问全局数组:
void fillConsoleBuffer() { for (int y = 0; y < HEIGHT; ++y) { for (int x = 0; x < WIDTH; ++x) { int index = x + WIDTH * y; consoleBuffer[index].Char.AsciiChar = 'a'; consoleBuffer[index].Attributes = rand() % 256; } } }
完整修改后的代码(参数传递版本)
#include <windows.h> #include <stdio.h> #include <stdlib.h> #define WIDTH 70 #define HEIGHT 35 HANDLE wHnd; //Write Handle void fillConsoleBuffer(CHAR_INFO* consoleBuffer, int width, int height) { for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { int index = x + width * y; consoleBuffer[index].Char.AsciiChar = 'a'; consoleBuffer[index].Attributes = rand() % 256; } } } int main(void) { int x, y; SMALL_RECT windowSize = {0, 0, WIDTH - 2, HEIGHT - 2}; COORD bufferSize = {WIDTH, HEIGHT}; COORD characterBufferSize = {WIDTH, HEIGHT}; COORD characterPosition = {0, 0}; SMALL_RECT consoleWriteArea = {0, 0, WIDTH - 1, HEIGHT - 1}; CHAR_INFO consoleBuffer[WIDTH * HEIGHT]; wHnd = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTitle("CONSOLE"); SetConsoleWindowInfo(wHnd, TRUE, &windowSize); SetConsoleScreenBufferSize(wHnd, bufferSize); // 初始化随机数种子,避免每次运行随机序列相同 srand(GetTickCount()); while(1){ fillConsoleBuffer(consoleBuffer, WIDTH, HEIGHT); WriteConsoleOutputA(wHnd, consoleBuffer, characterBufferSize, characterPosition, &consoleWriteArea); // 可选:添加小延迟,降低CPU占用 Sleep(10); } }
额外提示
- 添加
srand(GetTickCount());初始化随机数种子,否则每次程序运行都会生成相同的颜色序列。 - 循环中加入
Sleep(10);可减少CPU占用,避免程序持续高负载运行。
内容的提问来源于stack exchange,提问作者Saw
相关产品推荐
相关产品推荐

