2017-12-06 11 views
1

현재이 함수는 windows.h 함수를 사용하여 텍스트 배경의 색상을 변경하는 함수를 호출하려고합니다. 나는 그것을 이전에했지만 다른 기능으로는하지 못했습니다. 함수가 색상 값을 어떻게 든 반환해야하거나 문제가있는 것입니다. 함수가 다른 함수에서 변경되면 함수가 호출되었습니다. 함께함수에서 SetConsoleTextAttribute 색상 값을 반환합니다.

코드 : 메인에서 호출

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'에'HANDLE *'포인터를 전달하는()'와'()'SetConsoleTextAttribute을하지만 대신'HANDLE' 값을 기대합니다. 'HANDLE'은 이미 포인터 타입이므로, 주소별로 전달할 필요가 없습니다. 코드가 컴파일 할 수있는 유일한 방법은'STRICT'가 정의되지 않은 채로 컴파일하는 경우입니다. 그래서'HANDLE'은'void *'에 매핑됩니다. ('STRICT'는이 에러를 잡았을 것이고 컴파일에 실패했을 것입니다.) 'HANDLE *'매개 변수를'HANDLE'로 변경하고 포인터 대신 값으로 전달할 필요가 있습니다. –

+0

@RemyLebeau Ok 그래서 함수가 제대로 호출되지만 색상은 여전히 ​​변하지 않습니다. – Ahm23

+1

글쎄, 당신은 콘솔의 색상 표를 복사 한 다음 그 사본을 변경하고 있지만,'SetConsoleScreenBufferInfoEx()'를 사용하여 콘솔에 변경 사항을 다시 지정하지는 않습니다. 그리고'SetConsoleTextAttribute()'는'WriteConsoleOutput()','WriteConsoleOutputCharacter()'와 같은 저수준 출력 함수가 아닌'WriteFile()'과 같은 상위 레벨 출력 함수에만 영향을 미칩니다. RTL의'printf()'을 사용하여 콘솔 출력에 실제로 사용되는 API 함수를 확인하십시오. 그리고 API 함수 중 하나를 검사하지 않습니다. –

답변

0

좋아. 먼저 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(" "); 
     } 
    } 
}