【发布时间】:2017-12-06 00:24:54
【问题描述】:
目前我正在尝试使用 windows.h 函数调用一个函数来更改文本背景的颜色。我以前做过,但不是来自另一个功能。是函数需要以某种方式返回颜色值的问题,还是有问题。 如果发生任何变化,则从另一个函数调用该函数。
一起编码:
void setColour(HANDLE* hConsole, int ChangeColour, int Red, int Green, int Blue, int Colour) {
CONSOLE_SCREEN_BUFFER_INFOEX info;
info.cbSize = sizeof(info);
GetConsoleScreenBufferInfoEx(hConsole, &info);
info.ColorTable[ChangeColour] = RGB(Red, Green, Blue);
SetConsoleTextAttribute(hConsole, Colour);
}
void mainMenu(WindowProp* Dimensions, HANDLE* hConsole) {
getWindowSize(Dimensions);
clearScreen();
setColour(hConsole, 3, 120, 120, 236, 48);
printf("Set");
int DisplayRowCount, DisplayColumnCount;
for (DisplayRowCount = 0; DisplayRowCount <= Dimensions->Y-1; DisplayRowCount++) {
for (DisplayColumnCount = 0; DisplayColumnCount <= Dimensions->X-1; DisplayColumnCount++) {
printf(" ");
}
}
}
mainMenu 从 main 调用:
mainMenu(&WindowP, hConsole);
【问题讨论】:
-
您将
HANDLE*指针传递给GetConsoleScreenBufferInfoEx()和SetConsoleTextAttribute(),但他们期望的是HANDLE值。HANDLE已经是指针类型,所以不需要通过地址来传递。编译代码的唯一方法是在没有定义STRICT的情况下进行编译,因此HANDLE映射到void*(STRICT会发现此错误并无法编译)。您需要将HANDLE*参数更改为HANDLE并通过值而不是指针传递它们 -
@RemyLebeau 好的,所以我修复了这个问题并且函数被正确调用但颜色仍然没有改变
-
嗯,您正在检索控制台颜色表的一个副本,然后更改该副本,但您没有使用
SetConsoleScreenBufferInfoEx()将更改分配回控制台。而SetConsoleTextAttribute()只影响更高级别的输出函数,例如WriteFile(),而不影响较低级别的输出函数,例如WriteConsoleOutput()、WriteConsoleOutputCharacter()等。检查您的RTL 对printf()的实现,看看API 函数实际上是什么用于控制台输出。而且,您没有检查任何一个 API 函数是否有故障。