数学建模社区-数学中国

标题: 用VC++实现console程序显示彩色文本 [打印本页]

作者: xShandow    时间: 2004-9-9 11:18
标题: 用VC++实现console程序显示彩色文本
<>用vc++写console程序时,整天对着黑纸白字的屏幕,感觉很郁闷吧?很多人想用CONIO.H/GRAPHICS.H中的一些函数来实现,却发现VC++根本没有这些头文件。当然了CONIO.H/GRAPHICS.H是BORLAND TC/BC专有的头文件,所以vc++中根本没有这些文件。把这两个头文件COPY过来,然后用??答案当然是否定的。其实VC++中也有相关的函数来实现console彩色文本及背景的显示。下面我们就看看VC++如何实现彩色文本。2 Y$ ~# C6 z7 a0 c- m4 C
     在vc++用API函数GetStdHandle()和SetConsoleTextAttribute()来实现彩色背景及彩色文本。下面说一下这两个函数声明及其参数的含义。首先说GetStdHandle(),其声明如下
( R, s1 {3 Y& g3 c$ C, C3 x$ f" P    HANDLE GetStdHandle(! k% \9 F+ O2 y' w4 `' R  g
          DWORD nStdHandle   
( E! o& W) ]' p$ x& |7 |       );
: V- ~# Q' ^9 t9 K. q5 i   GetStdHandle()返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄。 其参数nStdHandle的值为下面几种类型的一种:
  @2 I- l; e. D          值                         含义 & M/ b5 C( d7 P! \! _; r
       STD_INPUT_HANDLE           标准输入的句柄 + k: [2 A6 \+ l. Q1 c2 c& b
       STD_OUTPUT_HANDLE          标准输出的句柄
3 X5 D$ ?$ G0 O2 }       STD_ERROR_HANDLE           标准错误的句柄
3 P$ R" N8 N( m  c, E$ R函数SetConsoleTextAttribute()的作用是在console程序设置输入或输出文本的文本颜色和背景颜色。只有在此函数设置后才能显示彩色的文本。其函数原型为:
3 c/ O" B( c/ x- e* k) m   BOOL SetConsoleTextAttribute(- s  T' P6 e! H8 ?  _2 I
      HANDLE hConsoleOutput,  //  console 屏幕缓冲区的句柄
8 o& |8 O3 M* {9 G, u6 d      WORD wAttributes        // 文本及背景的颜色
0 u+ T( R$ o# A; K" l7 l   );$ Y3 [+ [6 _2 x$ u
如果函数设置文本及背景颜色成功,则返回非零;如失败返回零。其参数含义如下:# Y' E, m* g: r4 X. X2 G6 ^0 z
       hConsoleOutput------------- console 屏幕缓冲区的句柄。
4 ?# ~) E, k) ^' f8 P       WORD wAttributes-----------文本及背景的颜色。
: g$ ~% k+ ~/ Z" n其文本与背景颜色可以是 FOREGROUND_BLUE, FOREGROUND_GREEN, FOREGROUND_RED, FOREGROUND_INTENSITY, BACKGROUND_BLUE, BACKGROUND_GREEN, BACKGROUND_RED, and BACKGROUND_INTENSITY.和用这几种颜色组合成的任意一种颜色(这一点有点类似于RGB)至于如何组合,我不知道,^_^ 。
- w! I2 r! C) s: b& ?     下面,我们就来写一个类似又TC下settextcolor相似功能的函数SetColor(),不过下面的函数可以同时设置背景颜色,函数的实现如下:       , t' @5 I& _  j
void SetColor(unsigned short ForeColor,unsigned short BackGroundColor)
) X7 {$ |' x: V{
% S* Y) i  t* h1 y HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);            //获得缓冲区句柄- x8 c2 Y0 `% l- q5 ~/ H! w
SetConsoleTextAttribute(hCon,ForeColor|BackGroundColor);  //设置文本及背景颜色/ n  E6 s; p# N8 ~- h; Y4 A
}; + p9 ]7 S. {  N) K8 U
    有了上面的函数我们就可以实现彩色文本和背景了,给自己的程序一个与众不同的输出和提示。下面我们来实现一个彩色的Hello World!。程序如下:
; Z) P/ k5 E, }( W$ D. I    - Y; o) {9 }/ h$ r% n, P
#include&lt;windows.h&gt;        //GetStdHandle和SetConsoleTextAttribute在头文件windows.h中
5 B1 N2 j+ r- C- |' E#include&lt;iostream&gt;: s* ~6 O, @; U
using namespace std;</P>
2 z3 t8 f" ]% j) j; H6 F<>void SetColor(unsigned short ForeColor=4,unsigned short BackGroundColor=0) //给参数默认值,使它                                                                                                          //可以接受0/1/2个参数
' ?% I3 m* w! W{
, h& A3 w9 R' V  q8 t0 G( h. F( a HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);    //本例以输出为例/ Y1 y4 x$ J. K# \8 d3 w! u
SetConsoleTextAttribute(hCon,ForeColor|BackGroundColor); ) p6 g( ^  p0 g6 [* Q
}; </P>2 ]' G: b# `& T- L5 T9 G, J! ]' ^
<>int main()4 r) c. k  N* k: V/ o
{
8 a9 W9 G/ F3 J6 V/ `* n   
- k* y5 Q9 F4 c0 P7 U0 k SetColor();
( u( t/ l& T1 u0 _& w( {( o; y std::cout&lt;&lt;"Hello world!"&lt;&lt;endl;
& n* X, @) V7 P! s4 R* f# @8 i/ C SetColor(40,30);: Q8 Y& q% g8 D8 l
std::cout&lt;&lt;"Hello world!"&lt;&lt;endl;
- c6 Y" N7 R# q8 s return 0;
; |/ |7 I" _0 R! e& M. i' w3 ^( c}1 e( _3 U% @. x/ ^& y% X
这样一个彩色的Hello world!程序就写好了。* U+ z) R8 k& x- G: `& S: T$ y
</P>




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5