Вы вначале реализуйте прототип, рабочий и функциональный и быстрый, который вас устраивает
Вот его выкидывайте на обсуждение, и если он реально будет удобным, будет что обсуждать в СД.
Или используйте канвас и рисуйте что хотите и как хотите.
1 вот честно не совсем понимаю какой я могу сделать прототип( идея простая и заключается в следующем, сделать возможность, в графических фигурах вместо картинок использовать подложку в виде BMP файла, что бы он растягивался автоматически на всю площадь фигуры, (по принципу как он устанавливается в объекте Bitmap) 2 скажите пожалуйста, в начале этой ветки есть картинка , если я буду рисовать фигуры в Canvas при наложении друг на друга я получу желаемый результат? мне нужно в тех местах. где вопросы на картинке. выше в этой ветке. иметь красный цвет (такой же как цвет фигур) если да. то я без проблем. это будет делать через Canvas
1 вот честно не совсем понимаю какой я могу сделать прототип( идея простая и заключается в следующем, сделать возможность, в графических фигурах вместо картинок использовать подложку в виде BMP файла, что бы он растягивался автоматически на всю площадь фигуры, (по принципу как он устанавливается в объекте Bitmap) 2 скажите пожалуйста, в начале этой ветки есть картинка , если я буду рисовать фигуры в Canvas при наложении друг на друга я получу желаемый результат? мне нужно в тех местах. где вопросы на картинке. выше в этой ветке. иметь красный цвет (такой же как цвет фигур) если да. то я без проблем. это будет делать через Canvas
//+------------------------------------------------------------------+//| CanvasFigura.mq5 |//| Copyright 2017, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2017, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"#property script_show_inputs//Выводить окно со свойствами перед запуском скрипта#include <Canvas\Canvas.mqh>
inputbool top=false; // рисовать под графиком?inputENUM_COLOR_FORMAT format=COLOR_FORMAT_ARGB_NORMALIZE; //Способ обработки цветаinputuchar transp=255; // прозрачность от 0 до 255. 0 - полностью прозрачный, 255 - непрозрачныйvoidOnStart()
{
ChartSetInteger(0,CHART_FOREGROUND,top);
int Width =(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS); // получаем Ширину окнаint Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // получаем Высоту окнаuint ColorScreen=(color)ChartGetInteger(0,CHART_COLOR_BACKGROUND,0); // получаем цвет фона
CCanvas canvas;
if(!canvas.CreateBitmapLabel("SampleCanvas",0,0,Width,Height,format)) Print("Error creating canvas: ",GetLastError());
canvas.Erase(ColorScreen);
canvas.FillCircle(Width/4,Height/2,Height/3,ColorToARGB(clrRed,transp));
canvas.FillRectangle(3*Width/8,2*Height/8,5*Width/8,6*Height/8,ColorToARGB(clrRed,transp));
canvas.FillTriangle(11*Width/20,14*Height/20,17*Width/20,14*Height/20,14*Width/20,5*Height/20,ColorToARGB(clrRed,transp));
canvas.Update();
Sleep(3000);
// меняем цвета и прозрачность. Прозрачность работает только при format=COLOR_FORMAT_ARGB_NORMALIZEuchar r=0,g=80,b=160,tr=200;
while(!IsStopped())
{
canvas.Erase(ColorScreen);
uint clr=(tr<<24)|(r<<16)|(g<<8)|b;
canvas.FillCircle(Width/4,Height/2,Height/3,(tr<<24)|(r<<16)|(g<<8)|b);
canvas.FillRectangle(3*Width/8,2*Height/8,5*Width/8,6*Height/8,(tr<<24)|(g<<16)|(b<<8)|r);
canvas.FillTriangle(11*Width/20,14*Height/20,17*Width/20,14*Height/20,14*Width/20,5*Height/20,(tr<<24)|(b<<16)|(r<<8)|g);
canvas.Update();
tr++;
g+=2;
b+=3;
r+=4;
Sleep(33);
}
canvas.Destroy();
}
//+------------------------------------------------------------------+
сделать и съесть я могу сам.. мне бы понять будет оно работать как мне нужно или нет) (есть ли такая техническая возможность)
а Bitmap буде потом автоматически изменять размер при изменении масштаба графика? там ведь привязка цена и время а две другие точки всё равно это пиксели..
или нужно будет отдельно под каждый масштаб делать размер фигуры?
Pavel Verveyko: сделать и съесть я могу сам.. мне бы понять будет оно работать как мне нужно или нет) (есть ли такая техническая возможность)
а Bitmap буде потом автоматически изменять размер при изменении масштаба графика? там ведь привязка цена и время а две другие точки всё равно это пиксели..
или нужно будет отдельно под каждый масштаб делать размер фигуры?
Нет, при использовании CreateBitmap для привязки к графику, привязываться будет только начало (левый верхний угол) канваса, и при масштабировании размер канваса меняться не будет в текущей реализации класса CCanvas. Но вам никто не мешает считывать изменение масштаба графика через событие CHARTEVENT_CHART_CHANGE и реализовать синхронное изменение маcштаба самого канваса или масштаба объектов внутри него. Класс CCanvas не догма, а лишь пример реализации пользовательской графики, причем далеко не самый лучший, и вы можете создать свой аналогичный класс, свою систему масштабируемых координат и т.д. Павел, вы же опытный программист судя по количеству ваших продуктов. К чему тогда эти странные вопросы? Изучите класс CCanvas в файле: "..\MQL5\Include\Canvas\Canvas.mqh" и станет всё ясно. Лично я использую из этого класса только создание самого канваса и массив его точек m_pixels[], который имеет размерность m_width*m_height, формируя свои собственные функции.
Нет, при использовании CreateBitmap для привязки к графику, привязываться будет только начало (левый верхний угол) канваса, и при масштабировании размер канваса меняться не будет в текущей реализации класса CCanvas. Но вам никто не мешает считывать изменение масштаба графика через событие CHARTEVENT_CHART_CHANGE и реализовать синхронное изменение маcштаба самого канваса или масштаба объектов внутри него. Класс CCanvas не догма, а лишь пример реализации пользовательской графики, причем далеко не самый лучший, и вы можете создать свой аналогичный класс, свою систему масштабируемых координат и т.д. Павел, вы же опытный программист судя по количеству ваших продуктов. К чему тогда эти странные вопросы? Изучите класс CCanvas в файле: "..\MQL5\Include\Canvas\Canvas.mqh" и станет всё ясно. Лично я использую из этого класса только создание самого канваса и массив его точек m_pixels[], который имеет размерность m_width*m_height, формируя свои собственные функции.
спасибо за ответ, думал не ответите)
изменение масштаба меня не пугает, я делал тестер ручной торговли, там это вынужденная мера, а вот когда у меня 1000 фигур, все разной высоты и ширины; перестраивать их по масштабу( мне кажется не приемлемым с точки зрения ресурсозатратности тем более что это индикатор(((
вопросы к тому, что я не смогу с помощью канваса решить свой вопрос а мне все советуют этот канвас. по сути, что ООП, что просто функции, они все делают одно и то же..
мне нужно либо, что бы объект прямоугольник заполнялся bmp файлом, либо BitMap ширину и высоту высчитывал не на основе пикселей а на основе цены и времени то есть правый край тоже должен быть привязан к цене и времени изначально без перестройки по масштабу.. я вот давно заметил язык MQL простой но вот пути решений для достижения определённых результатов иногда слишком длинные
попробую при свободном времени перестраивать размер фигур построенные в канвасе как Bitmap за масштабом , но думаю придётся отказаться от идем залитых фигур. и пользоваться фигурами 14 летней давности) и если рисовать Bitmapы и менять их под масштаб то и canvas не нужен(
мне нужно либо, что бы объект прямоугольник заполнялся bmp файлом, либо BitMap ширину и высоту высчитывал не на основе пикселей а на основе цены и времени то есть правый край тоже должен быть привязан к цене и времени изначально без перестройки по масштабу..
Так ведь другого варианта не существует, как только через создание канвасa посредством CreateBitmap. Или мы просто путаемся в определениях. Канвас это и есть BitMap! Просто в классе CCanvas и создаётся этот BitMap, и с объектом класса удобнее работать.
Или вы не дружите с ООП и просто его боитесь? Тогда пора подружиться. :))
P.S. не понимаю куда делось моё предыдущее сообщение. Лень писать заново.
Nikolai Semko: Так ведь другого варианта не существует, как только через создание канвасa посредством CreateBitmap. Или мы просто путаемся в определениях. Канвас это и есть BitMap! Просто в классе CCanvas и создаётся этот BitMap, и с объектом класса удобнее работать.
Или вы не дружите с ООП и просто его боитесь? Тогда пора подружиться. :))
P.S. не понимаю куда делось моё предыдущее сообщение. Лень писать заново.
ага, только сейчас обратил внимание) что графические фигуры в другом классе а здесь только Bitmap. в любом случае под мои потребности и в контексте этой задачи ни то не другое не подходит( а жаль
с ООП дружу , но использую его исключительно в очень больших размерах кода, там где без него нельзя.. в мелких масштабах неООП как то логику алгоритмов удобнее думать .. может правда это просто привычка)
жаль что сообщение пропало , наверно что-то толковое было.. (у меня есть золотое правило, прежде чем нажать : отправить, обновить; нужно нажать ctrl+a и ctrl+c)
ага, только сейчас обратил внимание) что графические фигуры в другом классе а здесь только Bitmap. в любом случае под мои потребности и в контексте этой задачи ни то не другое не подходит( а жаль
с ООП дружу , но использую его исключительно в очень больших размерах кода, там где без него нельзя.. в мелких масштабах неООП как то логику алгоритмов удобнее думать .. может правда это просто привычка)
жаль что сообщение пропало , наверно что-то толковое было.. (у меня есть золотое правило, прежде чем нажать : отправить, обновить; нужно нажать ctrl+a и ctrl+c)
Из ваших слов, Павел, я пока могу сделать только один вывод. Вы не понимаете, что такое BitMap и суть класса CCanvas. Canvas в переводе с английского - холст. Т.е. вы формируете в пределах своего окна холст, на котором можете нарисовать что угодно, и при этом можете даже выключить сам график, или этот график рисовать уже в канвасе. У вас есть доступ к любой точке, вы можете формировать любые фигуры с любой заливкой, в том числе градиентной. Даже, если задаться целью, вы можете с помощью канваса создать видео плеер в МТ, графический редактор сложности фотошопа, 3D игру, да хоть виртуальную ОС написать. А вы говорите - не подходит. Нет такой графической задачи, которой нельзя было бы решить в канвасе. Другое дело скорость. Но, я думаю, вы также недооцениваете скорость канваса. Тем более если у вас 1000 объектов, - только канвас, т.к. канвас это один объект, на котором можно нарисовать сколько угодно фигур, а не так как при использовании обычных встроенных в МТ5 фигур, которые представляет каждая из себя объект. А если бы оценивали быстродействие рисования, то поняли бы что формирование объекта достаточно ресурсоёмкое дело. Прикреплю один пример - скрипт в виде исполняемого файла на МТ5 и можете оценить скорость карваса. В примере рисуются сглаженные закрашенные круги в случайном порядке и случайного цвета и плавно меняют свой размер. Попробуйте при запуске этого скрипта, поставьте задержку между кадрами 0 миллисекунд и количество окружностей 1000. Вы даже задержки не увидите. Я увидел задержку между кадрами где то в 0.2-0.3 секунды при количестве окружностей 10 000. Т.е. в каждом кадре прорисовываются все 10000 окружностей с радиусами от 20 до 200 (по умолчанию) и накладываются друг на друга, причем формирование окружности и ее закрашивание происходит попиксельно.
Вы вначале реализуйте прототип, рабочий и функциональный и быстрый, который вас устраивает
Вот его выкидывайте на обсуждение, и если он реально будет удобным, будет что обсуждать в СД.
Или используйте канвас и рисуйте что хотите и как хотите.
1 вот честно не совсем понимаю какой я могу сделать прототип( идея простая и заключается в следующем, сделать возможность, в графических фигурах вместо картинок использовать подложку в виде BMP файла, что бы он растягивался автоматически на всю площадь фигуры,
(по принципу как он устанавливается в объекте Bitmap)
2 скажите пожалуйста, в начале этой ветки есть картинка , если я буду рисовать фигуры в Canvas при наложении друг на друга я получу желаемый результат? мне нужно в тех местах. где вопросы на картинке. выше в этой ветке. иметь красный цвет (такой же как цвет фигур)
если да. то я без проблем. это будет делать через Canvas
1 вот честно не совсем понимаю какой я могу сделать прототип( идея простая и заключается в следующем, сделать возможность, в графических фигурах вместо картинок использовать подложку в виде BMP файла, что бы он растягивался автоматически на всю площадь фигуры,
(по принципу как он устанавливается в объекте Bitmap)
2 скажите пожалуйста, в начале этой ветки есть картинка , если я буду рисовать фигуры в Canvas при наложении друг на друга я получу желаемый результат? мне нужно в тех местах. где вопросы на картинке. выше в этой ветке. иметь красный цвет (такой же как цвет фигур)
если да. то я без проблем. это будет делать через Canvas
большое спасибо) скажите пожалуйста,
изменение масштаба, размер фигур и точки их привязок не связаны?
потому как фагуры только по пикселям строятся?
(стандартные фигуры строятся по координатам цены и времени)
c помощью BitmapLab можно и без Canvas нарисовать просто фигуры привязаны к графику а эти к монитору(ещё раз спасибо, вечером попробую покрутить canvas вдруг чё и выйдет
большое спасибо) скажите пожалуйста,
изменение масштаба, размер фигур и точки их привязок не связаны?
потому как фагуры только по пикселям строятся?
(стандартные фигуры строятся по координатам цены и времени)
c помощью BitmapLab можно и без Canvas нарисовать просто фигуры привязаны к графику а эти к монитору(ещё раз спасибо, вечером попробую покрутить canvas вдруг чё и выйдет
Можно привязывать к пикселям экрана, а можно и ко времени. Для этого существуют различные способы привязки объектов. В классе CCanvas это Create, CreateBitmap, CreateBitmapLabel.
Изучайте первоисточники и экспериментируйте. А то будет как в известном мультике:))
Можно привязывать к пикселям экрана, а можно и ко времени. Для этого существуют различные способы привязки объектов. В классе CCanvas это Create, CreateBitmap, CreateBitmapLabel.
Изучайте первоисточники и экспериментируйте. А то будет как в известном мультике:))
а Bitmap буде потом автоматически изменять размер при изменении масштаба графика?
там ведь привязка цена и время а две другие точки всё равно это пиксели..
или нужно будет отдельно под каждый масштаб делать размер фигуры?
сделать и съесть я могу сам.. мне бы понять будет оно работать как мне нужно или нет) (есть ли такая техническая возможность)
а Bitmap буде потом автоматически изменять размер при изменении масштаба графика?
там ведь привязка цена и время а две другие точки всё равно это пиксели..
или нужно будет отдельно под каждый масштаб делать размер фигуры?
Нет, при использовании CreateBitmap для привязки к графику, привязываться будет только начало (левый верхний угол) канваса, и при масштабировании размер канваса меняться не будет в текущей реализации класса CCanvas. Но вам никто не мешает считывать изменение масштаба графика через событие CHARTEVENT_CHART_CHANGE и реализовать синхронное изменение маcштаба самого канваса или масштаба объектов внутри него. Класс CCanvas не догма, а лишь пример реализации пользовательской графики, причем далеко не самый лучший, и вы можете создать свой аналогичный класс, свою систему масштабируемых координат и т.д. Павел, вы же опытный программист судя по количеству ваших продуктов. К чему тогда эти странные вопросы? Изучите класс CCanvas в файле: "..\MQL5\Include\Canvas\Canvas.mqh" и станет всё ясно. Лично я использую из этого класса только создание самого канваса и массив его точек m_pixels[], который имеет размерность m_width*m_height, формируя свои собственные функции.
Нет, при использовании CreateBitmap для привязки к графику, привязываться будет только начало (левый верхний угол) канваса, и при масштабировании размер канваса меняться не будет в текущей реализации класса CCanvas. Но вам никто не мешает считывать изменение масштаба графика через событие CHARTEVENT_CHART_CHANGE и реализовать синхронное изменение маcштаба самого канваса или масштаба объектов внутри него. Класс CCanvas не догма, а лишь пример реализации пользовательской графики, причем далеко не самый лучший, и вы можете создать свой аналогичный класс, свою систему масштабируемых координат и т.д. Павел, вы же опытный программист судя по количеству ваших продуктов. К чему тогда эти странные вопросы? Изучите класс CCanvas в файле: "..\MQL5\Include\Canvas\Canvas.mqh" и станет всё ясно. Лично я использую из этого класса только создание самого канваса и массив его точек m_pixels[], который имеет размерность m_width*m_height, формируя свои собственные функции.
спасибо за ответ, думал не ответите)
изменение масштаба меня не пугает, я делал тестер ручной торговли, там это вынужденная мера,
а вот когда у меня 1000 фигур, все разной высоты и ширины; перестраивать их по масштабу( мне кажется не приемлемым с точки зрения ресурсозатратности тем более что это индикатор(((
вопросы к тому, что я не смогу с помощью канваса решить свой вопрос а мне все советуют этот канвас.
по сути, что ООП, что просто функции, они все делают одно и то же..
мне нужно либо, что бы объект прямоугольник заполнялся bmp файлом, либо BitMap ширину и высоту высчитывал не на основе пикселей а на основе цены и времени то есть правый край тоже должен быть привязан к цене и времени изначально без перестройки по масштабу..
я вот давно заметил язык MQL простой но вот пути решений для достижения определённых результатов иногда слишком длинные
попробую при свободном времени перестраивать размер фигур построенные в канвасе как Bitmap за масштабом , но думаю придётся отказаться от идем залитых фигур. и пользоваться фигурами 14 летней давности)
и если рисовать Bitmapы и менять их под масштаб то и canvas не нужен(
мне нужно либо, что бы объект прямоугольник заполнялся bmp файлом, либо BitMap ширину и высоту высчитывал не на основе пикселей а на основе цены и времени то есть правый край тоже должен быть привязан к цене и времени изначально без перестройки по масштабу..
Так ведь другого варианта не существует, как только через создание канвасa посредством CreateBitmap. Или мы просто путаемся в определениях. Канвас это и есть BitMap! Просто в классе CCanvas и создаётся этот BitMap, и с объектом класса удобнее работать.
ага, только сейчас обратил внимание) что графические фигуры в другом классе а здесь только Bitmap. в любом случае под мои потребности и в контексте этой задачи ни то не другое не подходит( а жаль
с ООП дружу , но использую его исключительно в очень больших размерах кода, там где без него нельзя.. в мелких масштабах неООП как то логику алгоритмов удобнее думать .. может правда это просто привычка)
жаль что сообщение пропало , наверно что-то толковое было.. (у меня есть золотое правило, прежде чем нажать : отправить, обновить; нужно нажать ctrl+a и ctrl+c)
ага, только сейчас обратил внимание) что графические фигуры в другом классе а здесь только Bitmap. в любом случае под мои потребности и в контексте этой задачи ни то не другое не подходит( а жаль
с ООП дружу , но использую его исключительно в очень больших размерах кода, там где без него нельзя.. в мелких масштабах неООП как то логику алгоритмов удобнее думать .. может правда это просто привычка)
жаль что сообщение пропало , наверно что-то толковое было.. (у меня есть золотое правило, прежде чем нажать : отправить, обновить; нужно нажать ctrl+a и ctrl+c)
Из ваших слов, Павел, я пока могу сделать только один вывод. Вы не понимаете, что такое BitMap и суть класса CCanvas. Canvas в переводе с английского - холст. Т.е. вы формируете в пределах своего окна холст, на котором можете нарисовать что угодно, и при этом можете даже выключить сам график, или этот график рисовать уже в канвасе. У вас есть доступ к любой точке, вы можете формировать любые фигуры с любой заливкой, в том числе градиентной. Даже, если задаться целью, вы можете с помощью канваса создать видео плеер в МТ, графический редактор сложности фотошопа, 3D игру, да хоть виртуальную ОС написать. А вы говорите - не подходит. Нет такой графической задачи, которой нельзя было бы решить в канвасе. Другое дело скорость. Но, я думаю, вы также недооцениваете скорость канваса. Тем более если у вас 1000 объектов, - только канвас, т.к. канвас это один объект, на котором можно нарисовать сколько угодно фигур, а не так как при использовании обычных встроенных в МТ5 фигур, которые представляет каждая из себя объект. А если бы оценивали быстродействие рисования, то поняли бы что формирование объекта достаточно ресурсоёмкое дело. Прикреплю один пример - скрипт в виде исполняемого файла на МТ5 и можете оценить скорость карваса. В примере рисуются сглаженные закрашенные круги в случайном порядке и случайного цвета и плавно меняют свой размер. Попробуйте при запуске этого скрипта, поставьте задержку между кадрами 0 миллисекунд и количество окружностей 1000. Вы даже задержки не увидите. Я увидел задержку между кадрами где то в 0.2-0.3 секунды при количестве окружностей 10 000. Т.е. в каждом кадре прорисовываются все 10000 окружностей с радиусами от 20 до 200 (по умолчанию) и накладываются друг на друга, причем формирование окружности и ее закрашивание происходит попиксельно.