Причина ошибки, скорее всего, в более "правильной" работе с кодировками в новом движке. Поэтому теперь чтобы корректно увидеть символы из шрифта для однобайтной кодировки, к которым относится Wingdings, надо осуществлять принудительную перекодировку строки текста, которая задаёт текст кнопки.
Для примера программы в этом посте в функции ButtonCreate() надо заменить эти две строки
//--- установим текст ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
Подобные замены, видимо, придётся делать во всех местах, где вызывается ObjectSetString(chart_ID,name,OBJPROP_TEXT,text), или где-то заранее.
Возможно, для других языковых операционных систем или языковых настроек ОС придётся делать какое-то другое преобразование. У меня на Windows 10 RU если значение переменной text берётся из входных параметров или задаётся в исходном коде в двойных кавычках, нужный результат даёт именно такая перекодировка.
При этом если текст на кнопке хотим вывести обычным шрифтом типа Arial, то перекодировку делать как раз нельзя.
Это просто кошмар. Пришлось повозиться, чтобы разобраться, что не нравится MT5. Выяснилось, что нельзя устанавливать текст после установки шрифта Wingdings. Точнее, в момент установки текста шрифт объекта должен быть не Wingdings. Поэтому вместо строки
Другая подлость была в функции CharToString(). Видимо, использовать её нежелательно. Если вы уже знаете коды нужных вам символов, то лучше поступить так:
а что случилось с Alpha слоем ? Даже в 5445 еще все работало после перехода на новый движок, в 5483 - вся полупрозрачность стала полностью непрозрачной.
Код:
#property copyright"Copyright 2025, MetaQuotes Ltd."#property link"https://www.mql5.com"#property version"1.00"#property indicator_chart_window//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- indicator buffers mappinguint bg[];
int w=300;
int h=200;
if (-1 == ArrayResize(bg,w*h))
{
Print("Out of Memory (DrawBG):",w," ",h);
returnINIT_FAILED;
}
ArrayFill(bg,0,w*h,0x77777777);
ResourceCreate("::TESTBG",bg,w,h,0,0,w,COLOR_FORMAT_ARGB_RAW);
ObjectCreate(0,"TestBG",OBJ_BITMAP_LABEL,0,0,0);
ObjectSetInteger(0,"TestBG",OBJPROP_XDISTANCE,50);
ObjectSetInteger(0,"TestBG",OBJPROP_YDISTANCE,50);
ObjectSetString(0,"TestBG",OBJPROP_BMPFILE,"::TESTBG");
ArrayFree(bg);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(const int32_t rates_total,
const int32_t prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
const int32_t &spread[])
{
//---//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+
Если проблема повторится, стоит узнать, как её воспроизвести.
Проблема воспроизводилась при закрытии и открытии Тестера (CTRL+R). Сразу происходил краш Терминала.
Думал, что причина в onnx реализации. Но через какое-то время ошибка воспроизводится перестала.
Билды выше b5440 пока не использую из-за воя об их сырости. Но если буду находить баги, то перед созданием отчета, конечно, проверю на последней бете.
Вот мой результат (хотя, я не заню, актуальна ли еще эта проблема).
Windows на английском языке, скриншот настроек прикрепил файлом.
Я попытался вставить с буффера обмена (не знаю, должно ли оно работать).
build 5480, таблица символов: https://en.wikipedia.org/wiki/Wingdings#Wingdings
Я попытался вставить с буффера обмена (не знаю, должно ли оно работать).
build 5480, таблица символов: https://en.wikipedia.org/wiki/Wingdings#Wingdings
Это не работает, языковая RU-система попала под санкции.
Я попытался вставить с буффера обмена (не знаю, должно ли оно работать).
build 5480, таблица символов: https://en.wikipedia.org/wiki/Wingdings#Wingdings
Обычно так не работает. Wingdings в MT5 — это шрифт, а не кодировка, текст должен использовать код ANSI (от 32 до 255).
На Википедии показана версия в формате Unicode, это кодировка, она работает не так, как в Unicode.
Причина ошибки, скорее всего, в более "правильной" работе с кодировками в новом движке. Поэтому теперь чтобы корректно увидеть символы из шрифта для однобайтной кодировки, к которым относится Wingdings, надо осуществлять принудительную перекодировку строки текста, которая задаёт текст кнопки.
Для примера программы в этом посте в функции ButtonCreate() надо заменить эти две строки
на такой код:
Подобные замены, видимо, придётся делать во всех местах, где вызывается ObjectSetString(chart_ID,name,OBJPROP_TEXT,text), или где-то заранее.
Возможно, для других языковых операционных систем или языковых настроек ОС придётся делать какое-то другое преобразование. У меня на Windows 10 RU если значение переменной text берётся из входных параметров или задаётся в исходном коде в двойных кавычках, нужный результат даёт именно такая перекодировка.
При этом если текст на кнопке хотим вывести обычным шрифтом типа Arial, то перекодировку делать как раз нельзя.
uchar chars[];
Что делаю не так?
Что делаю не так?
Это просто кошмар. Пришлось повозиться, чтобы разобраться, что не нравится MT5. Выяснилось, что нельзя устанавливать текст после установки шрифта Wingdings. Точнее, в момент установки текста шрифт объекта должен быть не Wingdings. Поэтому вместо строки
пришлось написать
Другая подлость была в функции CharToString(). Видимо, использовать её нежелательно. Если вы уже знаете коды нужных вам символов, то лучше поступить так:
Или можно так:
И затем уже массив chars преобразовывать в строку:
В общем, достаточно грустно выглядят эти танцы с бубном. Вот полный код, который давал результат:
Господа разработчики,
а что случилось с Alpha слоем ? Даже в 5445 еще все работало после перехода на новый движок, в 5483 - вся полупрозрачность стала полностью непрозрачной.
Код:
Было:
Стало: