Buffers da tela do console

Um buffer de tela é uma matriz bidimensional de caracteres e dados de cor para saída em uma janela de console. Um console pode ter vários buffers de tela. O buffer de tela ativo é aquele exibido na tela.

O sistema cria um buffer de tela sempre que cria um console. Para abrir o identificador para o buffer de tela ativo do console, especifique o valor CONOUT$ em uma chamada para a função CreateFile. Um processo pode usar a função CreateConsoleScreenBuffer para criar buffers de tela adicionais para o console dele. Um novo buffer de tela não estará ativo até que o identificador dele seja especificado em uma chamada para a função SetConsoleActiveScreenBuffer. No entanto, os buffers de tela poderão ser acessados para leitura e gravação se estiverem ativos ou inativos.

Cada buffer de tela tem a própria matriz bidimensional de registros de informações de caractere. Os dados de cada caractere são armazenados em uma estrutura CHAR_INFO que especifica o caractere Unicode ou ANSI e as cores de primeiro plano e da tela de fundo nas quais esse caractere é exibido.

Várias propriedades associadas a um buffer de tela podem ser definidas de modo independente para cada buffer de tela. Isso significa que a alteração do buffer de tela ativo pode ter um efeito significativo na aparência da janela do console. As propriedades associadas a um buffer de tela incluem:

  • Tamanho do buffer de tela, em linhas e colunas de caracteres.
  • Atributos de texto (cores de primeiro plano e da tela de fundo para exibir o texto a ser escrito pela função WriteFile ou WriteConsole).
  • O tamanho e a localização da janela (a região retangular do buffer de tela do console que é exibido na janela do console).
  • Posição, aparência e visibilidade do cursor.
  • Modos de saída (ENABLE_PROCESSED_OUTPUT e ENABLE_WRAP_AT_EOL_OUTPUT). Para obter mais informações sobre modos de saída de console, confira Modos de Console de Alto Nível.

Quando um buffer de tela é criado, ele contém caracteres de espaço em cada posição. O cursor dele está visível e é posicionado na origem do buffer (0,0), e a janela é posicionada com o canto superior esquerdo na origem do buffer. O tamanho do buffer de tela do console, o tamanho da janela, os atributos de texto e a aparência do cursor são determinados pelo usuário ou pelos padrões do sistema. Para recuperar os valores atuais das várias propriedades associadas ao buffer de tela do console, use as funções GetConsoleScreenBufferInfo, GetConsoleCursorInfo e GetConsoleMode.

Os aplicativos que alteram qualquer uma das propriedades do buffer da tela do console devem criar o próprio buffer de tela ou salvar o estado do buffer de tela herdado durante a inicialização e restaurá-lo na saída. Esse comportamento cooperativo é necessário para que outros aplicativos que compartilham a mesma sessão de console não sejam afetados pelas alterações.

Dica

É recomendável usar o modo de buffer alternativo de agora em diante, se possível, em vez de criar um segundo buffer de tela para essa finalidade. O modo de buffer alternativo oferece maior compatibilidade entre dispositivos remotos e outras plataformas. Confira nossa discussão sobre APIs do console clássico versus terminal virtual para obter mais informações.

Aparência e posição do cursor

O cursor de um buffer de tela pode estar visível ou oculto. Quando estiver visível, a aparência dele poderá variar, desde preencher completamente uma célula de caractere até aparecer como uma linha horizontal na parte inferior da célula. Para recuperar informações sobre a aparência e a visibilidade do cursor, use a função GetConsoleCursorInfo. Essa função informa se o cursor está visível e descreve a aparência dele como o percentual de uma célula de caracteres que ele preenche. Para definir a aparência e a visibilidade do cursor, confira a função SetConsoleCursorInfo.

Caracteres gravados pelas funções de E/S de console de alto nível são gravados na localização do cursor atual, avançando o cursor para a próxima localização. Para determinar a posição atual do cursor no sistema de coordenadas de um buffer de tela, use GetConsoleScreenBufferInfo. Você pode usar SetConsoleCursorPosition para definir a posição do cursor e, dessa forma, controlar o posicionamento do texto que é escrito ou ecoado pelas funções de E/S de alto nível. Se você mover o cursor, o texto na nova localização do cursor será substituído.

Observação

Não é recomendável usar as funções de nível inferior para localizar a posição do cursor. É recomendável usar sequências de terminais virtuais para consultar essa posição, se necessário, para layouts avançados. Mais informações sobre a preferência de sequências de terminais virtuais podem ser encontradas no documento funções clássicas versus terminal virtual.

A posição, a aparência e a visibilidade do cursor são definidas de maneira independente para cada buffer de tela.

Atributos de caractere

Os atributos de caractere podem ser divididos em duas classes: cor e DBCS. Os atributos a seguir estão definidos no arquivo de cabeçalho WinCon.h.

Atributo Significado
FOREGROUND_BLUE A cor do texto contém azul.
FOREGROUND_GREEN A cor do texto contém verde.
FOREGROUND_RED A cor do texto contém vermelho.
FOREGROUND_INTENSITY A cor do texto é intensificada.
BACKGROUND_BLUE A cor da tela de fundo contém azul.
BACKGROUND_GREEN A cor da tela de fundo contém verde.
BACKGROUND_RED A cor da tela de fundo contém vermelho.
BACKGROUND_INTENSITY A cor da tela de fundo é intensificada.
COMMON_LVB_LEADING_BYTE Byte à esquerda.
COMMON_LVB_TRAILING_BYTE Byte à direita.
COMMON_LVB_GRID_HORIZONTAL Parte superior horizontal.
COMMON_LVB_GRID_LVERTICAL Lado esquerdo vertical.
COMMON_LVB_GRID_RVERTICAL Lado direito vertical.
COMMON_LVB_REVERSE_VIDEO Inverter atributos de primeiro plano e da tela de fundo.
COMMON_LVB_UNDERSCORE Sublinhado.

Os atributos de primeiro plano especificam a cor do texto. Os atributos da tela de fundo especificam a cor usada para preencher a tela de fundo da célula. Os outros atributos são usados com DBCS.

Um aplicativo pode combinar as constantes de primeiro plano e da tela de fundo para obter cores diferentes. Por exemplo, a combinação a seguir resulta em um texto ciano brilhante em uma tela de fundo azul.

FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE

Se nenhuma constante de tela de fundo for especificada, a tela de fundo será preta e, se nenhuma constante de primeiro plano for especificada, o texto será preto. Por exemplo, a combinação a seguir produz texto preto em uma tela de fundo branca. Vermelho, verde e azul são especificados para a tela de fundo, combinada com uma tela de fundo branca. Nenhuma cor de sinalizador é especificada para o primeiro plano, portanto, ela é preta.

BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED

Cada célula de caractere do buffer de tela armazena os atributos de cor para as cores usadas no desenho do primeiro plano (texto) e da tela de fundo dessa célula. Um aplicativo pode definir os dados de cor para cada célula de caractere individualmente, armazenando os dados no membro Atributos da estrutura CHAR_INFO de cada célula. Os atributos de texto atuais de cada buffer de tela são usados para caracteres gravados ou ecoados subsequentemente pelas funções de alto nível.

Um aplicativo pode usar GetConsoleScreenBufferInfo para determinar os atributos de texto atuais de um buffer de tela e a função SetConsoleTextAttribute para definir os atributos de caractere. Alterar os atributos de um buffer de tela não afeta a exibição de caracteres gravados anteriormente. Esses atributos de texto não afetam os caracteres gravados pelas funções de E/S do console de nível inferior (como a função WriteConsoleOutput ou WriteConsoleOutputCharacter), que especificam explicitamente os atributos para cada célula que é gravada ou deixam os atributos inalterados.

Observação

Não é recomendável usar as funções de nível inferior para manipular atributos de texto padrão e específicos. É recomendável usar sequências de terminais virtuais para definir atributos de texto. Mais informações sobre a preferência de sequências de terminais virtuais podem ser encontradas no documento funções clássicas versus terminal virtual.

Atributos de fonte

A função GetCurrentConsoleFont recupera informações sobre a fonte do console atual. As informações armazenadas na estrutura CONSOLE_FONT_INFO incluem a largura e a altura de cada caractere na fonte.

A função GetConsoleFontSize recupera o tamanho da fonte usada pelo buffer de tela do console especificado.

Observação

Não é recomendável usar funções para localizar e manipular informações de fontes. É recomendável operar aplicativos de linha de comando em fonte neutra para garantir a compatibilidade multiplataforma, bem como a compatibilidade com ambientes de host que permitem ao usuário personalizar a fonte. Para obter mais informações sobre preferências do usuário e ambientes de host, incluindo terminais, confira o roteiro de ecossistema.