繁体   English   中英

C ++:将背景色与clrscr()一起使用

[英]C++ : Using background colors with clrscr()

我目前正在制作一个简单的游戏。 初始屏幕是欢迎屏幕,其中包含以下颜色:

system("color f3")//background:white , text:aqua

然后当我从main()函数调用以下内容时

void display()
{

    Sleep(2000);
    clrscr();
    system("color f3");
    cout<<"Levels:\n\n";
    int d;
    cout<<"1.Easy\n";
    cout<<"2.Medium\n";
    cout<<"3.Hard\n";
    cout<<"4.Insane!\n";
    cout<<"Choose your difficulty:";
    cin>>d;
}

没有声明system("color f3"); 在我的display() ,背景为黑色,文本以白色突出显示,文本颜色为浅绿色。

在此处输入图片说明

我想知道为什么会发生上述情况。

问题:

用语句system("color f3"); 调用clrscr() ,屏幕将变黑几毫秒,然后变成白色和浅绿色。

那么,如何在几毫秒内防止屏幕变黑?

感谢你的帮助:)

调用system() ,将在另一个进程中启动命令处理器,从而更改屏幕设置。

以后调用clrscr()库清除将使用其在启动时存储的自己的颜色来清除屏幕。 这就是您遇到问题的原因。

您可以改为直接使用Windows控制台API ,例如函数SetConsoleTextAttribute()

#include <windows.h>
...
   SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                        BACKGROUND_INTENSITY|FOREGROUND_BLUE); 

注意:颜色和强度可以根据需要与|组合| 在您的情况下,您可以简单地编写0xf3

顺便说一句, 这个SO问题显示了其他有趣的本机Windows控制台API函数。

由于您正在制作游戏,因此您想在游戏中编写自己的函数,而不必调用SYSTEM( ) 它真的没有那么困难,这里是一个示例代码。

在此处输入图片说明

#include <windows.h> 
#include <iostream>

using namespace std;


void gotoxy(int x, int y);
void setcolor(WORD color);
void setForeGroundAndBackGroundColor(int ForeGroundColor,int BackGroundColor);
void clrbox(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char bkcol);
void putbox(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col, unsigned char col2,unsigned char bkcol,char text_[]);
void box(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col,unsigned char col2,char text_[]);

void clrscr(); 

int main()
{
     setcolor(31);
     clrbox(1,1,79,23,33);
     gotoxy(10,12);

     setForeGroundAndBackGroundColor(2,14);
     cout<<" Hello world ";
     setcolor(7);
     gotoxy(1,23);

  return 0;
}







void gotoxy(int x, int y)
{
    COORD coord;
    coord.X = x; coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
    return;
}

void setcolor(WORD color)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
    return;
}


//
//     colors:
//     0 = Black
//     1 = Blue
//     2 = Green
//     3 = Cyan
//     4 = Red
//     5 = Magenta
//     6 = Yellow
//     7 = LightGray
//     8 = DarkGray
//     9 = LightBlue
//     10 = LightGreen
//     11 = LightCyan
//     12 = LightRed
//     13 = LightMagenta
//     14 = LightYellow
//     15 = White



void setForeGroundAndBackGroundColor(int ForeGroundColor,int BackGroundColor)
{
   int color=16*BackGroundColor+ForeGroundColor;
   setcolor(color);
}



void clrscr()
{
    COORD coordScreen = { 0, 0 };
    DWORD cCharsWritten;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD dwConSize;
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    GetConsoleScreenBufferInfo(hConsole, &csbi);
    dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
    FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten);
    GetConsoleScreenBufferInfo(hConsole, &csbi);
    FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
    SetConsoleCursorPosition(hConsole, coordScreen);
    return;
}

void clrbox(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char bkcol)
{
    int x,y;
    setcolor(bkcol);                       //Set to color bkcol

    for (y=y1;y<y2;y++)                    //Fill Y Region Loop
    {
        for (x=x1;x<x2;x++)               //Fill X region Loop
        {
          gotoxy(x,y);cout<<" ";       //Draw Solid space
        }
    }
}


void box(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col,unsigned char col2,char text_[])
{  unsigned i,j,m;
    {

       m=(sx-x);                       //differential
       j=m/8;                          //adjust
       j=j-1;                          //more adjustment
       gotoxy(x,y);cout<<"É";       //Top left corner of box
       gotoxy(sx,y);cout<<"»";      //Top right corner of box
       gotoxy(x,sy);cout<<"È";      //Bottom left corner of box
       gotoxy(sx,sy);cout<<"¼";     //Bottom right corner of box

       for (i=x+1;i<sx;i++)
       {
          gotoxy(i,y);cout<<"Í";     // Top horizontol line
          gotoxy(i,sy);cout<<"Í";    // Bottom Horizontal line
       }

       for (i=y+1;i<sy;i++)
       {
          gotoxy(x,i);cout<<"º";     //Left Vertical line
          gotoxy(sx,i);cout<<"º";    //Right Vertical Line
       }

          gotoxy(x+j,y);cout<<text_; //put Title
          gotoxy(1,24);
    }
}

void putbox(unsigned x,unsigned y,unsigned sx,unsigned sy,
         unsigned char col, unsigned char col2,unsigned char bkcol,char text_[])
{
    clrbox(x,y,sx,sy,bkcol);
    box(x,y,sx,sy,col,col2,text_);
}

调用system()函数可强制终端启动外部进程。 system()调用可能不是您想要的。 在Windows上的conio.h库或linux中的ncurses包中尝试一些功能。 它们具有更好的功能来更改文本和颜色。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM