Библиотеки: Easy Canvas

 

Easy Canvas:

Данная библиотека и класс iCanvas упростит написание программ с применением Canvas.

Автор: Nikolai Semko

 

Версия 1.01

Новое: 

  • Реализована работа с подокнами
  • Добавлены в структуру Windows значения MouseSubWin, WindowsTotal, SubWin

   int               MouseSubWin; // текущий номер подокна, в котором находится указатель мыши
   int               WindowsTotal;// всего подокон, включая главное окно.
   int               SubWin;      // текущее подокно, к которому привязан Canvas
 

Версия 1.06

Исправлены некоторые ошибки и алогизмы.

если не нужен экземпляр класса Canvas на полное окно, то его можно удалить и (или) изменить на частичное окно

Например:

delete Canvas;
Canvas= new iCanvas(0,0,"iCanvas",300,0);          // только левая полоса окна шириной 300 пикселей. Изменение размеров окна контролируется 
// Canvas= new iCanvas(0,0,"iCanvas",0,300);       // только верхняя полоса окна высотой 300 пикселей. Изменение размеров окна контролируется 
// Canvas= new iCanvas(200,100,"iCanvas",300,300); // квадрат 300x300 пикселей со стартовой позицей в точке (200,100). Изменение размеров окна не контролируется 

так же можно создавать новые экземпляры класса и инициализировать их в момент создания 

например:

iCanvas C2(300,200,"Canvas2",200,150,COLOR_FORMAT_XRGB_NOALPHA,1);
 
Некоторые возможности данной библиотеки продемонстрированы здесь и здесь.
 
Версия для MT4 здесь
 
Версия 1.16: исправлены некоторые ошибки и убыстрены некоторые функции.
 
Версия 1.21: исправлены некоторые ошибки
 

Добрый день.

Может добавить? А то не запоминает )

void ChartChanged()
  {
   static int preWinTotal=W.WindowsTotal;
   if(W.Y_max==0 && CheckPointer(Canvas)!=POINTER_INVALID) {delete Canvas; Canvas=new iCanvas;}
   GetWindowProperties(W);
   if (preWinTotal!=W.WindowsTotal) for (int i=ArraySize(iC)-1; i>=0; i--) if(CheckPointer(iC[i])!=POINTER_INVALID) if (iC[i].SubWin>=W.WindowsTotal) iC[i].SubWin--;
   for (int i=ArraySize(iC)-1; i>=0; i--)
     {
      if(CheckPointer(iC[i])!=POINTER_INVALID)
         if(iC[i].FullWinCanvWidth())
           {
            if(iC[i].FullWinCanvHeight()) {if(W.Width!=WidOld || W.height[iC[i].SubWin]!=HeiOld[iC[i].SubWin] ) iC[i].Resize(W.Width,W.height[iC[i].SubWin]);}
            else {if(W.Width!=WidOld) iC[i].Resize(W.Width,iC[i].Height());}
           }
      else { if(iC[i].FullWinCanvHeight()) if(W.height[iC[i].SubWin]!=HeiOld[iC[i].SubWin]) {iC[i].Resize(iC[i].Width(),W.height[iC[i].SubWin]); HeiOld[iC[i].SubWin]=W.height[iC[i].SubWin];}}
      else ArrayRemove(iC,i,1);
     }
   WidOld=W.Width; 
   for(int i=ArraySize(iC)-1; i>=0; i--)        HeiOld[iC[i].SubWin] = W.height[iC[i].SubWin];
   preWinTotal=W.WindowsTotal;
   XYToTimePrice(0,0,W.MouseTime,W.MousePrice,CHARTEVENT_CHART_CHANGE);
  }
 
Oleksii Chepurnyi:

Добрый день.

Может добавить? А то не запоминает )

Спасибо!
Поправил в КБ.
Проверьте, пожалуйста, на своем коде. А то исправил не проверяя. Может что-то не учел.

void ChartChanged()
  {
   static int preWinTotal=W.WindowsTotal;
   if(W.Y_max==0 && CheckPointer(Canvas)!=POINTER_INVALID) {delete Canvas; Canvas=new iCanvas;}
   GetWindowProperties(W);
   if(preWinTotal!=W.WindowsTotal) for(int i=ArraySize(iC)-1; i>=0; i--) if(CheckPointer(iC[i])!=POINTER_INVALID) if(iC[i].SubWin>=W.WindowsTotal) iC[i].SubWin--;
   for(int i=ArraySize(iC)-1; i>=0; i--)
     {
      if(CheckPointer(iC[i])!=POINTER_INVALID)
         if(iC[i].FullWinCanvWidth())
           {
            if(iC[i].FullWinCanvHeight())
              {
               if(W.Width!=WidOld || W.height[iC[i].SubWin]!=HeiOld[iC[i].SubWin]) iC[i].Resize(W.Width,W.height[iC[i].SubWin]);
              }
            else {if(W.Width!=WidOld) iC[i].Resize(W.Width,iC[i].Height()); }
           }
      else
        {
         if(iC[i].FullWinCanvHeight())
            if(W.height[iC[i].SubWin]!=HeiOld[iC[i].SubWin]) iC[i].Resize(iC[i].Width(),W.height[iC[i].SubWin]);
        }
      else ArrayRemove(iC,i,1);
      HeiOld[iC[i].SubWin]=W.height[iC[i].SubWin];
     }
   WidOld=W.Width;
   preWinTotal=W.WindowsTotal;
   XYToTimePrice(0,0,W.MouseTime,W.MousePrice,CHARTEVENT_CHART_CHANGE);
  }
 
Nikolai Semko:

Спасибо!
Поправил в КБ.
Проверьте, пожалуйста, на своем коде. А то исправил не проверяя. Может что-то не учел.

Сейчас все ОК )

Хотел спросить, с какой целью массив iC добавлен?

 
Oleksii Chepurnyi:

Сейчас все ОК )

Хотел спросить, с какой целью массив iC добавлен?

Это сделано для контроля множества подокон и множества экземпляров iCanvas. Ведь окна могут довавляться и удаляться в процессе работы индикатора.
Например, для этого индикатора это необходимо:

https://www.mql5.com/ru/code/25414

Система линейных алгебраических уравнений на каждом баре
Система линейных алгебраических уравнений на каждом баре
  • www.mql5.com
Данная работа преследует 3 цели: Продемонстрировать работу индикатора сразу в двух окнах: в главном и подокне. Это достигается с помощью применения класса iCanvas.Компактное решение системы линейных алгебраических уравнений с помощью рекурсии.Продемонстрировать и доказать некоторым искателям грааля несостоятельность утверждения, что применение...
Причина обращения: