Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10

Как программно выяснить минимально допустимый размер любого шрифта?

08.11.2011, 01:26. Показов 2805. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У некоторых шрифтов размер может быть меньше 8, у некоторых 10 - минимум...
Как это можно выяснить во время выполнения?

Добавлено через 56 минут
Нашел в WinAPI функцию EnumFontFamiliesEx, она вроде предоставляет структуру с метрикой шрифтов, надо поковыряться...
Может, есть попроще способы?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.11.2011, 01:26
Ответы с готовыми решениями:

Изменить размер шрифта(программно)
Как изменить размер шрифта программно? Делаю так: TreeView1.Font.Size = Convert.ToInt32(TrackBar1.Value); Ну че то ругается при...

Программно изменить размер шрифта компонента
Используя MS Excel создать создать форму с текстовой строкой и набором кнопок, при нажатии на которые: размер шрифта надписи на форме...

Изменить размер шрифта в консольном приложении (программно)
Как изменить размер шрифта консоли, только размер, сам шрифт остаётся родной. ОС: Windows

5
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
08.11.2011, 01:39
ковыряйтесь...
Creating a font toolbar
Перебор шрифтов
хотя вам, имхо, нужна структура LOGFONT
2
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
08.11.2011, 11:04
Цитата Сообщение от BRcr Посмотреть сообщение
У некоторых шрифтов размер может быть меньше 8, у некоторых 10 - минимум...
Как это можно выяснить во время выполнения?

Добавлено через 56 минут
Нашел в WinAPI функцию EnumFontFamiliesEx, она вроде предоставляет структуру с метрикой шрифтов, надо поковыряться...
Может, есть попроще способы?
Если чего наковыряете - поделитесь, плз
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
08.11.2011, 23:37  [ТС]
C++
1
2
3
for (int i=8;i<40;i+=2) {
  FontSizeCombo->Items->Add(i);
}
This code puts font sizes from 8 to 40 in the font size combo box, showing only even font sizes. Some programs use a rather odd algorithm for displaying font sizes in their font size selection combo boxes. You can follow those conventions or you can just go the easy route and use our code.
Source: Creating a font toolbar, by Kent Reisdorph.
Этот пассаж особенно порадовал А че париться? 8 - 40 и алга, побоку, какой там шрифт!

В большинстве источников целью является перечисление свойств всех доступных в системе и для данного device context шрифтов. Полезная вещь, кстати, где-то можно обойтись и без FontDialog.
Здесь описывается конкретно перечисление размеров шрифта: Enumerating Fonts
В тексте статьи даны не шибко понятные вырезки кода, т.к. отсутствуют некоторые декларации, но в конце статьи прикреплен файл enumfixedfonts.c, где все предельно ясно.

Вот, маленько допинал способ получить размеры одного шрифта:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#define MAX_SIZES_AMOUNT 200
int currentsizes[MAX_SIZES_AMOUNT];
int cursize;
 
int CALLBACK FontEnumProc(
  ENUMLOGFONTEX *plf,    // данные логического шрифта
  NEWTEXTMETRICEX *ptm,  // данные физического шрифта
  DWORD FontType,           // тип шрифта
  LPARAM lParam             // данные определяемые приложением
);
//---------------------------------------------------------------------------
void __fastcall TSDIAppForm::choose_font_btnClick(TObject *Sender)
{
  if ( FontDialog1->Execute() ){
    this->Font->Assign(FontDialog1->Font);
  }
}
//---------------------------------------------------------------------------
void __fastcall TSDIAppForm::get_font_info_btnClick(TObject *Sender)
{
  int i, j;
  LOGFONT logfont;
  ZeroMemory( &logfont, sizeof(logfont) );
 
  logfont.lfHeight = 0;
  logfont.lfCharSet = this->Font->Charset;        // типы параметров соответствуют, можно присвоить
  if ( FAILED( StringCchCopy(logfont.lfFaceName,  // минус один возможный buffer overflow в нашей программе :)
                     sizeof(logfont.lfFaceName)/sizeof(logfont.lfFaceName[0]),
                     this->Font->Name.c_str()) ) ){
     ShowMessage("Font name is too long and thus it doesn't complies with standarts for font names.\nPlease, choose another font.");
     return;
  }
  logfont.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;  // свойство lfPitchAndFamily битовое и состоит из двух половинок: собственно, pitch и family - объединяем их оператором |
 
  cursize = 0;                         // обнулим счетчик для нового шрифта
  EnumFontFamiliesEx(Canvas->Handle,            // передаем информацию о нашем шрифте функции; FontEnumProc будет обрабатывать результаты
             &logfont,
             (WNDENUMPROC)FontEnumProc,
             0,                         // можно чего-нить передать функции FontEnumProc: любой указатель или целое число
             0);                        // этот параметр зарезервирован, он должен равняться нулю
 
  String temp;
  if (cursize >= 0){
    temp += IntToStr(currentsizes[0]);
    for (i = 1; i < cursize; i++) {
         temp += ", " + IntToStr(currentsizes[i]) ;
    }
    temp += ".";
  }
  else temp = "any sizes, as this is a TrueType or OpenType font.";
 
  SDIAppForm->Memo1->Lines->Add( "\"" + this->Font->Name + "\"" + " font possible sizes are: " + temp);
}
//---------------------------------------------------------------------------
int CALLBACK FontEnumProc( ENUMLOGFONTEX *plf, NEWTEXTMETRICEX *ptm, DWORD FontType, LPARAM lParam)
{
   int i;
 
    if(FontType == RASTER_FONTTYPE )
    {
        int  logsize    = ptm->ntmTm.tmHeight - ptm->ntmTm.tmInternalLeading;              // высота символа без верхнего отступа в логических единицах
        long pointsize  = MulDiv(logsize,
                                 72,
                                 GetDeviceCaps(SDIAppForm->Canvas->Handle, LOGPIXELSY)); // высота символа в пикселях
 
        for(i = 0; i < cursize; i++)        // проверка наличия дубликатов в уже инициализированной части массива
            if(currentsizes[i] == pointsize)
               return 1;                    // пусть EnumFontFamiliesEx() продолжает вызывать данную функцию
 
        currentsizes[cursize] = pointsize;  //записываем текущий размер в массив
 
        if(++cursize == MAX_SIZES_AMOUNT)   // MAX_SIZES_AMOUNT определено с помощью #define
           return 0;                        // пусть EnumFontFamiliesEx() перестанет вызывать данную функцию
 
        return 1;                           // пусть EnumFontFamiliesEx() продолжает вызывать данную функцию
    }
    else // шрифты TrueType и OpenType векторные, им можно задать любой размер; другое дело, как они после этого отрисуются :)
    {
        cursize = -1;
        return 0;  // пусть EnumFontFamiliesEx() перестанет вызывать данную функцию
    }
}
Вот результат:
показать текст
"Tahoma" font possible sizes are: any sizes, as this is a TrueType or OpenType font.
"Terminal" font possible sizes are: 9, 2, 4, 14, 12, 6.
"System" font possible sizes are: 10.
"JournalSansC" font possible sizes are: any sizes, as this is a TrueType or OpenType font.
"Fixedsys" font possible sizes are: 10.
"Courier" font possible sizes are: 10, 12, 15.
"MS Sans Serif" font possible sizes are: 8, 10, 12, 14, 18, 24.
"MS Serif" font possible sizes are: 8, 10, 12, 14, 18, 24, 6, 7.
"Small Fonts" font possible sizes are: 2, 3, 4, 5, 6, 7, 8.
"Times New Roman" font possible sizes are: any sizes, as this is a TrueType or OpenType font.


Если строчку
C++
1
if(FontType == RASTER_FONTTYPE )
оставить такой, как в указанной выше статье
C++
1
if(FontType != TRUETYPE_FONTTYPE)
то под раздачу попадают также шрифты DEVICE_FONTTYPE, при этом у них перечисление размеров работает крайне странно - функция FontEnumProc() может быть вызвана один раз или несколько, но размер всегда на выходе получается один: 24.
То же самое происходит, если попробовать перечислить размеры TRUETYPE_FONTTYPE.

Получается, фиксированные размеры шрифта могут быть только у растровых шрифтов(RASTER_FONTTYPE), а остальные свободно масштабируются?

Все, вроде, ясно... НО!
Что-то не до конца понятна работа функции EnumFontFamiliesEx()...
В данном случае она, предположительно, работает так:
- шрифты .ttf она определяет как TRUETYPE_FONTTYPE;
- шрифты .otf она определяет как DEVICE_FONTTYPE;
- шрифты .fon, понятное дело, как RASTER_FONTTYPE.

Однако в справке написано, что FontType "can be a combination of these values".
В MSDN также нашел такое:
показать текст
The AND (&) operator can be used with the RASTER_FONTTYPE, DEVICE_FONTTYPE, and TRUETYPE_FONTTYPE constants to determine the font type. If the RASTER_FONTTYPE bit is set, the font is a raster font. If the TRUETYPE_FONTTYPE bit is set, the font is a TrueType font. If neither bit is set, the font is a vector font. DEVICE_FONTTYPE is set when a device (for example, a laser printer) supports downloading TrueType fonts or when the font is a device-resident font; it is zero if the device is a display adapter, dot-matrix printer, or other raster device. An application can also use DEVICE_FONTTYPE to distinguish graphics device interface (GDI)-supplied raster fonts from device-supplied fonts. GDI can simulate bold, italic, underline, and strikeout attributes for GDI-supplied raster fonts, but not for device-supplied fonts.


Какие могут быть комбинации и что это будет значить?
2
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
09.11.2011, 00:25
BRcr, Спасибо, работа проделана серьезная. Буду потихонечку пытаться разобраться и в вашем посте и в доступных материалах.
Вообще работа с фонтами в Винде поставлена "замечательно". Так, я столкнулся с такой ситуацией. У меня есть собственный рукодельный шрифт, ни на что не похожий, там вместо буковок - символы планет. Ну имею я право? Есть шрифты с шахматными фигурками - и ничего! Так вот, никакими силами мне не удалось вызвать именно конкретный ФАЙЛ этого фонта. Я должен дать ему (фонту) имя, сделать AddFontResourse этому файлу, а потом, помолясь, назначить его канве по ИМЕНИ, надеясь что у моего юзера другого фонта с этим именем нет (а юзеров - много!). Когда что-то в фонте меняется (добавляются планетки, то да се) - новая головная боль. При этом ничего не мешает моим юзерам этот фонт УСТАНОВИТЬ В СИСТЕМЕ. И прошлый (установленный) вариант конфликтует с новым.
В Вин-Апи вообще бардак, с этим, кажись никто не спорит, но ИМХО, квинтэссенция этого бардака - в работе с фонтами.
1
09.11.2011, 20:14  [ТС]

Не по теме:

Цитата Сообщение от Байт Посмотреть сообщение
...
надеясь что у моего юзера другого фонта с этим именем нет
...
При этом ничего не мешает моим юзерам этот фонт УСТАНОВИТЬ В СИСТЕМЕ. И прошлый (установленный) вариант конфликтует с новым.
...
Почему бы не добавить в имя шрифта его версию? Тогда каждая модифицированная копия будет иметь уникальное имя... юзверям можно будет выбирать между ними, например.

Либо вообще распространять данный шрифт исключительно в виде установочной программы с зашитым внутри нее шрифтом. Такая программка сможет не только корректно ставить новый шрифт, удалив другую установленную версию, но еще, к примеру, сможет выполнить диагностику на предмет наличия конфликта шрифтов в системе и устранить конфликт.

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.11.2011, 20:14
Помогаю со студенческими работами здесь

Увеличить допустимый размер вложений
Всем доброго времени! Начинаю помаленьку осваивать WP. Совсем зелёный нуб. Вопрос: каким образом поднять ограничение на допустимый...

Сделать размер шрифта приложения инвариантным по отношению к системным настройкам размера шрифта
чтобы размер шрифта был фиксирован и постоянен, вне зависимости от настроек. очень нужно.

Как изменить размер шрифта
как изменить размер шрифта в формате оси ???????.очень нужно в курсовой работе.помогите пожалуйста.дайте коды на это

Как изменить размер шрифта?
Я новичок!) Этот код работает. Как мне изменить размер шрифта этого + / - ? Как то они очень маленькие ... $(document).ready(function(){...

Как менять размер шрифта?
Как менять размер шрифта?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru