2017-12-06 14 views
1

現在、私はwindows.h関数を使ってテキストの背景色を変更する関数を呼び出そうとしています。私は前にそれをしたが、別の機能ではなかった。関数が色の値を何らかの形で返す必要があるか、何か間違っているという問題ですか? 関数が変更された場合、その関数は別の関数から呼び出されました。一緒SetConsoleTextAttribute関数のカラー値をcの関数から返す

コード:

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はメインから呼び出さ:

mainMenu(&WindowP, hConsole); 
+1

あなたは 'GetConsoleScreenBufferInfoEx()'と 'SetConsoleTextAttribute()'と 'HANDLE *'ポインタを渡しているが、彼らは代わりに 'HANDLE'値を期待しています。 'HANDLE'はすでにポインタ型なので、アドレスで渡す必要はありません。コードがコンパイルできる唯一の方法は、 'STRICT'が定義されていないコンパイルの場合です。' HANDLE'は 'void *'にマッピングされます( 'STRICT'はこのエラーを受け取り、コンパイルに失敗します)。 'HANDLE *'パラメータを 'HANDLE'に変更し、ポインタではなく値を渡す必要があります。 –

+0

@RemyLebeau Okこれで問題は解決しましたが、関数は正しく呼び出されますが、色は変わりません。 – Ahm23

+1

コンソールのカラーテーブルのコピー*を取得してからそのコピーを変更していますが、コンソールに 'SetConsoleScreenBufferInfoEx()'で変更を割り当てていません。 'SetConsoleTextAttribute()'は、 'WriteConsoleOutput()'、 'WriteConsoleOutputCharacter()'などの低レベル出力関数ではなく、 'WriteFile()'のような上位レベルの出力関数にのみ影響します。 'printf () 'を使用して、実際にコンソール出力に使用されているAPI関数を確認します。また、いずれのAPI関数も失敗しているかどうかはチェックしていません。 –

答えて

0

[OK]をので、私はそれを固定してしまいました。まず、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(" "); 
     } 
    } 
} 
関連する問題