简体   繁体   English

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

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

I am currently making a simple game. 我目前正在制作一个简单的游戏。 The initial screen is the welcome screen with the following for color: 初始屏幕是欢迎屏幕,其中包含以下颜色:

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

then when I invoke the following from my main() function 然后当我从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;
}

without the statement system("color f3"); 没有声明system("color f3"); in my display() the background is black, the text gets highlighted in white and the text color is aqua. 在我的display() ,背景为黑色,文本以白色突出显示,文本颜色为浅绿色。

在此处输入图片说明

I want to know why the above happens. 我想知道为什么会发生上述情况。

Problem: 问题:

with the statement system("color f3"); 用语句system("color f3"); when the clrscr() is invoked, the screen turns black for a few milliseconds and then turns to white and aqua. 调用clrscr() ,屏幕将变黑几毫秒,然后变成白色和浅绿色。

So how to prevent the screen to turn black for those few milliseconds? 那么,如何在几毫秒内防止屏幕变黑?

Thanks for all your help:) 感谢你的帮助:)

When you call system() , you lauch a command processor in another process, which changes the screen settings. 调用system() ,将在另一个进程中启动命令处理器,从而更改屏幕设置。

When you later call clrscr() your library clears uses its own colors that it stored at startup to clear the screen. 以后调用clrscr()库清除将使用其在启动时存储的自己的颜色来清除屏幕。 THis is why you experience the problem. 这就是您遇到问题的原因。

You could instead use directly windows console API , for example the function SetConsoleTextAttribute() : 您可以改为直接使用Windows控制台API ,例如函数SetConsoleTextAttribute()

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

Note: The colors and intensity can be combined as needed with | 注意:颜色和强度可以根据需要与|组合| . In your case you could simply write 0xf3 在您的情况下,您可以简单地编写0xf3

By the way, this SO question shows other native windows console API functions that could be of interest. 顺便说一句, 这个SO问题显示了其他有趣的本机Windows控制台API函数。

Since you're making a game, you'd want to write your own functions ingame and not have to call SYSTEM( ) . 由于您正在制作游戏,因此您想在游戏中编写自己的函数,而不必调用SYSTEM( ) its really not that difficult, heres an example code. 它真的没有那么困难,这里是一个示例代码。

在此处输入图片说明

#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_);
}

Calling system() functions forces the terminal to launch an external process. 调用system()函数可强制终端启动外部进程。 system() calls may not be what you're looking for. system()调用可能不是您想要的。 Try some functions from the conio.h library on windows or the ncurses package in linux. 在Windows上的conio.h库或linux中的ncurses包中尝试一些功能。 They have much better functions for changing text and colors. 它们具有更好的功能来更改文本和颜色。

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

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