Ir ao conteúdo
  • Cadastre-se

C++ Tutorial: como colocar cor no C++


Posts recomendados

Aqui vai uma biblioteca para colocar cor no terminal do c++:

// color.hpp

// author: Tiago Cavalcante Trindade
// version: 1.0.3
// email: 
// access: https://www.clubedohardware.com.br/forums/topic/1396899-tutorial-como-colocar-cor-no-c/

#pragma once

#include <iostream>

using namespace std;

namespace style {
	enum FOREGROUND {
		fBLACK = 30, /* letra preta */
		fRED, /* letra vermelha */
		fGREEN, /* letra verde */
		fYELLOW, /* letra amarela */
		fBLUE, /* letra azul */
		fMAGENTA, /* letra magenta */
		fCYAN, /* letra ciano */
		fWHITE, /* letra branca */
		fBLACKs = 90, /* letra preta estrondosa */
		fREDs, /* letra vermelha estrondosa */
		fGREENs, /* letra verde estrondosa */
		fYELLOWs, /* letra amarela estrondosa */
		fBLUEs, /* letra azul estrondosa */
		fMAGENTAs, /* letra magenta estrondosa */
		fCYANs, /* letra ciana estrondosa */
		fWHITEs, /* letra branca estrondosa */
	};
	enum BACKGROUND {
		bBLACK = 40, /* fundo preto */
		bRED, /* fundo vermelho */
		bGREEN, /* fundo verde */
		bYELLOW, /* fundo amarelo */
		bBLUE, /* fundo azul */
		bMAGENTA, /* fundo magenta */
		bCYAN, /* fundo ciano */
		bWHITE, /* fundo branco */
		bBLACKs = 100, /* fundo preto estrondoso */
		bREDs, /* fundo vermelho estrondoso */
		bGREENs, /* fundo verde estrondoso */
		bYELLOWs, /* fundo amarelo estrondoso */
		bBLUEs, /* fundo azul estrondoso */
		bMAGENTAs, /* fundo magenta estrondoso */
		bCYANs, /* fundo ciano estrondoso */
		bWHITEs /* fundo branco estrondoso */
	};
	enum STYLE {
		sRESET = 0, /* estilo de letra padrão */
		sBOLD, /* cor da letra fica mais forte */
		sUNDERLINE = 4, /* sublinhado */
		sINVERSE = 7, /* inverte a cor do fundo com a cor da letra */
	};
}

namespace color {
	/*escreve um texto em determinada cor*/
	void coutc(const char* text, style::FOREGROUND foreground) {
		cout << "[" << foreground << "m" << text << "[0m";
	}
	/*escreve um texto com determinada cor de fundo*/
	void coutc(const char* text, style::BACKGROUND foreground) {
		cout << "[" << foreground << "m" << text << "[0m";
	}
	/*escreve um texto com determinada estilo*/
	void coutc(const char* text, style::STYLE style) {
		cout << "[" << style << "m" << text << "[0m";
	}
	/*escreve um texto em determinada cor e com determinada cor de fundo*/
	void coutc(const char* text, style::FOREGROUND foreground,  style::BACKGROUND background) {
		cout << "[" << foreground << "m[" << background << "m" << text << "[0m";
	}
	/*escreve um texto em determinada cor e com determinado estilo*/
	void coutc(const char* text, style::FOREGROUND foreground, style::STYLE style) {
		cout << "[" << foreground << "m[" << style << "m" << text << "[0m";
	}
	/*escreve um texto com determinada cor de fundo e com determinado estilo*/
	void coutc(const char* text, style::BACKGROUND background, style::STYLE style) {
		cout << "[" << background << "m[" << style << "m" << text << "[0m";
	}
	/*escreve um texto em determinada cor e com determinada cor de fundo e em determinado estilo*/
	void coutc(const char* text, style::FOREGROUND foreground, style::BACKGROUND background, style::STYLE style) {
		cout << "[" << foreground << "m[" << background << "m[" << style << "m" << text << "[0m";
	}
}

Aqui está um exemplo de como usar:

// exemplo.cpp

#include "color.hpp"

int main() {
	color::coutc("Teste", style::fRED);
	color::coutc("Teste", style::fGREENs, style::bWHITE);
	color::coutc("Teste", style::fBLUE, style::bBLACK, style::sUNDERLINE);
	return 0;
}

Aqui estão as cores da letra:

    fBLACK = letra preta
    fRED = letra vermelha
    fGREEN = letra verde
    fYELLOW = letra amarela

    fBLUE = letra azul
    fMAGENTA = letra magenta
    fCYAN = letra ciano
    fWHITE = letra branca
    fBLACKs = letra preta estrondosa
    fREDs = letra vermelha estrondosa
    fGREENs = letra verde estrondosa
    fYELLOWs = letra amarela estrondosa
    fBLUEs = letra azul estrondosa
    fMAGENTAs = letra magenta estrondosa
    fCYANs = letra ciana estrondosa
    fWHITEs = letra branca estrondosa

Aqui estão as cores para o fundo:

    bBLACK = fundo preto
    bRED = fundo vermelho
    bGREEN = fundo verde
    bYELLOW = fundo amarelo
    bBLUE = fundo azul
    bMAGENTA = fundo magenta
    bCYAN = fundo ciano
    bWHITE = fundo branco
    bBLACKs = fundo preto estrondoso
    bREDs = fundo vermelho estrondoso
    bGREENs = fundo verde estrondoso
    bYELLOWs = fundo amarelo estrondoso
    bBLUEs = fundo azul estrondoso
    bMAGENTAs = fundo magenta estrondoso
    bCYANs = fundo ciano estrondoso
    bWHITEs = fundo branco estrondoso

Aqui estão os estilos para letra:

    sRESET = estilo de letra padrão
    sBOLD = cor da letra fica mais forte
    sUNDERLINE = sublinhado
    sINVERSE = inverte a cor do fundo com a cor da letra

Aqui vai um programa para ver cada cor e estilo:

// como-são-todas-as-cores.cpp

#include "color.hpp"

using namespace color;
using namespace style;

int main() {
	cout << "fBLACK: ";
	coutc("text", fBLACK);
	cout << "\nfRED: ";
	coutc("text", fRED);
	cout << "\nfGREEN: ";
	coutc("text", fGREEN);
	cout << "\nfYELLOW: ";
	coutc("text", fYELLOW);
	cout << "\nfBLUE: ";
	coutc("text", fBLUE);
	cout << "\nfMAGENTA: ";
	coutc("text", fMAGENTA);
	cout << "\nfCYAN: ";
	coutc("text", fCYAN);
	cout << "\nfWHITE: ";
	coutc("text", fWHITE);
	cout << "\nfBLACKs: ";
	coutc("text", fBLACKs);
	cout << "\nfREDs: ";
	coutc("text", fREDs);
	cout << "\nfGREENs: ";
	coutc("text", fGREENs);
	cout << "\nfYELLOWs: ";
	coutc("text", fYELLOWs);
	cout << "\nfBLUEs: ";
	coutc("text", fBLUEs);
	cout << "\nfMAGENTAs: ";
	coutc("text", fMAGENTAs);
	cout << "\nfCYANs: ";
	coutc("text", fCYANs);
	cout << "\nfWHITEs: ";
	coutc("text", fWHITEs);
	cout << "\nbBLACK: ";
	coutc("text", bBLACK);
	cout << "\nbRED: ";
	coutc("text", bRED);
	cout << "\nbGREEN: ";
	coutc("text", bGREEN);
	cout << "\nbYELLOW: ";
	coutc("text", bYELLOW);
	cout << "\nbBLUE: ";
	coutc("text", bBLUE);
	cout << "\nbMAGENTA: ";
	coutc("text", bMAGENTA);
	cout << "\nbCYAN: ";
	coutc("text", bCYAN);
	cout << "\nbWHITE: ";
	coutc("text", bWHITE);
	cout << "\nbBLACKs: ";
	coutc("text", bBLACKs);
	cout << "\nbREDs: ";
	coutc("text", bREDs);
	cout << "\nbGREENs: ";
	coutc("text", bGREENs);
	cout << "\nbYELLOWs: ";
	coutc("text", bYELLOWs);
	cout << "\nbBLUEs: ";
	coutc("text", bBLUEs);
	cout << "\nbMAGENTAs: ";
	coutc("text", bMAGENTAs);
	cout << "\nbCYANs: ";
	coutc("text", bCYANs);
	cout << "\nbWHITEs: ";
	coutc("text", bWHITEs);
	cout << "\nsReset: ";
	coutc("text", sRESET);
	cout << "\nsBOLD: ";
	coutc("text", sBOLD);
	cout << "\nsUNDERLINE: ";
	coutc("text", sUNDERLINE);
	cout << "\nsINVERSE: ";
	coutc("text", sINVERSE);
	return 0;
}

Por favor, se encontrarem um erro ou acharem que dá para melhorar algo avisem.

Atenção: caso você copie e cole o color.h o caractere contido em char.txt deve ser adicionado antes de todos os "["

Segue anexos os arquivos char.txt e color.zip.

color.zip é um arquivo com a biblioteca color.h, um programa de exemplo e outro que mostra como são todas as cores. 

char.txt

 

color 1.0.3.zip

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Tiago Cavalcante Trindade       qual caractere de qual biblioteca ?  muito bom seu código , parece que você pesquisou bastante ,  e para aprendizado é muito bom , ainda não havia visto esses comandos em lugar algum , mas não consegui colocar os códigos do jeito certo e eles não funcionaram ,   e pesquisando vi essa função

 

#include <stdio.h>
#include <windows.h>
/*             0     1    2     3   4      5      6      7         8  */
typedef enum{black,blue,green,cyan,red,magenta,brown,lightgray,darkgray,   /* nome das cores */
lightblue,lightgreen,lightcyan,lightred,lightmagenta,yellow,white} colors;
/*  9         10         11        12        13         14    15 */

static int __BACKGROUND = 1/*BLACK*/;/*pode ser o numero ou o nome da cor*/
static int __FOREGROUND = lightgray;

void textcolor_2 (int letras, int fundo){/*para mudar a cor de fundo mude o background*/
    __FOREGROUND = letras;
    __BACKGROUND = fundo;
    SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),
    letras + (__BACKGROUND << 4));
}
int main(){
    textcolor_2(14,9);
    printf("Qualquer Coisa !\n\n\n");
    return 0;  
}

 

que é usada na na biblioteca conio2 , ou se não tiver a conio2 instalada funciona também , basta colocar a biblioteca #include <windows.h>  .

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

color.h não utiliza nenhuma biblioteca de cores, é que o cmd aceita caracteres ascii e o código [032m, [033m, ... são cores ascii, só que, como outros caracteres ascii o de cor tem que mudar um pouco por isso tem um caractere especial antes.

2 horas atrás, devair1010 disse:

@Tiago Cavalcante Trindade       qual caractere de qual biblioteca ?  muito bom seu código , parece que você pesquisou bastante ,  e para aprendizado é muito bom , ainda não havia visto esses comandos em lugar algum , mas não consegui colocar os códigos do jeito certo e eles não funcionaram ,   e pesquisando vi essa função

 


#include <windows.h>
/*             0     1    2     3   4      5      6      7         8  */
typedef enum{black,blue,green,cyan,red,magenta,brown,lightgray,darkgray,   /* nome das cores */
lightblue,lightgreen,lightcyan,lightred,lightmagenta,yellow,white} colors;
/*  9         10         11        12        13         14    15 */

static int __BACKGROUND = 1/*BLACK*/;/*pode ser o numero ou o nome da cor*/
static int __FOREGROUND = lightgray;

void textcolor_2 (int letras, int fundo){/*para mudar a cor de fundo mude o background*/
    __FOREGROUND = letras;
    __BACKGROUND = fundo;
    SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),
    letras + (__BACKGROUND << 4));
}

 

que é usada na na biblioteca conio2 , ou se não tiver a conio2 instalada funciona também , basta colocar a biblioteca #include <windows.h>  .

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Eu uso aqui a RLUTIL, é bem simples de usar apenas um arquivo .h, ela é usada para criar jogos de texto em modo console mas aparentemente  é um sucessor espiritual da antiga conio2.h. Tem todos os recursos e mais alguns e funciona em C e C++.

 

https://github.com/tapio/rlutil

 

Exemplo de um programinha pra mover um "personagem" sem aquele lag de input.

#include <iostream>
#include "rlutil.h"

int main()
{
    int x = 5;
    int y = 5;

    rlutil::hidecursor();
    rlutil::cls();
    rlutil::locate(x,y); std::cout << '@' << std::endl;

    while (true)
    {
        if (kbhit())
        {
            char k = getch();
            rlutil::locate(x,y); std::cout << " ";
            if (k == 'a') --x;
            else if (k == 'd') ++x;
            else if (k == 'w') --y;
            else if (k == 's') ++y;
            else if (k == ' ') break;
            rlutil::locate(x,y); std::cout << '@';
        }

        std::cout.flush();
    }

    rlutil::showcursor();

    return 0;
}

Outros exemplo de cor e jogos.

 

cmd1.png.1d50cc8c5b3c713be87fae39ccb1c6ae.png

 

cmd2.png.8fdd10498325de7c0a98b717b6469ba0.png

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Eu resolvi adiantar a 1.1.0 porque vi que tinha errado na 1.0.5, eu utilizei cout, mas, o correto é system, cout não funciona, no meu depurador funcionou, mas, quando testei no cmd, não funcionou, daqui a no máximo 5 dias eu solto a 2.0.0 que vai ter os recursos que eu planejei color 1.1.0.zip

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Tem um cara no youtube que criou uma biblioteca para criar jogos usando o console do windows, só que ele meio que elevou o nível da coisa hehe. Você que esta estudando pra criar um framework próprio pode ser interessante dar uma olhada. Deve ter as funções ou algo parecido com o que você procura.

 

https://github.com/OneLoneCoder/videos/blob/master/olcConsoleGameEngine.h

 

Alguns jogos que ele ensinou com o framework

 

RPG

 

FPS

 

Plataforma

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@Benjamin Breeg Essa biblioteca realmente elevou um pouquinho o nível da coisa (a directx ficaria com inveja hehe), vou dar uma estudada nessa biblioteca.

adicionado 12 minutos depois
10 horas atrás, Tiago Cavalcante Trindade disse:

Eu resolvi adiantar a 1.1.0 porque vi que tinha errado na 1.0.5, eu utilizei cout, mas, o correto é system, cout não funciona, no meu depurador funcionou, mas, quando testei no cmd, não funcionou, daqui a no máximo 5 dias eu solto a 2.0.0 que vai ter os recursos que eu planejei color 1.1.0.zip

Eu disse que cout não funciona... erro meu cout funciona, mas tem que colocar \033 antes do ansi (antes eu disse ascii, mas eu errei) não um caractere especial.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Aqui está a versão 2.0.0, no manual de referência estão as mudanças da versão 1.1.0, esta versão não é compatível com o cmd, daqui a 1 ou 2 dias eu lanço a versão para o cmd. O comando color() é incompatível com o Linux, daqui a uns 3 ou 4 dias lanço uma versão só para ele.

color 2.0.0.zip

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 14/09/2019 às 23:13, Tiago Cavalcante Trindade disse:

@Benjamin Breeg Essa biblioteca realmente elevou um pouquinho o nível da coisa (a directx ficaria com inveja hehe), vou dar uma estudada nessa biblioteca.

adicionado 12 minutos depois

Eu disse que cout não funciona... erro meu cout funciona, mas tem que colocar \033 antes do ansi (antes eu disse ascii, mas eu errei) não um caractere especial.

Ah cout não funciona mesmo, tentei de tudo. Acabou passando porque no Depurador do Visual Studio cout funciona.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 12/09/2019 às 12:19, Tiago Cavalcante Trindade disse:

como outros caracteres ascii o de cor tem que mudar um pouco por isso tem um caractere especial antes

 

Não entendi o que significa

 

Em 14/09/2019 às 23:13, Tiago Cavalcante Trindade disse:

mas tem que colocar \033 antes do ansi (antes eu disse ascii, mas eu errei) não um caractere especial

 

Esse é o código do ESCAPE, 27. 

 

Uma referência histórica: esses códigos são baseados em emular, simular um terminal de computador, nos tempos em que os computadores passaram a ter terminais. Em geral no Unix/Linux esses são os códigos referentes a terminais da marca DIGITAL, em geral do modelo VT-100. Mas em alguns casos se pode selecionar VT-52 ou VT-220.  O que acontece é que o terminal interpreta esses códigos antes de mostrar seja lá o que for na tela. O terminal Unix...

 

Esse é um VT-100. Veja em https://pt.wikipedia.org/wiki/VT100 mais informação

385057899_DECVT-100.png.acc157347423d632dfe49d09bb2e029a.png

 

No caso do Windows a ideia sempre foi diferente e se usa uma uma API, chamadas de função. No entanto recentemente isso começou a mudar e o windows passou a operar com essa mesma filosofia em alguns casos. Isso é um pesadelo. Mas se você usa Windows 10 a partir da edição de aniversário eu acho, pode ter grande sucesso com essas funções e ter seu programa de "console" funcionando igualzinho no Windows e no Unix/Linux/Mac.

 

Essa ferramenta da Microsoft por exemplo pode te interessar https://github.com/microsoft/terminal/releases/tag/1904.29002. Tem tudo a ver com o que está escrevendo. O código fonte está incluído e os caras que escrevem são muito muito bons. A ideia é que você pode criar e salvar esquemas de cores como se faz com a interface gráficas impressoras, o display e tal...

Veja uma tela abaixo. Isso é de 2019!

ColorTool.png.4b461f4779d91c686042b47ab662f724.png

Tem um blog da Microsoft que vem divulgando a evolucão dessas coisas e tem a ver com o WSL, subsistema do windows para Linux.

 

A bíblia disso está aqui Guia de instalação do subsistema do Windows para Linux para Windows 10

 

Por outro lado, essa é a referência para Windows sobre o desenvolvimento dessas coisas https://docs.microsoft.com/pt-br/windows/console/console-reference. Infelizmente ainda não está disponível em português

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 19/09/2019 às 00:27, arfneto disse:

 

Não entendi o que significa

 

 

Esse é o código do ESCAPE, 27. 

 

Uma referência histórica: esses códigos são baseados em emular, simular um terminal de computador, nos tempos em que os computadores passaram a ter terminais. Em geral no Unix/Linux esses são os códigos referentes a terminais da marca DIGITAL, em geral do modelo VT-100. Mas em alguns casos se pode selecionar VT-52 ou VT-220.  O que acontece é que o terminal interpreta esses códigos antes de mostrar seja lá o que for na tela. O terminal Unix...

 

Esse é um VT-100. Veja em https://pt.wikipedia.org/wiki/VT100 mais informação

385057899_DECVT-100.png.acc157347423d632dfe49d09bb2e029a.png

 

No caso do Windows a ideia sempre foi diferente e se usa uma uma API, chamadas de função. No entanto recentemente isso começou a mudar e o windows passou a operar com essa mesma filosofia em alguns casos. Isso é um pesadelo. Mas se você usa Windows 10 a partir da edição de aniversário eu acho, pode ter grande sucesso com essas funções e ter seu programa de "console" funcionando igualzinho no Windows e no Unix/Linux/Mac.

 

Essa ferramenta da Microsoft por exemplo pode te interessar https://github.com/microsoft/terminal/releases/tag/1904.29002. Tem tudo a ver com o que está escrevendo. O código fonte está incluído e os caras que escrevem são muito muito bons. A ideia é que você pode criar e salvar esquemas de cores como se faz com a interface gráficas impressoras, o display e tal...

Veja uma tela abaixo. Isso é de 2019!

ColorTool.png.4b461f4779d91c686042b47ab662f724.png

Tem um blog da Microsoft que vem divulgando a evolucão dessas coisas e tem a ver com o WSL, subsistema do windows para Linux.

 

A bíblia disso está aqui Guia de instalação do subsistema do Windows para Linux para Windows 10

 

Por outro lado, essa é a referência para Windows sobre o desenvolvimento dessas coisas https://docs.microsoft.com/pt-br/windows/console/console-reference. Infelizmente ainda não está disponível em português

 

 

 

Toda letra acentuada em um arquivo cpp (caso não seja colocado em ascii) fica estranha no cmd, caracteres estranhos aparecem no lugar da letra, caracteres especiais cmd.zip mostra quais letras devem ser substituídas por quais caracteres para elas aparecerem certas no cmd.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Tiago Cavalcante Trindade disse:

Toda letra acentuada em um arquivo cpp (caso não seja colocado em ascii) fica estranha no cmd, caracteres estranhos aparecem no lugar da letra, caracteres especiais cmd.zip mostra quais letras devem ser substituídas por quais caracteres para elas aparecerem certas no cmd.

adicionado 1 minuto depois

Saiu a color.h 2.0.0 (Windows)

color 2.0.0 (Windows).zip 47 kB · 0 downloads

 

Chegou  a ler o que eu expliquei?

 

Esse lance das letras é um pesadelo, em especial se você não usa Windows 10. Esses códigos que usa são baseados na emulação de um terminal DEC VT-100 e você pode encontrar isso no manual do próprio, ou no manual do xterm. Os comandos em geral começam por ESCAPE como você deve ter visto. octal 33, decimal 27.  ESC depois [ depois algo selecionam modo de video, endereçam o cursor, mudam a cor e tal. E esses caracteres são interpretados antes de ir para a tela. Isso funciona bem no Unix e derivados mas no Windows sempre foi um inferno. E também tem a questão das fontes e da página de código e dos caracteres multi-byte... 

Como eu disse, a partir da edição de aniversário do windows 10 e da criação do WSL --- o subsistema linux --- isso ficou muito melhor. E agora o Windows tem uma coisa chamada Pseudo-console que permite interpretar melhor esses caracteres VT-coisas

 

Citação

Devido à Console API a console do Windows tinha pouca necessidade de suportar comandos ANSI/VT que oferecem similares funções em outras plataformas. De fato --- até o Windows 10 --- a console do Windows implementava apenas um absoluto mínimo suporte para essas sequências

 

Citado em https://devblogs.microsoft.com/commandline/windows-command-line-inside-the-windows-console/ em 20/Julho/2018

 

Veja essa imagem da mesma fonte mostrando uma mesma tela de uma aplicação de console no Windows 7 e no Windows 10

ch-190919-windowsConsole.png.6709c22a68a75e1d4b1a1096375a97cd.png

 

Não sei de sua familiaridade ou necessidade de tratar essas coisas, mas há grandes problemas em usar aplicativos de console feitos para rodar nesses terminais --- consoles --- usando bibliotecas como curses ou ncurses ou sei lá, mas no windows. Basta ver aquela tela acima... E ver que desde 2014 isso está sendo reescrito pela microsoft...

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

7 horas atrás, arfneto disse:

 

Chegou  a ler o que eu expliquei?

 

Esse lance das letras é um pesadelo, em especial se você não usa Windows 10. Esses códigos que usa são baseados na emulação de um terminal DEC VT-100 e você pode encontrar isso no manual do próprio, ou no manual do xterm. Os comandos em geral começam por ESCAPE como você deve ter visto. octal 33, decimal 27.  ESC depois [ depois algo selecionam modo de video, endereçam o cursor, mudam a cor e tal. E esses caracteres são interpretados antes de ir para a tela. Isso funciona bem no Unix e derivados mas no Windows sempre foi um inferno. E também tem a questão das fontes e da página de código e dos caracteres multi-byte... 

Como eu disse, a partir da edição de aniversário do windows 10 e da criação do WSL --- o subsistema linux --- isso ficou muito melhor. E agora o Windows tem uma coisa chamada Pseudo-console que permite interpretar melhor esses caracteres VT-coisas

 

 

Citado em https://devblogs.microsoft.com/commandline/windows-command-line-inside-the-windows-console/ em 20/Julho/2018

 

Veja essa imagem da mesma fonte mostrando uma mesma tela de uma aplicação de console no Windows 7 e no Windows 10

ch-190919-windowsConsole.png.6709c22a68a75e1d4b1a1096375a97cd.png

 

Não sei de sua familiaridade ou necessidade de tratar essas coisas, mas há grandes problemas em usar aplicativos de console feitos para rodar nesses terminais --- consoles --- usando bibliotecas como curses ou ncurses ou sei lá, mas no windows. Basta ver aquela tela acima... E ver que desde 2014 isso está sendo reescrito pela microsoft...

 

Ah, eu disse cpp, mas bat também.

Eu li o que você me indicou, mas, antes da atualização de março e nos Windows anteriores era com essa tabela que se colocava acentuação em arquivos bat, hoje se utiliza chcp.

adicionado 3 minutos depois

Saiu a color.h 2.0.0 (Windows).

color 2.0.0 (Windows).zip

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 3 meses depois...

Acabei de fazer uma super descoberta!!!

Eu estava navegando pela internet e achei este siteeste, no primeiro descobri que era possível utilizar cores no Windows como no Linux e no segundo como fazer isso e é muito fácil, basta executar o comando abaixo no Prompt de Comando:

reg add HKEY_CURRENT_USER\Console /v VirtualTerminalLevel /t REG_DWORD /d 0x00000001 /f

Após executar o comando é só usar. Funciona com os códigos de escape \033 e \x1b, por algum motivo o código 27 só funciona em octal (033).

Não funciona só no C++ funciona também no Python!

 

Exemplo de como usar no c++:

#include <iostream>

int main() {
	std::cout << "\033[4;31;44mVermelho com fundo azul\033[0m";
}

Foto de como funcionou com o Python:

image.thumb.png.6d539740a9451a6122df9a62ff009841.png

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Olá!

 

Talvez usar isso não seja uma boa ideia porque é uma instrução permanente e vai continuar em efeito depois de seu programa terminar. E afetar todos os programas e scripts para console daí em diante. E você nem disse como "desfazer" a mudança se criar problemas depois. Seria melhor ao menos anotar o valor de VirtualTerminalLevel antes...

 

De todo modo, acho que esse valor pode ser lido ou gravado usando 

BOOL WINAPI SetConsoleMode(
  _In_ HANDLE hConsoleHandle,
  _In_ DWORD  dwMode
);

E

BOOL WINAPI GetConsoleMode(
  _In_  HANDLE  hConsoleHandle,
  _Out_ LPDWORD lpMode
);

De dentro de seu programa em qualquer linguagem. Estou sem tempo de escrever programas agora mas acho que esse valor é a combinação dos valores dos parâmetros dessa chamada, e quando 1 como nesse caso equivale a usar apenas
 

console-mode.png.bc4b7c5bca0fa32dca76aaab2e7ec464.png

 

Tem muitas discussões sobre isso aqui no forum e eu postei também links para a documentação oficial, mas não tenho os links agora.

 

Em resumo: nos últimos anos foi feito um investimento enorme para que programa de console do Linux pudessem rodar no Windows com o mesmo resultado. Note que é muito mais que apenas escolher a cor. De todo modo, a própria documentação sugere em https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences que você veja os comandos em http://vt100.net/ mas tem um bom resumo nessa mesma página

 

Hoje o terminal aceita tanto no Windows quanto no Linux, em relação às cores, todo o espectro RGB, com 16.7 milhões de cores e não mais as 256 de sempre. Ou as 16 do Windows. E os comandos estão lá na documentação.

 

Tudo isso ficou ainda mais importante agora com o WSL --- Windows Subsystem for Linux --- no Windows, porque você pode rodar Linux e programas Linux direto no terminal do Windows, e não faria sentido os comandos do muito antigo VT100 não funcionarem... 

 

Na verdade você pode até baixar um ambiente integrado grátis, Visual Studio Code em https://code.visualstudio.com/ que permite compilar e rodar suas aplicações Linux direto no Linux a partir do Windows. 

 

E o novo Terminal do Windows roda com aceleração gráfica da sua placa de vídeo  e 24 bits de cor, e abre Linux direto da sua  sessão  no Windows. Coisas dos novos tempos.

 

Veja uma imagem de uma máquina rodando Windows 10 com duas sessões de Linux, Ubuntu e Suse, oficiais, e ao lado uma sessão de Visual Studio Code compilando e rodando um programa Linux em C++ no Linux:

 

side.thumb.png.f74703da6665d216d6d450b33558c7eb.png

 

Veja na loja do Windows

 

apps.png.a21a4b92856d8165a7bbd29c6d0e9f54.png

 

Estou me afastando do tópico. 

 

O que importa é que hoje em dia você pode ter o comportamento do terminal do Linux no Windows, e pode rodar o mesmo programa no Linux e no Windows sem deixar propriamente o Windows. E de graça. E o Linux entra em uns 3 ou 5 segundos.Veja que tem um link na loja, bem ao lado, para o Remote Terminal porque você pode também ativar a interface gráfica nos Linux e acessar a partir do Windows via RDP tudo na mesma máquina.

 

Um pouco de história

 

Já postei isso aqui em detalhes e não dá pra repetir agora, mas a console é uma coisa nova no Windows. O unix não tinha isso, e assim o Linux não tem isso. A gente usava Unix ligando terminais ao computador. Inicialmente terminais tipo teletype como os LA-36 da Digita http://www.computinghistory.org.uk/det/3367/Digital-DECWriter-II/ e depois com as novas tecnologias terminais como o VT-52, o VT-100 e o VT-240 https://www.vt100.net/dec/vt_history

 

Eram ligados através de adaptadores seriais que permitiam ligar os terminais a 2400 4800 ou com muita sorte 9600 bits por segundo. E algumas funções eram controladas através de comandos para o terminal, que eram sempre iniciados por ESCAPE. Só isso.Isso também valia para impressoras e outros periféricos.

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

23 minutos atrás, arfneto disse:

Talvez usar isso não seja uma boa ideia porque é uma instrução permanente e vai continuar em efeito depois de seu programa terminar. E afetar todos os programas e scripts para console daí em diante. E você nem disse como "desfazer" a mudança se criar problemas depois. Seria melhor ao menos anotar o valor de VirtualTerminalLevel antes...

Não entendi porque não poderia ser uma boa ideia, eu sei que seu efeito irá continuar, e essa é a ideia, não ter que usar biblioteca nenhuma, compatibilidade total!

E caso der problema aqui está o comando para desfazer:

reg add HKEY_CURRENT_USER\Console /v VirtualTerminalLevel /t REG_DWORD /d 0x00000000 /f

E sobre o WSL, eu já uso Kali Linux (ao lado do Terminal na parte de programação).

image.thumb.png.5ce31b0c32fdb5219ea3cd89b8825545.png

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

3 minutos atrás, Tiago Cavalcante Trindade disse:

Não entendi porque não poderia ser uma boa ideia, eu sei que seu efeito irá continuar, e essa é a ideia, não ter que usar biblioteca nenhuma, compatibilidade total!

E caso der problema aqui está o comando para desfazer

 

Talvez não tenha entendido o propósito de escrever programas de computador: eles não vão rodar sempre na mesma máquina, a sua . E você pode rodar programas na sua máquina que não foram escritos por você. Outras pessoas podem até usar sua máquina para rodar programas.

 

Se leu tudo que eu escrevi sabe que pode usar GetConsoleMode() ao iniciar seu programa e salvar o modo atual de uso da console. Usar SetConsoleMode() e fazer o simples habilitando VirtualConsoleOutput. Ao encerrar seu programa restaure o modo e pronto.  E aí pode levar seu executável num pendrive e mostrar para alguém, sem ter que pedir licença para fazer uma pequena mudança permanente no registro de um computador que não é seu...

 

Kali, Suse ou Ubuntu ou qualquer distribuição que rodar terá o mesmo resultado em WSL: o que importa é que vai estar usando o novo terminal, que usa aceleração gráfica e interpreta os comandos VT-100 por padrão.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@arfneto  eu entendi o que disse, mas, essa é uma mudança que não prejudica nada, creio até que a Microsoft a fará em uma próxima atualização, a única coisa que essa mudança faz é permitir o uso de outros códigos ESC, porque por padrão no Windows o único código ESC que funciona no Windows foi o que eu postei a um tempo atrás (o caractere contido em char.txt) e eu achei que seria uma boa ideia porque agora com o WSL você pode compilar para Linux com o Windows e para não ter que escrever umas linhas a mais no Windows é só usar aquele comando.

 

E também essa mudança não tem que ser feita a mão, pode ser colocada em um arquivo batch junto com o seu programa.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 29/12/2019 às 22:10, Tiago Cavalcante Trindade disse:

Acabei de fazer uma super descoberta!!!

Eu estava navegando pela internet e achei este siteeste, no primeiro descobri que era possível utilizar cores no Windows como no Linux e no segundo como fazer isso e é muito fácil, basta executar o comando abaixo no Prompt de Comando:


reg add HKEY_CURRENT_USER\Console /v VirtualTerminalLevel /t REG_DWORD /d 0x00000001 /f

Após executar o comando é só usar. Funciona com os códigos de escape \033 e \x1b, por algum motivo o código 27 só funciona em octal (033).

Não funciona só no C++ funciona também no Python!

Eu publiquei um artigo sobre isso no Code Project.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 30/12/2019 às 14:00, Tiago Cavalcante Trindade disse:

@arfneto  eu entendi o que disse, mas, essa é uma mudança que não prejudica nada, creio até que a Microsoft a fará em uma próxima atualização, a única coisa que essa mudança faz é permitir o uso de outros códigos ESC, porque por padrão no Windows o único código ESC que funciona no Windows foi o que eu postei a um tempo atrás (o caractere contido em char.txt) e eu achei que seria uma boa ideia porque agora com o WSL você pode compilar para Linux com o Windows e para não ter que escrever umas linhas a mais no Windows é só usar aquele comando.

 

E também essa mudança não tem que ser feita a mão, pode ser colocada em um arquivo batch junto com o seu programa.

Isso está lá de proposito para dar suporte a programas antigos (Windows xp e anteriores), agora se isso não tem impacto nenhum para você é porque você não usa programas antigos.

 

Mas para alguém que usa programas via console da era do windows xp isso tem um grande impacto.

 

Eu aqui no fórum já repeti varias vezes que eu não gosto de reinventar a roda, então experimente usar ncurses (ou curses ou pcurses) que já dão suporte para isso.

 

Veja também esse video 

É feliz 2020!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@KXSY Eu não quis ser chato, apenas queria aumentar a compatibilidade do código entre o Windows e o Linux. E também como eu ja disse antes acho que o Windows abilitara isso em uma nova atualização, então eu apenas adiantei um bovo recurso.

Feliz 2020!

Link para o comentário
Compartilhar em outros sites

13 minutos atrás, Tiago Cavalcante Trindade disse:

@KXSY Eu não quis ser chato, apenas queria aumentar a compatibilidade do código entre o Windows e o Linux.

Feliz 2020!

Eu também não quis ser chato mas já existe varias opções multiplataforma, mas uma biblioteca desse tipo (Console) que funciona no modo gráfico (como SDL, allegro, OpenGL) ao meu ver seria muito bem vinda.

 

Mas e como eu falei. quando você está programando não é só importante entender a interação do usuário com o programa mas também e muito importante entender como o programa vai interagir como o sistema operacional.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...