2015-10-30 5 views
0

Я искал бесчисленные форумы и веб-сайты, но я не могу найти ответ. Я пытаюсь использовать SetConsoleTextAttribute, но это влияет только на текст. Как я могу повлиять на весь экран, как команда color 1f? Мой код:Как использовать SetConsoleTextAttribute C++

#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 
#include <wincon.h> 

using namespace std; 

int main() 
{ 
    SetConsoleTitle("C++ CALCULATOR"); // Title of window 
    int x; // Decision 
    int a; // First Number 
    int b; // Second Number 
    int c; // Answer 
    HANDLE Con; 
    Con = GetStdHandle(STD_OUTPUT_HANDLE); 
    SetConsoleTextAttribute(Con, BACKGROUND_BLUE | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED); 
    cout << "CALCULATOR" << endl << endl; 
    cout << "1:ADDITION" << endl << "2:SUBTRACTION" << endl << "3:MULTIPLICATION"; 
    cout << endl << "4:DIVISION" << endl << "5:EXIT" << endl; 
    cin >> x; 
    switch (x) 
    { 
     case 1: // Addition code 
      cout << endl << "ADDITION" << endl << "FIRST NUMBER:"; 
      cin >> a; 
      cout << endl << "SECOND NUMBER:"; 
      cin >> b; 
      c = a + b; 
      cout << endl << "ANSWER:" << c; 
      break; 
     case 2: // Subtraction code 
      cout << endl << "SUBTRACTION" << endl << "FIRST NUMBER:"; 
      cin >> a; 
      cout << endl << "SECOND NUMBER:"; 
      cin >> b; 
      c = a - b; 
      cout << endl << "ANSWER:" << c; 
      break; 
     case 3: // Multiplication code 
      cout << endl << "MULTIPLICATION" << endl << "FIRST NUMBER:"; 
      cin >> a; 
      cout << endl << "SECOND NUMBER:"; 
      cin >> b; 
      c = a * b; 
      cout << endl << "ANSWER:" << c; 
      break; 
     case 4: // Division code 
      cout << endl << "DIVISION" << endl << "FIRST NUMBER:"; 
      cin >> a; 
      cout << endl << "SECOND NUMBER:"; 
      cin >> b; 
      c = a/b; 
      cout << endl << "ANSWER:" << c; 
      break; 
     case 5: // Exit code 
      return 0; 


    } 

} 
+0

Я уверен, что 'SetConsoleTextAttribute' не является частью языка C++ – Amadeus

+0

Да, как @Amadeus сказал, что это будет часть консоли ... Какую консоль вы используете? –

+0

[Что вы пробовали?] (Http://mattgemmell.com/what-have-you-tried/) Вы читали документы? [Первая ссылка в поиске Google] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms686047%28v=vs.85%29.aspx) – Drop

ответ

2

Это решение зависит от этих функций и структур WinAPI:

Код выглядит следующим образом:

HANDLE hCon; 
CONSOLE_SCREEN_BUFFER_INFO csbiScreenInfo; 
COORD coordStart = { 0, 0 }; // Screen coordinate for upper left 
DWORD dwNumWritten = 0;  // Holds # of cells written to 
           // by FillConsoleOutputAttribute 
DWORD dwScrSize; 
WORD wAttributes = BACKGROUND_BLUE | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED; 

hCon = GetStdHandle(STD_OUTPUT_HANDLE); 

// Get the screen buffer information including size and position of window 
if (!GetConsoleScreenBufferInfo(hCon, &csbiScreenInfo)) 
{ 
    // Put error handling here 
    return 1; 
} 
// Calculate number of cells on screen from screen size 
dwScrSize = csbiScreenInfo.dwMaximumWindowSize.X * csbiScreenInfo.dwMaximumWindowSize.Y; 
// Fill the screen with the specified attribute 
FillConsoleOutputAttribute(hCon, wAttributes, dwScrSize, coordStart, &dwNumWritten); 
// Set attribute for newly written text 
SetConsoleTextAttribute(hCon, wAttributes); 

Вводных комментариев должно быть достаточно, чтобы понять основы того, что происходит с прилагаемыми ссылками документации. Мы получаем размер экрана с GetConsoleScreenBufferInfo и используем это, чтобы определить количество ячеек на экране для обновления с новым атрибутом с помощью FillConsoleOutputAttribute. Затем мы используем SetConsoleTextAttribute, чтобы весь текст, который печатался, соответствовал атрибуту, который использовался для окрашивания всего экрана консоли.

Для краткости я кончил проверку ошибок для звонков в FillConsoleOutputAttribute и SetConsoleTextAttribute. Я поместил заглушку для обработки ошибок для GetConsoleScreenBufferInfo. Я оставляю это как упражнение для оригинального плаката, чтобы добавить соответствующую обработку ошибок, если они этого захотят.

+0

Большое спасибо, что я действительно новичок в C++, и это помогло многим надеяться, что я не вызвал слишком много проблем со всей недопониманием, и я новичок в переполнении стека тоже, я попытался вставить свой код, и это выглядело как беспорядочный mess снова спасибо – Somperson99

+0

Нет проблем, я немного убрал ваш вопрос. Добро пожаловать в SO! –

1

SetConsoleTextAttribute изменяет атрибут для новых символов, которые вы пишете в консоли, но не влияет на существующие содержимое консоли.

Если вы хотите изменить атрибуты для существующих символов, которые уже отображаются на консоли, используйте вместо этого WriteConsoleOutputAttribute.

+0

Я бы хотел, чтобы весь экран отображался даже там, где нет текста. – Somperson99

+0

@ Somperson99: Позвольте мне сказать так: хотя я не разбирал его, чтобы проверить, мне кажется, что 'color xx', вероятно, использует' WriteConsoleOutputAttribute '(вероятно, вместе с' SetConsoleTextAttribute', поэтому, когда вы пишете больше текста, он отображается в том же цвете). –