【问题标题】:Returning SetConsoleTextAttribute colour value from function in c从 c 中的函数返回 SetConsoleTextAttribute 颜色值
【发布时间】: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 函数是否有故障。

标签: c function winapi colors


【解决方案1】:

好的,我把它修好了。我首先决定在 mainMenu() 函数中声明 HANDLE 值并删除 HANDLE 指针。

其次,setColour() 函数的 GetConsoleScreenBufferInfoEx() 确实在更改颜色值之前被调用,但在修改颜色值后没有被调用,因此我需要再次调用 GetConsoleScreenBufferInfoEx() 来获取要使用的新颜色值.

固定代码:

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);
    GetConsoleScreenBufferInfoEx(hConsole, &info);
    SetConsoleTextAttribute(hConsole, Colour);
}

void mainMenu(WindowProp* Dimensions) {
    getWindowSize(Dimensions);
    clearScreen();
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    setColour(hConsole, 3, 120, 120, 236, 48);
    int DisplayRowCount, DisplayColumnCount;
    for (DisplayRowCount = 0; DisplayRowCount <= Dimensions->Y-1; DisplayRowCount++) {
        for (DisplayColumnCount = 0; DisplayColumnCount <= Dimensions->X-1; DisplayColumnCount++) {
            printf(" ");
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 2015-10-07
    • 2016-08-28
    • 1970-01-01
    • 2013-09-02
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多