Canvas - это круто! - страница 83

 

Спасибо всем, кто предлагает решение. Мне нужно некоторое время, чтобы всё проверить и применить к своим продуктам. То что может работать на простых продуктах, надо ещё проверить на более сложных. Идея с таймером реально топ. Не решает всех проблем, но решает другие заморочки, с которыми я сталкивался.

Никого не игнорирую. На следующей неделе смогу ответить, что получилось, что нет.

 
Canvas based indicators: Filling channels with transparency
Canvas based indicators: Filling channels with transparency
  • www.mql5.com
In this article I'll introduce a method for creating custom indicators whose drawings are made using the class CCanvas from standard library and see charts properties for coordinates conversion. I'll approach specially indicators which need to fill the area between two lines using transparency.
 
Nikolai Semko #:

Да, есть только один маленький недокументированный нюанс.
Если вы используете альфа-канал (COLOR_FORMAT_ARGB_NORMALIZE), то перед созданием растрового изображения вы должны заполнить его не нулями.

Иначе края символов будут "рваными".

Спасибо.


И спасибо за всю вашу бескорыстную работу над Canvas.

Я многому научился и имплементировал canvas в мои нерегулярные графики в mt4, (например, Renko), которые заменили тысячи графических объектов.

 
Jon_G #:

Спасибо.


И спасибо за всю вашу самоотверженную работу на Canvas.

Я многому научился и имплементировал canvas в мои нерегулярные графики в mt4, (например, Renko), которые заменили тысячи графиков-объектов.

Спасибо за добрые слова.

Да, тысячи объектов начинают невероятно замедлять работу интерфейса.
Это серьезное упущение MetaQuotes.
Хорошо построенный холст не вызывает лагов даже при 10 000 виртуальных объектов.

 

Code Base

PNG

Nikolai Semko, 2023.07.15 07:24

Forget about BMP files like a bad dream. With this library, you will now be able to use the more advanced and compact PNG image format for your programs.

Наконец-то реализовал работу c PNG.
Реализацию подсмотрел у @Zorro (https://www.mql5.com/ru/forum/92113#comment_2672596)
Проверьте пожалуйста. У меня вроде глюков пока не было. 



 
Nikolai Semko #:
Наконец-то реализовал работу c PNG.

Круто и полезно. Ради интереса, это можно использовать в МТ4?

 
Vitaliy Kuznetsov #:

Круто и полезно. Ради интереса, это можно использовать в МТ4?

Конечно
Надо попробовать. Думаю код останется почти тот же.
 

Nikolai, а Вы встречали где-нибудь готовый код на канвасе, который позволяет прокручивать окно?


 
Vitaliy Kuznetsov #:

Nikolai, а Вы встречали где-нибудь готовый код на канвасе, который позволяет прокручивать окно?


У Анатолия и Петра были реализации

Но не юзал. Поэтому не могу судить

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


//+------------------------------------------------------------------+
//|                                                 Canvas Panel.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0

#include <Canvas\Canvas.mqh>
CCanvas  canvas;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create canvas
   if(!canvas.CreateBitmapLabel(0, 0, "Dashboard", 40, 40, 400, 200, COLOR_FORMAT_ARGB_NORMALIZE))
   {
      Print("Error creating canvas: ", GetLastError());
      return(INIT_FAILED);
   }
   
   canvas.Erase(ColorToARGB(clrGray, 200));
   canvas.Update(true);

   ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, true);

//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy application dialog
   canvas.Destroy();
   ChartRedraw();
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
//---

//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{

}

//+------------------------------------------------------------------+
Файлы:
screenshot.png  18 kb