2012-02-21 98 views
0

可能重複:
Colorize stdout output to Windows cmd.exe from console C++ app如何在Windows上使用代碼塊在C++中輸出彩色文本?

我使用的代碼塊在Windows XP和我需要一種方法來輸出彩色文本,也許改變背景顏色,以及在控制檯應用。
我嘗試了conio.h函數,但它們似乎與代碼塊不兼容。

+0

出於好奇,你爲什麼改變答案? – 2012-02-21 16:41:26

+0

Im kind of noobish。我認爲你可以接受幾個答案:D.So然後我意識到,我選擇了短代碼。我的程序已經有4000代碼行(真的),我不想添加到其中許多。而且我也想了解我的代碼是什麼。你們很難消化,因爲我不是高級程序員。 – Mihai 2012-02-21 16:45:19

回答

1

它看起來像你會想要使用一些Windows API功能來實現這一點。
如果你使用Cygwin的Windows,它會更容易一些。

這裏的an example禮貌daniweb的:

// color your text in Windows console mode 
// colors are 0=black 1=blue 2=green and so on to 15=white 
// colorattribute = foreground + background * 16 
// to get red text on yellow use 4 + 14*16 = 228 
// light red on yellow would be 12 + 14*16 = 236 
// a Dev-C++ tested console application by vegaseat 07nov2004 

#include <iostream> 
#include <windows.h> // WinApi header 

using namespace std; // std::cout, std::cin 

int main() 
{ 
    HANDLE hConsole; 
    int k; 

    hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 

    // you can loop k higher to see more color choices 
    for(k = 1; k < 255; k++) 
    { 
     // pick the colorattribute k you want 
     SetConsoleTextAttribute(hConsole, k); 
     cout << k << " I want to be nice today!" << endl; 
    } 

    cin.get(); // wait 
    return 0; 
} 
+0

Thx代碼:D – Mihai 2012-02-21 16:25:04

2

這段代碼可以幫助:

WinConsole.h

#pragma once 

typedef void* HANDLE; 

class WinConsole 
{ 
public: 
    WinConsole(void); 
    ~WinConsole(void); 

    void SetColour(WORD colour); 

    WORD GetDefaultColour() const; 

    void Reset(); 
private: 
    HANDLE fConsoleHandle; 
    CONSOLE_SCREEN_BUFFER_INFO fDefaultScreenBufferInfo; 
}; 

WinConsole.cpp

#include "WinConsole.h" 
#define WIN32_LEAN_AND_MEAN 
#define <Windows.h> 

WinConsole::WinConsole(void) 
{ 
    fConsoleHandle = ::GetStdHandle(STD_OUTPUT_HANDLE); 
    if (INVALID_HANDLE_VALUE != fConsoleHandle) 
    { 
     ::GetConsoleScreenBufferInfo(fConsoleHandle, &fDefaultScreenBufferInfo); 
    } 
} 

WinConsole::~WinConsole(void) 
{ 
} 

void WinConsole::SetColour(WORD colour) 
{ 
    if (INVALID_HANDLE_VALUE != fConsoleHandle) 
    { 
     ::CONSOLE_SCREEN_BUFFER_INFO info = { sizeof(CONSOLE_SCREEN_BUFFER_INFO), 0 }; 
     if(::GetConsoleScreenBufferInfo(fConsoleHandle, &info)) 
     { 
      ::SetConsoleTextAttribute(fConsoleHandle, (info.wAttributes & 0xff00)|colour); 
     } 
    } 
} 

void WinConsole::Reset() 
{ 
    if (INVALID_HANDLE_VALUE != fConsoleHandle) 
    { 
     ::SetConsoleTextAttribute(fConsoleHandle, fDefaultScreenBufferInfo.wAttributes); 
    } 
} 

WORD WinConsole::GetDefaultColour() const 
{ 
    if (INVALID_HANDLE_VALUE != fConsoleHandle) 
    { 
     return (WORD)(fDefaultScreenBufferInfo.wAttributes & 0x00ff); 
    } 
    return e_FGRed | e_FGGreen | e_FGBlue; 
} 

用法:

WinConsole console; 
console.SetColour(FOREGROUND_RED|BACKGROUND_BLUE); // Superman style ;) 
+0

Thx很多。你真的在這一個工作。 – Mihai 2012-02-21 16:25:53

+0

不客氣:) – 2012-02-21 16:27:39