使用window api 打印彩色的 helloworld
1.直接上代码:
//打印彩色的helloworld
#include <windows.h>
//GetStdHandle和SetConsoleTextAttribute在头文件windows.h中
#include <iostream>
using namespace std;
void SetColor(unsigned short ForeColor=3,unsigned short BackGroundColor=0){
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //得到句柄
//GetStdHandle()它用于从一个特定的标准设备(标准输入、标准输出或标准错误)中取得一个句柄(用来标识不同设备的数值),
//可以传入三个参数,STD_OUTPUT_HANDLE 表示标准输出的句柄
COORD pos={50,10};
SetConsoleCursorPosition(hCon,pos);//SetConsoleCursorPosition()是API中定位光标位置的函数。
SetConsoleTextAttribute(hCon,ForeColor|BackGroundColor);//设置控制台文字属性
}
int main(){
SetColor(10);
std::cout<<"Hello world!"<<endl;
getchar();
return 0;
}
2.直接上效果:
3.分析代码:
4.参考链接:GetStdHandle() 函数的用法
5. 我们稍微封装一下 SetColor 函数,让他实现能够在指定位置,打印指定颜色的字体,封装后的代码如下
//打印彩色的helloworld
#include <windows.h>
//GetStdHandle和SetConsoleTextAttribute在头文件windows.h中
#include <iostream>
using namespace std;
/*
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
*/
//在指定位置打印 指定颜色的 字体, 第一个参数 为 位置参数, 第二个参数为 颜色
void SetColor(COORD pos,unsigned short ForeColor=3){
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //得到句柄
//GetStdHandle()它用于从一个特定的标准设备(标准输入、标准输出或标准错误)中取得一个句柄(用来标识不同设备的数值),
//可以传入三个参数,STD_OUTPUT_HANDLE 表示标准输出的句柄
//COORD pos={50,10};
SetConsoleCursorPosition(hCon,pos);//SetConsoleCursorPosition()是API中定位光标位置的函数。
SetConsoleTextAttribute(hCon,ForeColor);//设置控制台文字属性
}
int main(){
COORD pos1={50,10};
COORD pos2={50,15};
COORD pos3={50,20};
SetColor(pos1,4);
std::cout<<"Hello world!"<<endl;
SetColor(pos2,2);
std::cout<<"Hello world!"<<endl;
SetColor(pos3,1);
std::cout<<"Hello world!"<<endl;
getchar();
return 0;
}
其中颜色可以混合搭配,符合三色混合定律
/*
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
*/
运行的效果如下:
6.花里胡哨之不断改变字体的颜色
//打印彩色的helloworld
#include <windows.h>
//GetStdHandle和SetConsoleTextAttribute在头文件windows.h中
#include <iostream>
using namespace std;
/*
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
*/
//在指定位置打印 指定颜色的 字体, 第一个参数 为 位置参数, 第二个参数为 颜色
void SetColor(COORD pos,unsigned short ForeColor=3){
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //得到句柄
//GetStdHandle()它用于从一个特定的标准设备(标准输入、标准输出或标准错误)中取得一个句柄(用来标识不同设备的数值),
//可以传入三个参数,STD_OUTPUT_HANDLE 表示标准输出的句柄
//COORD pos={50,10};
SetConsoleCursorPosition(hCon,pos);//SetConsoleCursorPosition()是API中定位光标位置的函数。
SetConsoleTextAttribute(hCon,ForeColor);//设置控制台文字属性
}
int main(){
COORD pos1={50,10};
COORD pos2={50,15};
COORD pos3={50,20};
COORD pos4={0,0};
int i=0;//控制颜色
while(1){
SetColor(pos1,i);
std::cout<<"Hello world!"<<endl;
Sleep(500);
i++;
if(i==10){
i=1;
}
}
/*
SetColor(pos2,2);
std::cout<<"Hello world!"<<endl;
SetColor(pos3,1);
std::cout<<"Hello world!"<<endl;
*/
getchar();
}
效果如下:
7.花里胡哨之 彩色helloworld 横向移动
//打印彩色的helloworld
#include <windows.h>
//GetStdHandle和SetConsoleTextAttribute在头文件windows.h中
#include <iostream>
using namespace std;
/*
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
*/
//在指定位置打印 指定颜色的 字体, 第一个参数 为 位置参数, 第二个参数为 颜色
void SetColor(COORD pos,unsigned short ForeColor=3){
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //得到句柄
//GetStdHandle()它用于从一个特定的标准设备(标准输入、标准输出或标准错误)中取得一个句柄(用来标识不同设备的数值),
//可以传入三个参数,STD_OUTPUT_HANDLE 表示标准输出的句柄
//COORD pos={50,10};
SetConsoleCursorPosition(hCon,pos);//SetConsoleCursorPosition()是API中定位光标位置的函数。
SetConsoleTextAttribute(hCon,ForeColor);//设置控制台文字属性
}
int main(){
COORD pos1={50,10};
COORD pos2={50,15};
COORD pos3={50,20};
COORD pos4={0,0};
int i=0;//控制颜色
pos1.Y=10;
while(1){
for(int j=0;j<100;j++){
pos1.X=j;
SetColor(pos1,i++);
std::cout<<"Hello world!"<<endl;
system("CLS");
//Sleep(100);
if(i==10){
i=1;
}
}
}
/*
SetColor(pos2,2);
std::cout<<"Hello world!"<<endl;
SetColor(pos3,1);
std::cout<<"Hello world!"<<endl;
*/
getchar();
}
效果:
8. 终极花里胡哨(使用一个char students[][len]来存储学生的名字,使用random函数来随机产生一个数字作为下标,通过这个下标来访问学生数组,从而选出幸运观众,random函数一直不停的产生随机数,屏幕上根据产生的随机数来打印它对应的姓名,知道有人按下暂停键,才能选出最后一次的随机数所对应的同学):
我的思考(后来发现了一个_kbhit()函数只需要把它放在while循环的条件语句中就可以完成这个功能,所以我放弃了昨天的这个方案)
开一独立线程来监听 外界的键盘或者鼠标事件,一旦有消息产生则就通知主线程不再滚动弹幕,打印出最后一次选中的同学
遇到的问题:
鼠标点击事件产生是printf函数不能够正常打印,并找到解决方案
9.打印不同颜色的名字
//打印彩色的helloworld
#define Kong 32
#include <windows.h>
//GetStdHandle和SetConsoleTextAttribute在头文件windows.h中
#include <iostream>
#include <ctime>
#include <conio.h>
#include <cstdlib>
using namespace std;
/*
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
*/
//在指定位置打印 指定颜色的 字体, 第一个参数 为 位置参数, 第二个参数为 颜色
void SetColor(COORD pos,unsigned short ForeColor=3){
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //得到句柄
//GetStdHandle()它用于从一个特定的标准设备(标准输入、标准输出或标准错误)中取得一个句柄(用来标识不同设备的数值),
//可以传入三个参数,STD_OUTPUT_HANDLE 表示标准输出的句柄
//COORD pos={50,10};
SetConsoleCursorPosition(hCon,pos);//SetConsoleCursorPosition()是API中定位光标位置的函数。
SetConsoleTextAttribute(hCon,ForeColor);//设置控制台文字属性
}
void hidden()//隐藏光标,不让光标显示
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hOut, &cci);
cci.bVisible = 0;//赋1为显示,赋0为隐藏
SetConsoleCursorInfo(hOut, &cci);
}
int main(){
COORD pos1={50,10};
COORD pos2={50,15};
COORD pos3={50,20};
COORD pos4={0,0};
int i=0;//控制颜色
pos1.Y=10;
char p,a;
char students[][20]={"wanger","wangxiaoming","lisi","mazi","hello","good","lihua","mayun","wudalang","liqiang"};
char students2[][20]={"张三","李四","王二","王小明","张大力","史强","小强","王浩","李晓霞","李贺"};
int t;
srand(time(0)); //seed
string temp;
while(1){
for(int j=0;j<100;j++){
pos1.X=j;
SetColor(pos1,i++);
t = rand() % 10+ 1; // random number 1-10
temp=students[t];
hidden();
cout <<" " <<temp<<" " << endl;
system("CLS");
// Sleep(50);
if(i==10){
i=1;
}
}
}
getchar();
}
10.点名神器(跑起来之后按空格键暂停就会随机选出一位同学的名字。可以通过修改students数组中的值进而添加或者删除同学名字):
//打印彩色的helloworld
#define Kong 32
#include <windows.h>
//GetStdHandle和SetConsoleTextAttribute在头文件windows.h中
#include <iostream>
#include <ctime>
#include <conio.h>
#include <cstdlib>
using namespace std;
/*
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
*/
//在指定位置打印 指定颜色的 字体, 第一个参数 为 位置参数, 第二个参数为 颜色
void SetColor(COORD pos,unsigned short ForeColor=3){
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //得到句柄
//GetStdHandle()它用于从一个特定的标准设备(标准输入、标准输出或标准错误)中取得一个句柄(用来标识不同设备的数值),
//可以传入三个参数,STD_OUTPUT_HANDLE 表示标准输出的句柄
//COORD pos={50,10};
SetConsoleCursorPosition(hCon,pos);//SetConsoleCursorPosition()是API中定位光标位置的函数。
SetConsoleTextAttribute(hCon,ForeColor);//设置控制台文字属性
}
void hidden()//隐藏光标,不让光标显示
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hOut, &cci);
cci.bVisible = 0;//赋1为显示,赋0为隐藏
SetConsoleCursorInfo(hOut, &cci);
}
int main(){
COORD pos1={50,10};
COORD pos2={50,10};
COORD pos3={50,20};
COORD pos4={0,0};
int i=0;//控制颜色
pos1.Y=10;
char p,a;
char students[][20]={"wanger","wangxiaoming","lisi","mazi","hello","good","lihua","mayun","wudalang","liqiang"};
char students2[][20]={"张三","李四","王二","王小明","张大力","史强","小强","王浩","李晓霞","李贺"};
int t;
srand(time(0)); //seed
string temp;
while(1){
for(int j=0;j<100;j++){
pos1.X=j;
SetColor(pos1,i++);
t = rand() % 10+ 1; // random number 1-10
temp=students[t];
hidden();
cout <<" " <<temp<<" " << endl;
system("CLS");
while (_kbhit())
{
if ((p = _getch()) == -32) p = _getch();
if(p==Kong){
SetColor(pos2,4);
cout<<temp<<endl;
system("pause");
break;
}
}
if(i==10) i=1;
}
}
getchar();
}
11.带背景色的 点名神器,更有感觉
//打印彩色的helloworld
#define Kong 32
#include <windows.h>
//GetStdHandle和SetConsoleTextAttribute在头文件windows.h中
#include <iostream>
#include <ctime>
#include <conio.h>
#include <cstdlib>
#include <string.h>
#include <string>
using namespace std;
/*
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
*/
//在指定位置打印 指定颜色的 字体, 第一个参数 为 位置参数, 第二个参数为 颜色
void SetColor(COORD pos,unsigned short ForeColor=3){
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //得到句柄
//GetStdHandle()它用于从一个特定的标准设备(标准输入、标准输出或标准错误)中取得一个句柄(用来标识不同设备的数值),
//可以传入三个参数,STD_OUTPUT_HANDLE 表示标准输出的句柄
//COORD pos={50,10};
SetConsoleCursorPosition(hCon,pos);//SetConsoleCursorPosition()是API中定位光标位置的函数。
SetConsoleTextAttribute(hCon,ForeColor);//设置控制台文字属性
}
void hidden()//隐藏光标,不让光标显示
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hOut, &cci);
cci.bVisible = 0;//赋1为显示,赋0为隐藏
SetConsoleCursorInfo(hOut, &cci);
}
void increaseFontSize(){
CONSOLE_FONT_INFOEX cfi;
cfi.cbSize = sizeof cfi;
cfi.nFont = 0;
cfi.dwFontSize.X = 10; //大小设置
cfi.dwFontSize.Y = 10;
cfi.FontWeight = FW_THIN;
//wcscpy_s(cfi.FaceName, L"Raster");//点阵字体
SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
}
int main(){
COORD pos1={50,10};
COORD pos2={50,10};
COORD pos3={50,20};
COORD pos4={0,0};
int i=0;//控制颜色
pos1.Y=10;
char p,a;
char students[][20]={"danni","wangxiaoming","lisi","mazi","xiaojun","good","lihua","mayun","wudalang","liqiang"};
char students2[][20]={"张三","李四","王二","王小明","张大力","史强","小强","王浩","李晓霞","李贺"};
int t;
srand(time(0)); //seed
string temp;
int left,up;
while(1){
left= rand()%500;
t = rand() % 10; // random number 1-10
temp=students[t];
//pos2.X=left;
SetColor(pos2,left);
hidden();
// increaseFontSize();
cout <<" " <<temp<<" " << endl;
Sleep(20);
system("CLS");
while (_kbhit())
{
if ((p = _getch()) == -32) p = _getch();
if(p==Kong){
// increaseFontSize();
SetColor(pos2,2);
cout<<"stand up ..."<<temp<<endl;
system("pause");
break;
}
}
}
getchar();
}
鼠标点击就可以暂停选出 名字
检测鼠标是否按下感谢这个博主