由彩色helloworld引出的一个课堂随机提问中奖器

使用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();  
   
}

鼠标点击就可以暂停选出 名字
检测鼠标是否按下感谢这个博主

11.结束语: 博主今年大四,正在准备考研,有点忙,上面的这个点名神器是我在无聊的备考中自己瞎写着玩呢(有点幼稚,但是绝对是原创),还可以完善做出很多好玩的东西,就这样吧。

12.加强版,名字从文本文件中获取

加强版

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值