很简单,MSDN上写得也很清楚
我仔细说明一下SetConsoleTextAttribute的第二个参数
它是一个WORD型的变量,其实就是一个unsigned shot型
范围为0~65535
当值超过它时自己会出警告
warning C4305: 'argument' : truncation from 'const int' to 'unsigned short'
编辑器将进行隐式类型转换,只取低十六位
具体我就不说了
具体说一下各种数不同颜色问题。
首先我们来写一段程序
printf("%d\n",FOREGROUND_BLUE);
printf("%d\n",FOREGROUND_GREEN);
printf("%d\n",FOREGROUND_RED);
printf("%d\n",FOREGROUND_INTENSITY);
printf("%d\n",BACKGROUND_BLUE);
printf("%d\n",BACKGROUND_GREEN);
printf("%d\n",BACKGROUND_RED);
printf("%d\n",BACKGROUND_INTENSITY);
通过输出,我们可以清楚地看到每个值对应的十进值数是多少
分别为1 2 4 8 16 32 64 128
即这个函数是靠一个字节的低四来控制前景色,高四位来控制背景色
低八位分别对应:
前景蓝,绿,红,高亮,背景蓝,绿,红,高亮。
我们可以通过或运算符来将这些属性叠加,即1到255都是我们控制之内的颜色。
到这里应该明白吧?
如果明白了我上面所说的,你可以接着往下看。
新的问题又出现了
我们知道低八位的每一个数都代表什么了,但高八位又都有什么意义呢?
即266到65535这些数又会显示出什么呢?
MSDN上是不会写这些的
怎么办?答案是靠我们自己。
我是这样来实验的
写以下程序:
#include <windows.h>
#include <winnt.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
HANDLE consolehwnd;
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);
int i=0;
SetConsoleTextAttribute(consolehwnd,i);
printf("i am dadalili!\n");
for(i=1;i<65536;i*=2)
{
SetConsoleTextAttribute(consolehwnd,i);
printf("i am dadalili!\n");
}
SetConsoleTextAttribute(consolehwnd,255);//因为最后一行被设为透明,为了使大家能够//看得更清楚,我将Press any key to continue设为一行白
return 0;
}
这样就可以清楚地看出每个位代表输出的格式
下面将十六位对应的输出总结如下:
0透明1前景蓝2前景绿3前景红4前景高亮5背景蓝6背景绿7背景红8背景高亮
9透明10透明11上划线12左划线13右划线14右划线15透明16透明
至此,我们已经可以预见到任何一个数输出的形式!
我仔细说明一下SetConsoleTextAttribute的第二个参数
它是一个WORD型的变量,其实就是一个unsigned shot型
范围为0~65535
当值超过它时自己会出警告
warning C4305: 'argument' : truncation from 'const int' to 'unsigned short'
编辑器将进行隐式类型转换,只取低十六位
具体我就不说了
具体说一下各种数不同颜色问题。
首先我们来写一段程序
printf("%d\n",FOREGROUND_BLUE);
printf("%d\n",FOREGROUND_GREEN);
printf("%d\n",FOREGROUND_RED);
printf("%d\n",FOREGROUND_INTENSITY);
printf("%d\n",BACKGROUND_BLUE);
printf("%d\n",BACKGROUND_GREEN);
printf("%d\n",BACKGROUND_RED);
printf("%d\n",BACKGROUND_INTENSITY);
通过输出,我们可以清楚地看到每个值对应的十进值数是多少
分别为1 2 4 8 16 32 64 128
即这个函数是靠一个字节的低四来控制前景色,高四位来控制背景色
低八位分别对应:
前景蓝,绿,红,高亮,背景蓝,绿,红,高亮。
我们可以通过或运算符来将这些属性叠加,即1到255都是我们控制之内的颜色。
到这里应该明白吧?
如果明白了我上面所说的,你可以接着往下看。
新的问题又出现了
我们知道低八位的每一个数都代表什么了,但高八位又都有什么意义呢?
即266到65535这些数又会显示出什么呢?
MSDN上是不会写这些的
怎么办?答案是靠我们自己。
我是这样来实验的
写以下程序:
#include <windows.h>
#include <winnt.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
HANDLE consolehwnd;
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);
int i=0;
SetConsoleTextAttribute(consolehwnd,i);
printf("i am dadalili!\n");
for(i=1;i<65536;i*=2)
{
SetConsoleTextAttribute(consolehwnd,i);
printf("i am dadalili!\n");
}
SetConsoleTextAttribute(consolehwnd,255);//因为最后一行被设为透明,为了使大家能够//看得更清楚,我将Press any key to continue设为一行白
return 0;
}
这样就可以清楚地看出每个位代表输出的格式
下面将十六位对应的输出总结如下:
0透明1前景蓝2前景绿3前景红4前景高亮5背景蓝6背景绿7背景红8背景高亮
9透明10透明11上划线12左划线13右划线14右划线15透明16透明
至此,我们已经可以预见到任何一个数输出的形式!