1. 程式人生 > >用VC++實現Console程式顯示彩色文字

用VC++實現Console程式顯示彩色文字

  用vc++寫console程式時,整天對著黑紙白字的螢幕,感覺很鬱悶吧?很多人想用CONIO.H/GRAPHICS.H中的一些函式來實現,卻發現VC++根本沒有這些標頭檔案。當然了CONIO.H/GRAPHICS.H是BORLAND TC/BC專有的標頭檔案,所以vc++中根本沒有這些檔案。把這兩個標頭檔案COPY過來,然後用??答案當然是否定的。其實VC++中也有相關的函式來實現console彩色文字及背景的顯示。下面我們就看看VC++如何實現彩色文字。

   在vc++用API函式GetStdHandle()和SetConsoleTextAttribute()來實現彩色背景及彩色文字。下面說一下這兩個函式宣告及其引數的含義。首先說GetStdHandle(),其宣告如下

HANDLE GetStdHandle(
 DWORD nStdHandle
);

  
   GetStdHandle()返回標準的輸入、輸出或錯誤的裝置的控制代碼,也就是獲得輸入、輸出/錯誤的螢幕緩衝區的控制代碼。 其引數nStdHandle的值為下面幾種型別的一種:

值        含義
STD_INPUT_HANDLE 標準輸入的控制代碼
STD_OUTPUT_HANDLE 標準輸出的控制代碼
STD_ERROR_HANDLE 標準錯誤的控制代碼

  函式SetConsoleTextAttribute()的作用是在console程式設定輸入或輸出文字的文字顏色和背景顏色。只有在此函式設定後才能顯示彩色的文字。其函式原型為:

BOOL SetConsoleTextAttribute(
  HANDLE hConsoleOutput, // console 螢幕緩衝區的控制代碼
  WORD wAttributes // 文字及背景的顏色
);
  
   如果函式設定文字及背景顏色成功,則返回非零;如失敗返回零。其引數含義如下:

   hConsoleOutput------------- console 螢幕緩衝區的控制代碼。
   WORD wAttributes-----------文字及背景的顏色。

  其文字與背景顏色可以是 FOREGROUND_BLUE, FOREGROUND_GREEN, FOREGROUND_RED, FOREGROUND_INTENSITY, BACKGROUND_BLUE, BACKGROUND_GREEN, BACKGROUND_RED, and BACKGROUND_INTENSITY.和用這幾種顏色組合成的任意一種顏色(這一點有點類似於RGB)至於如何組合,我不知道 。

  下面,我們就來寫一個類似又TC下settextcolor相似功能的函式SetColor(),不過下面的函式可以同時設定背景顏色,函式的實現如下:

void SetColor(unsigned short ForeColor,unsigned short BackGroundColor)
{
  HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
  //獲得緩衝區控制代碼
  SetConsoleTextAttribute(hCon,ForeColor BackGroundColor);
  //設定文字及背景顏色
};

   有了上面的函式我們就可以實現彩色文字和背景了,給自己的程式一個與眾不同的輸出和提示。下面我們來實現一個彩色的Hello World!。程式如下:

#include
  //GetStdHandle和SetConsoleTextAttribute在標頭檔案windows.h中
  #include
  using namespace std;
  void SetColor(unsigned short ForeColor=4,unsigned short BackGroundColor=0)
  //給引數預設值,使它  
  //可以接受0/1/2個引數
  {
   HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //本例以輸出為例
   SetConsoleTextAttribute(hCon,ForeColor BackGroundColor);
  };

  int main()
  {

   SetColor();
   std::cout<<"Hello world!"<   SetColor(40,30);
   std::cout<<"Hello world!"<   return 0;
  }

   這樣一個彩色的Hello world!程式就寫好了。

   當然,你可以用這個函式讓在你的程式在適當的地方顯示一些特殊的輸出或提示資訊,這樣你的程式就“與眾不同”了。