Форум программистов, компьютерный форум, киберфорум
fair7
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Как узнать размер шрифта в консоли?

Запись от fair7 размещена 08.03.2020 в 20:35
Показов 3518 Комментарии 7

Не найдя функции, которая узнаёт размер шрифта консоли - решил написать программку,
которая вычислит шрифт (какой в данный момент):
От ХР до 8.1 работает; а в windows 10 не работает
Название: Узнать размер шрифта в консоли.PNG
Просмотров: 1077

Размер: 1.3 Кб
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#define _WIN32_WINNT 0x0500 // Должна быть перед <windows.h>
#include <windows.h>
#include <stdio.h>
#define PP printf //  чтобы легче писать
typedef struct  {short X;short Y;} C00RD, *PC00RD;
// Дескриптор консоли, обязательно надо инициализировать
HANDLE hOut =  GetStdHandle( STD_OUTPUT_HANDLE );
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
void GetBufferChars(COORD *Chars)// Чтобы узнать размер буфера символов
{   GetConsoleScreenBufferInfo(hOut, &csbInfo);
    Chars->X = csbInfo.srWindow.Right - csbInfo.srWindow.Left + 1;
    Chars->Y = csbInfo.srWindow.Bottom - csbInfo.srWindow.Top + 1;
}
int main()
{
    COORD Chars={0};// Сколько символов помещается на экран
    unsigned short width=0,height=0;
    unsigned char width_pixel=0,height_pixel=0;
    while (1)
    {
        GetBufferChars(&Chars);// Взять размер буфера экрана
        RECT rect = {0},client={0};
        GetWindowRect( GetConsoleWindow() , &rect);
        GetClientRect( GetConsoleWindow(),&client);
        system("cls");
        width=client.right-client.left;
        height=client.bottom-client.top;
        PP("\n client: %3i x %3i",width,height);
        PP("\n Chars:  %3i x %3i",Chars.Y,Chars.X);
        height_pixel=height/Chars.Y;
        width_pixel=width/Chars.X;
        PP("\n type of letters: %2i x %2i",width_pixel,height_pixel);
        Sleep(55);// чтобы процессор меньше нагружать :)
    }
}
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 7
Комментарии
  1. Старый комментарий
    Аватар для Croessmah
    GetCurrentConsoleFont с GetConsoleFontSize чем не устроили?
    Запись от Croessmah размещена 08.03.2020 в 22:14 Croessmah вне форума
  2. Старый комментарий
    Аватар для fair7
    А где их взять эти функции,
    Code Block 13.12 их в "windows.h" не видет?
    Запись от fair7 размещена 08.03.2020 в 22:22 fair7 вне форума
  3. Старый комментарий
    Аватар для Croessmah
    емнип, они доступны, начиная с Windows XP.
    C++
    1
    
    #define _WIN32_WINNT 0x0500
    0x500 - это Windows 2000.

    Таблица значений: https://docs.microsoft.com/ru-... ew=vs-2019
    Запись от Croessmah размещена 08.03.2020 в 22:53 Croessmah вне форума
  4. Старый комментарий
    Аватар для fair7
    У вас получаться использовать GetConsoleFontSize и GetCurrentConsoleFont
    я накидал такой код:
    C++
    1
    2
    3
    4
    5
    6
    7
    
    #define _WIN32_WINNT_WINXP 0x0501 // Windows XP
    #include <windows.h>
    int main()
    {
        GetConsoleFontSize();GetCurrentConsoleFont();
        return 0;
    }
    но компилятор не видет такие функции.
    Запись от fair7 размещена 09.03.2020 в 14:59 fair7 вне форума
  5. Старый комментарий
    Аватар для Croessmah
    Цитата Сообщение от fair7
    я накидал такой код
    Для VS:
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    #include <Windows.h>
    #include <iostream>
     
    int main()
    {
        CONSOLE_FONT_INFO fontInfo;
        if (!GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), false, &fontInfo)) {
            return EXIT_FAILURE;
        }
        std::cout << "character geometry: " << fontInfo.dwFontSize.X << "x" << fontInfo.dwFontSize.Y;
    }
    Возможно, у вас на MinGW заголовок не полный. Можно сделать так:
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    #include <Windows.h>
    #include <iostream>
     
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    //__attribute((dllimport, stdcall)) 
    BOOL WINAPI GetCurrentConsoleFont(HANDLE hConsoleOutput, BOOL bMaximumWindow, PCONSOLE_FONT_INFO lpConsoleCurrentFont);
     
    #ifdef __cplusplus
    }
    #endif
     
    int main()
    {
        CONSOLE_FONT_INFO fontInfo;
        if (!GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), false, &fontInfo)) {
            return EXIT_FAILURE;
        }
        std::cout << "character geometry: " << fontInfo.dwFontSize.X << "x" << fontInfo.dwFontSize.Y;
    }
    Запись от Croessmah размещена 09.03.2020 в 21:22 Croessmah вне форума
  6. Старый комментарий
    Аватар для fair7
    эта программа показывает размер буфера в символах, а как размер символа показать?
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    #include <Windows.h>
    #include <stdio.h>
    #define PP printf
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    //__attribute((dllimport, stdcall))
    BOOL WINAPI GetCurrentConsoleFont(HANDLE hConsoleOutput, BOOL bMaximumWindow, PCONSOLE_FONT_INFO lpConsoleCurrentFont);
     
    #ifdef __cplusplus
    }
    #endif
     
    int main()
    {
        CONSOLE_FONT_INFO fontInfo;
        GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), false, &fontInfo);
        PP("character geometry: %i",fontInfo.dwFontSize.X),PP("x %i\n",fontInfo.dwFontSize.Y);
        GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), true, &fontInfo);
        PP("character geometry: %i",fontInfo.dwFontSize.X),PP("x %i\n",fontInfo.dwFontSize.Y);
        system("pause");
    }
    ещё
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    #include <stdio.h>
    #include <windows.h>
    #define PP printf
     
    CONSOLE_SCREEN_BUFFER_INFO csbiData;
     
    int main()
    {
        DWORD dwWidht, dwHeightWnd, dwHeightBuf, dwErrCode;
        CHAR* szSysMsg = NULL; //LPTSTR lpszSysMsg = NULL;
        BOOL bRet;
        HANDLE hWndCon = GetStdHandle(STD_OUTPUT_HANDLE);
        if (FALSE != hWndCon)GetConsoleScreenBufferInfo(hWndCon, &csbiData);
     
        dwWidht = csbiData.dwSize.X; // Ширина буфера / окна
        dwHeightBuf = csbiData.dwSize.Y; // Высота буфера
        dwHeightWnd = csbiData.srWindow.Bottom + 1; // Высота окна
        PP(" Size: %i",dwHeightWnd),PP(" (%i",dwHeightBuf),PP(") x %i",dwWidht),PP(" symbols\n");
     
        system("pause");
        return EXIT_SUCCESS;
    }
    Запись от fair7 размещена 10.03.2020 в 21:50 fair7 вне форума
  7. Старый комментарий
    Аватар для fair7
    я нашёл в документации
    C++
    1
    2
    3
    4
    
    COORD WINAPI GetConsoleFontSize(
      _In_ HANDLE hConsoleOutput,
      _In_ DWORD  nFont
    );
    но как этим воспользоваться??
    Запись от fair7 размещена 10.03.2020 в 22:27 fair7 вне форума
 
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru