← К каталогу
Исходный код · ID 3520

image.mqh

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Библиотека предоставляет класс CMyImage для размещения и управления растровыми изображениями на графиках платформы MQL5. Класс использует инфраструктуру канваса и графических объектов для отрисовки BMP-изображений, загружаемых из ресурсов.

Основные возможности включают загрузку изображений, их масштабирование с интерполяцией, позиционирование относительно краёв графика и автоматическую очистку ресурсов при удалении.

Класс подходит для создания информационных панелей и визуальных элементов на торговых графиках, обеспечивая гибкое управление отображением изображений.

Состав библиотеки

Классов: 1 · методов: 10 · конструкторов: 1 · деструкторов: 1 · отдельных функций: 0

Классы
Класс class CMyImage

Класс для работы с изображениями на графиках MQL5. Обеспечивает загрузку, отображение, масштабирование и позиционирование растровых изображений.

Методы и конструкторы
Метод · CMyImage void ArrToCanvas()

Перенос пиксельных данных из массива BMP на холст канваса с учётом прозрачности.

Конструктор · CMyImage CMyImage()

Конструктор класса. Инициализирует начальные размеры холста нулями.

Метод · CMyImage bool Load(const long chart_id,const string name,double x,double y,bool bBackGround)

Загружает растровое изображение из ресурсов, создаёт канвас и привязывает его к объекту графика.

Метод · CMyImage void Center(int min,int max)

Центрирует изображение на графике с ограничением размеров в заданном диапазоне.

Метод · CMyImage void RightBottom(double dmn)

Позиционирует изображение в правом нижнем углу графика с заданным коэффициентом смещения.

Метод · CMyImage void LeftTop(int min,int max)

Позиционирует изображение в левом верхнем углу графика с ограничением размеров.

Метод · CMyImage void Move(int x,int y)

Перемещает изображение в указанные координаты на графике.

Деструктор · CMyImage ~CMyImage()

Деструктор класса. Освобождает ресурсы канваса при удалении объекта.

Метод · CMyImage void OnDeinit()

Вызывается при деинициализации. Освобождает ресурсы канваса.

Метод · CMyImage void ResizeImage(double NewWidth)

Изменяет ширину изображения с интерполяцией пиксельных данных.

Метод · CMyImage int ChartWidth()

Возвращает ширину графика в пикселях.

Метод · CMyImage int ChartHeight()

Возвращает высоту графика в пикселях.

Получить полный код

Поиск по коду файла

#property version   "1.00"

#define protected public
#include <sovetnikovNET\Canvas.mqh>
#include <ChartObjects\ChartObjectsBmpControls.mqh>
#undef protected

#define _ceil(x) (x-(int)x>0)?(int)x+1:(int)x
#define _round(x) (x>0)?(int)(x+0.5):(int)(x-0.5)
#define _floor(x) (x>0)?(int)x:((int)x-x>0)?(int)x-1:(int)x

union rgb
  {
   uchar             argb[4];
   uint              clr;
  };

bool  ArraySwap(
   uint&  array1[],      // первый массив
   uint&  array2[]       // второй массив
)
  {
   int isize=MathMin(ArraySize(array1),ArraySize(array2));
   for(int i=0; i<isize; i++)
     {

      uint tmp=array1[i];
      array1[i]=array2[i];
      array2[i]=tmp;
     }

   return true;
  }

class CMyImage
  {
public:
   int               m_lastW,m_lastH;

   CCanvas           canvasMain;
   uint              width_bmp,height_bmp;
   uint              BMP[];
   string            CanvName;
   double            X,Y;

   int               SizeArr;
   void              ArrToCanvas()
     {
      if(tr>=1)
         ArrayCopy(canvasMain.m_pixels,BMP);
      else
         for(int i=0; i<SizeArr; i++)
            canvasMain.m_pixels[i]=(uchar(double(BMP[i]>>24)*tr)<<24)|BMP[i]&0x00FFFFFF;
      ArrayCopy(BMP,canvasMain.m_pixels);
     }

   double            tr;
   rgb               col;
   CChartObjectBmpLabel m_img;
   long              m_chart_id;

public:
                     CMyImage() {m_lastW=0; m_lastH=0;}

   bool              Load(const long chart_id,const string name,double x,double y,bool bBackGround=true)
     {

      X=x;
      Y=y;
      tr=1;
      m_chart_id=chart_id;
      m_lastW=0;
      m_lastH=0;
      width_bmp=0;
      height_bmp=0;

      if(!ResourceReadImage(name,BMP,width_bmp,height_bmp))
        {
         Print("Error read resource: ",GetLastError()); // переносим bmp файл в массив
         return false;
        }

      ResourceFree(name);

      SizeArr=(int)(width_bmp*height_bmp);
      CanvName="Image"+string(GetTickCount()+MathRand());
      if(!canvasMain.CreateBitmapLabel(0,0,CanvName,(int)X,(int)Y,width_bmp,height_bmp,COLOR_FORMAT_ARGB_NORMALIZE)) // create canvas with the size of the current window
         Print("Error creating canvas: ",GetLastError());

      m_img.Attach(m_chart_id,CanvName,0,2);
      m_img.Background(bBackGround);

      m_img.SetInteger(OBJPROP_ANCHOR,ANCHOR_CENTER);
      m_img.SetInteger(OBJPROP_TIMEFRAMES,OBJ_NO_PERIODS);
      m_img.SetInteger(OBJPROP_ZORDER,-100);

      ArrToCanvas();
      canvasMain.Update();

      return true;
     }

   virtual void              Center(int min,int max)
     {

      if(m_lastW!=ChartWidth() || m_lastH!=ChartHeight())
        {
         m_lastW=ChartWidth();
         m_lastH=ChartHeight();

         int w=MathMin(m_lastW,m_lastH)-20;
         if(w<min)
            w=min;

         if(w>max)
            w=max;

         int x=m_lastW/2;
         int y=m_lastH/2;

         ResizeImage(w);

         Move(x,y);

         m_img.SetInteger(OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS);

         canvasMain.Update();
        }
     }

   virtual void              RightBottom(double dmn)
     {

      if(m_lastW!=ChartWidth() || m_lastH!=ChartHeight())
        {
         m_lastW=ChartWidth();
         m_lastH=ChartHeight();

         int w=(int)(m_lastH*dmn);

         int x=m_lastW-w-20;
         int y=m_lastH-w-20;
         if(x<0)
            x=0;
         if(y<0)
            y=0;

         ResizeImage(w);
         Move(x,y);

         m_img.SetInteger(OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS);

         canvasMain.Update();
        }

     }

   virtual void              LeftTop(int min,i

Показано первые 50% кода (символов: 4252)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
425,20₽ ≈ $5.20