//+------------------------------------------------------------------+ //| Objects.mqh | //| Copyright 2015, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #include "Enums.mqh" #include "Defines.mqh" #include "Fonts.mqh" #include "Colors.mqh" #include #include #include "Resources.mqh" //--- Список классов в файле для быстрого перехода (Alt+G) class CImage; class CRectCanvas; class CSubChart; //+------------------------------------------------------------------+ //| Класс для хранения данных изображения | //+------------------------------------------------------------------+ class CImage { protected: CResources m_resources; uint m_image_data[]; // Массив пикселей картинки (цвета) uint m_image_width; // Ширина изображения uint m_image_height; // Высота изображения string m_bmp_path; // Путь к файлу изображения uint m_resource_index; // Индекс к ресурсу //--- public: CImage(void); ~CImage(void); //--- (1) Размер массива данных, (2) установить/вернуть данные (цвет пикселя) uint DataTotal(void) { return(::ArraySize(m_image_data)); } uint Data(const uint data_index) { return(m_image_data[data_index]); } void Data(const uint data_index,const uint data) { m_image_data[data_index]=data; } //--- Установить/вернуть ширину изображения void Width(const uint width) { m_image_width=width; } uint Width(void) { return(m_image_width); } //--- Установить/вернуть высоту изображения void Height(const uint height) { m_image_height=height; } uint Height(void) { return(m_image_height); } //--- Установить/вернуть путь к изображению void BmpPath(const string bmp_file_path) { m_bmp_path=bmp_file_path; } string BmpPath(void) { return(m_bmp_path); } //--- Установить/вернуть индекс к изображению void ResourceIndex(const uint resource_index) { m_resource_index=resource_index; } uint ResourceIndex(void) { return(m_resource_index); } //--- Читает и сохраняет данные переданного изображения (путь к ресурсу) bool ReadImageData(const string bmp_file_path); //--- Читает и сохраняет данные переданного изображения (индекс к ресурсу) bool ReadImageData(const uint resource_index); //--- Копирует данные переданного изображения void CopyImageData(CImage &array_source); //--- Удаляет данные изображения void DeleteImageData(void); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CImage::CImage(void) : m_image_width(0), m_image_height(0), m_bmp_path(""), m_resource_index(INT_MAX) { } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CImage::~CImage(void) { DeleteImageData(); } //+------------------------------------------------------------------+ //| Сохраняет переданную картинку (путь к ресурсу) в массив | //+------------------------------------------------------------------+ bool CImage::ReadImageData(const string bmp_file_path) { //--- Выйти, если пустая строка if(bmp_file_path=="") return(false); //--- Сохраним путь к изображению m_bmp_path=bmp_file_path; //--- Сбросить последнюю ошибку ::ResetLastError(); //--- Прочитать и сохранить данные изображения if(!::ResourceReadImage("::"+m_bmp_path,m_image_data,m_image_width,m_image_height)) { ::Print(__FUNCTION__," > Ошибка при чтении изображения ("+m_bmp_path+"): ",::GetLastError()); return(false); } //--- return(true); } //+------------------------------------------------------------------+ //| Сохраняет переданную картинку (индекс к ресурсу) в массив | //+------------------------------------------------------------------+ bool CImage::ReadImageData(const uint resource_index) { //--- Выйти, если пустая строка if(resource_index == INT_MAX) return(false); //--- Сохраним индекс к ресурсу m_resource_index=resource_index; //--- Сбросить последнюю ошибку ::ResetLastError(); //--- Прочитать и сохранить данные изображения if(m_resources.GetData(resource_index, m_image_data, m_image_width, m_image_height) == "") return(false); //--- return(true); } //+------------------------------------------------------------------+ //| Копирует данные переданного изображения | //+------------------------------------------------------------------+ void CImage::CopyImageData(CImage &array_source) { //--- Получим размер массива-источника uint source_data_total =array_source.DataTotal(); //--- Изменить размер массива-приёмника ::ArrayResize(m_image_data,source_data_total); //--- Копируем данные for(uint i=0; i