Ir ao conteúdo
  • Cadastre-se

Posts recomendados

Postado

Quando eu executo um programa, vi que tenho o poder de aumentar a fonte do console usando ctrl + scroll, queria saber se existe uma maneira de definir o tamanho das letras usando algum comando dentro da linguagem C++

 

Exemplo: 

zoom out:

 image.png.a992898716a3b1017127f1bab24a6ea4.png

Zoom in:

image.png.17cea5a11f8ac6f69be98fda1f4dc4b8.png

  • Curtir 1
Postado

 

O Windows foi escrito em C, com um pouco de C++. Então não há quase nada que não possa fazer em C ou C++.

 

A fonte em uso na console é controlada por essa estrutura:
 

typedef struct _CONSOLE_FONT_INFOEX
{
  ULONG cbSize;
  DWORD nFont;
  COORD dwFontSize;
  UINT  FontFamily;
  UINT  FontWeight;
  WCHAR FaceName[LF_FACESIZE];
  
} CONSOLE_FONT_INFOEX, *PCONSOLE_FONT_INFOEX;

 

Cuidado ao mexer com essas coisas:

  • antes de tudo copie os valores originais e depois restaure com cuidado no final do programa. 
  • Evite a todo custo rodar o programa dentro do IDE. Rode no terminal. Se possível no "novo" terminal do Windows.

    image.thumb.png.4cf1bf086dd5725d9ded0598b63ca28c.png
  • No geral tudo gira em torno de algumas estruturas. Fontes, a página de código em uso, o tamanho e posição da janela. Recomendo não usar isso. É chato e frustrante. Tem o problema dos acentos, Unicode, diferenças de máquina pra máquina, e coisas assim.

Essa função abaixo serve de exemplo. Ela lê algumas dessas estruturas e de dá uma ideia da mecânica.

As funções e estruturas todas estão muito bem documentadas  na Microsoft e tem muita coisa em bom português, direto dos donos do campo. A parte que importa está em roxo. Inclua "windows.h" e use um projeto para console no Windows.

Se usa um IDE da Microsoft é trivial. Em outros talvez precise de uns comandos a mais para referenciar as bibliotecas e coisas assim.
 

int         prepara_tela(_cs_infoEx* csinfo)
{
    HANDLE  h = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_FONT_INFOEX          fonte;
    CONSOLE_SCREEN_BUFFER_INFOEX* scrbInfoEx = &csinfo->infoEx;
    COORD                        xy;
    int                          res = 0;
    srand(20200505); // start rand()
    // confirma tamanho da tela
    scrbInfoEx->cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
    res = GetConsoleScreenBufferInfoEx(h, scrbInfoEx);
    if (res == 0) return GetLastError();
    csinfo->l = (scrbInfoEx->srWindow.Bottom - scrbInfoEx->srWindow.Top + 1);
    csinfo->c = (scrbInfoEx->srWindow.Right - scrbInfoEx->srWindow.Left + 1);
    if ((csinfo->l < 24) || (csinfo->c < 80))
    {
        printf("Use uma tela com ao menos 24x80 caracteres\n");
        return -1; // pelo menos 24x80
    };  // if()
    char barra[256];
    memset(barra, 196, 256);
    SetConsoleOutputCP(437);
    SetConsoleCP(437);
    csinfo->baseL = csinfo->baseC = 1;
    csinfo->cor = _verde_;
    csinfo->estilo = 0;
    csinfo->i_handle = GetStdHandle(STD_INPUT_HANDLE);
    csinfo->o_handle = h;
    // define o modo da console
    int   modo = 0;
    GetConsoleMode(h, &modo);
    // DISABLE_NEWLINE_AUTO_RETURN 0x0008 
    // ENABLE_WRAP_AT_EOL_OUTPUT   0x0002
    modo = modo & 0xFFF5; //1111 0101

    // salvo o padrão em uso, muda para o estado que queremos

    SetConsoleMode(h, modo);
    // muda a fonte para Courier New
    fonte.cbSize = sizeof(CONSOLE_FONT_INFOEX);
    fonte.nFont = 0;
    fonte.dwFontSize.X = 10;
    fonte.dwFontSize.Y = 20;
    lstrcpyW(fonte.FaceName, L"Courier New");
    fonte.FontFamily = 54;
    fonte.FontWeight = 400;
    res = SetCurrentConsoleFontEx(h, 0, &fonte);
    if (res == 0)
    {
        printf("SetCurrentConsoleFontEx() falhou: %d\n", GetLastError());
        return (-1);
    };  // if()
    // agora retira o scroll
    xy.Y = scrbInfoEx->srWindow.Bottom - scrbInfoEx->srWindow.Top + 1;
    xy.X = scrbInfoEx->srWindow.Right - scrbInfoEx->srWindow.Left + 1;
    res = SetConsoleScreenBufferSize(h, xy);
    if (res == 0)
    {
        res = GetLastError();
        printf("SetConsoleScreenBufferSize() falhou! Erro : %d \n",
            res);
        return (-1);
    };  // if()
    cls();
    text_color(_verde_, _preto_);
    barra[csinfo->c - 2] = 0;
    gotoYX(csinfo->l - 3, 1);
    printf("%s", barra);
    csinfo->l -= 4;
    csinfo->c -= 2;
    csinfo->baseL = 1; // origem da janela grafica
    csinfo->baseC = 1;
    return 0;
};  // prepara_tela()

 

Não achei hoje um programa que eu possa postar e que use isso. 

A resposta curta:

 

Sim. Use SetCurrentConsoleFontEx() como documentado em https://docs.microsoft.com/pt-br/windows/console/setcurrentconsolefontex

  • Curtir 1
  • Obrigado 1
  • 2 anos depois...
Postado

@ederangelo21 Acho que não deve ressuscitar um tópico de 3 anos atrás e sim abrir um novo, mas não falo pelo forum.

 

Um emulador tem seus próprios comandos e nada tem a ver com rodar em Linux ou Windows ou qualquer coisa.

 

No emulador deve ter uma opção para ajustar a fonte. Muitas vezes pode usar o volante do mouse enquanto pressiona Control.

 

No Linux precisa ver de que terminal está falando. No emulador xterm tem um menu onde pode ajustar isso. Nos tty que acessa com control-alt-fx precisa mudar a fonte da console instalando fontes e configurando a console. Pode usar man tty em seu terminal

  • Curtir 1

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...