用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 <windows.h>
//GetStdHandle和SetConsoleTextAttribute在头文件windows.h中
#include <iostream>
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!"<<endl
SetColor(40,30)
std::cout<<"Hello world!"<<endl
return 0
}
这样一个彩色的Hello world!程序就写好了。
当然,你可以用这个函数让在你的程序在适当的地方显示一些特殊的输出或提示信息,这样你的程序就“与众不同”了。
一般是不可以的。编译程序的时候,一般分为两部分,严格说来,是分为三部分的。
首先是把C++代码编译成汇编代码,实现此步骤的工具,称为C++编译器;
然后是把汇编代码编译成机器代码,实现此步骤的工具,称为汇编器;
最后是把编译好的程序,链接起来,实现此步骤的工具,称为链接器。
某些编译器把第一步和第二步整合在一起了。
这三步使用的工具,应该是配套的,如果不配套,至少要相互兼容。
如果编辑器要使用这些工具,必须也要配套,主要是传递的参数要兼容。
你用gcc编译出来的汇编语言,是as汇编,指令后面跟的源和目的,和某些汇编语法格式是相反的,那么在进行第二步的时候,会出错。
又比如,你的编辑器在调用编译器的时候,会加入某个参数,但你更改后的编译器,未必会支持该参数。
所以,要换就全部都换,配套地换。不换就一个都不换。否则很可能会有许多莫名的问题。
有些编程平台省了一些库。建议把TC3.0中的dir.h拷贝到dev-c++的库文件夹,把TC3.0的dir.lib拷贝到dev-c++的lib文件夹就可以了。
如果没有dir.lib就算了,只拷贝dir.h试一下
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)