Нужна помощь с font size в индикаторах (некорректно отображаются надписи на разных мониторах)

 

День добрый! Мне нужен пример реализации в коде для устранения такой вот ситуации:

У меня нормально - 

1

у другого нет - 

2

текст везде растянутый, изменение размера шрифта стандартно

ObjectSetInteger(0,name,OBJPROP_FONTSIZE,8);

не работает

 
Добрый день.
Такая ситуация возникает, если в системе стоит отличное от стандартной величины количество точек на дюйм. Обычно 96 точек или 100%.
Чтобы узнать в индикаторе это значение используйте следующую функцию:
TerminalInfoInteger(TERMINAL_SCREEN_DPI)
 
Igor Korepin:
Добрый день.
Такая ситуация возникает, если в системе стоит отличное от стандартной величины количество точек на дюйм. Обычно 96 точек или 100%.
Чтобы узнать в индикаторе это значение используйте следующую функцию:

Спасибо, нашёл подобную тему при этом https://www.mql5.com/ru/forum/226636 прикол в том, что я там задавал тот же вопрос :) Просто там есть пример в справке

Пример вычисления коэффициента масштабирования:

//--- создаём кнопку шириной 1.5 дюйма на экране
int screen_dpi = TerminalInfoInteger(TERMINAL_SCREEN_DPI); // получим DPI монитора пользователя
int base_width = 144;                                      // базовая ширина в экранных точках для стандартных мониторов c DPI=96
int width      = (button_width * screen_dpi) / 96;         // вычислим ширину кнопки для монитора пользователя (с учётом его DPI)
...
 
//--- вычисление коэффициента масштабирования в процентах
int scale_factor=(TerminalInfoInteger(TERMINAL_SCREEN_DPI) * 100) / 96;
//--- использование коэффициента масштабирования
width=(base_width * scale_factor) / 100;

При таком использовании графический  ресурс будет иметь одинаковый на глаз размер на мониторах с различной разрешающей способностью. При этом размеры управляющих элементов (кнопки, окна диалогов и т.д.) будут соответствовать настройкам персонализации.

куда этот коэффициент масштабирования применить не могу понять?

Разрешение экрана или как работать с TerminalInfoInteger(TERMINAL_SCREEN_DPI)
Разрешение экрана или как работать с TerminalInfoInteger(TERMINAL_SCREEN_DPI)
  • 2018.02.03
  • www.mql5.com
Мой экран 1920 * 1080 разрешение Print(" Rezult "+TerminalInfoInteger(TERMINAL_SCREEN_DPI)); показывает 96 что это такое и от чего оно зависит...
 
Aliaksandr Kryvanos:

куда этот коэффициент масштабирования применить не могу понять?

Очевидно, что применять к размеру кнопок - умножать на этот коэффициент.

 

Было бы проще если бы у меня было 2 монитора и я бы сам видел, что делаю, а так обновлять продукт, просить покупателей проверять и снова по кругу... Я создаю кнопку, например

void Create_Button(string but_name, string label, int xsize, int ysize, int xdist, int ydist, int bcolor, int fcolor)
{
        if (ObjectFind(0, but_name) < 0)
        {
                if (!ObjectCreate(0, but_name, OBJ_BUTTON, 0, 0, 0))
                {
                        Print(__FUNCTION__,
                                ": failed to create the button! Error code = ", GetLastError());
                        return;
                }
        }
                ObjectSetString(0, but_name, OBJPROP_TEXT, label);
                ObjectSetInteger(0, but_name, OBJPROP_XSIZE, xsize);
                ObjectSetInteger(0, but_name, OBJPROP_YSIZE, ysize);
                ObjectSetInteger(0, but_name, OBJPROP_CORNER, CORNER_LEFT_UPPER);
                ObjectSetInteger(0, but_name, OBJPROP_XDISTANCE, xdist);
                ObjectSetInteger(0, but_name, OBJPROP_YDISTANCE, ydist);
                ObjectSetInteger(0, but_name, OBJPROP_BGCOLOR, bcolor);
                ObjectSetInteger(0, but_name, OBJPROP_COLOR, fcolor);
                ObjectSetInteger(0, but_name, OBJPROP_FONTSIZE, ButtonFontSize);
                ObjectSetInteger(0, but_name, OBJPROP_HIDDEN, true);
                ObjectSetInteger(0, but_name, OBJPROP_BORDER_TYPE, BORDER_RAISED);
}

вызываю

Create_Button("_alert_switcher", "EURUSD", 80, 15, x_axis, y_axis, clrGray, clrWhite);

Куда применить коэффициент?

 
Aliaksandr Kryvanos:

Куда применить коэффициент?

Видимо нужно рассчитывать координаты и размер каждой кнопки с учётом коэффициента.
Другой вариант - оставить размеры кнопок прежними и подбирать коэффициент для шрифта.

double scale=1-0.7*(TerminalInfoInteger(TERMINAL_SCREEN_DPI)-96)/96.0;
scale=(scale<0.5)?0.5:NormalizeDouble(scale,2);
uchar fontsize=uchar(MathCeil(12*scale));

Вы можете сами задать величину DPI в системе и посмотреть, что получится.

 
Aliaksandr Kryvanos:

Спасибо, нашёл подобную тему при этом https://www.mql5.com/ru/forum/226636 прикол в том, что я там задавал тот же вопрос :) Просто там есть пример в справке

Пример вычисления коэффициента масштабирования:

//--- создаём кнопку шириной 1.5 дюйма на экране
int screen_dpi = TerminalInfoInteger(TERMINAL_SCREEN_DPI); // получим DPI монитора пользователя
int base_width = 144;                                      // базовая ширина в экранных точках для стандартных мониторов c DPI=96
int width      = (button_width * screen_dpi) / 96;         // вычислим ширину кнопки для монитора пользователя (с учётом его DPI)
...
 
//--- вычисление коэффициента масштабирования в процентах
int scale_factor=(TerminalInfoInteger(TERMINAL_SCREEN_DPI) * 100) / 96;
//--- использование коэффициента масштабирования
width=(base_width * scale_factor) / 100;

При таком использовании графический  ресурс будет иметь одинаковый на глаз размер на мониторах с различной разрешающей способностью. При этом размеры управляющих элементов (кнопки, окна диалогов и т.д.) будут соответствовать настройкам персонализации.

куда этот коэффициент масштабирования применить не могу понять?

Почитайте о TextOut()