//+------------------------------------------------------------------+ //| ColorButton.mqh | //| Copyright 2015, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #include "..\Element.mqh" #include "Button.mqh" //+------------------------------------------------------------------+ //| Класс для создания кнопки вызова цветовой палитры | //+------------------------------------------------------------------+ class CColorButton : public CElement { private: //--- Экземпляры для создания элемента CButton m_button; //--- Выбранный цвет color m_current_color; //--- Имя ресурса для изображения маркера цвета на кнопке string m_resource_name; //--- public: CColorButton(void); ~CColorButton(void); //--- Методы для создания элемента bool CreateColorButton(const string text,const int x_gap,const int y_gap); //--- private: void InitializeProperties(const string text,const int x_gap,const int y_gap); bool CreateCanvas(void); bool CreateButton(void); //--- public: //--- Возвращает указатели на кнопку CButton *GetButtonPointer(void) { return(::GetPointer(m_button)); } color CurrentColor(void) const { return(m_current_color); } void CurrentColor(const color clr); //--- public: //--- Обработчик событий графика virtual void OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam); //--- Рисует элемент virtual void Draw(void); //--- private: //--- Рисует картинку virtual void DrawImage(void); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CColorButton::CColorButton(void) : m_current_color(C'35,205,255'), m_resource_name("color_marker.bmp") { //--- Сохраним имя класса элемента в базовом классе CElementBase::ClassName(CLASS_NAME); } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CColorButton::~CColorButton(void) { } //+------------------------------------------------------------------+ //| Обработчик событий | //+------------------------------------------------------------------+ void CColorButton::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam) { //--- Обработка события перемещения курсора if(id==CHARTEVENT_MOUSE_MOVE) { //--- Перерисовать элемент if(CheckCrossingBorder()) Update(true); //--- return; } } //+------------------------------------------------------------------+ //| Создаёт объект Кнопка | //+------------------------------------------------------------------+ bool CColorButton::CreateColorButton(const string text,const int x_gap,const int y_gap) { //--- Выйти, если нет указателя на главный элемент if(!CElement::CheckMainPointer()) return(false); //--- Инициализация свойств InitializeProperties(text,x_gap,y_gap); //--- Создание элемента if(!CreateCanvas()) return(false); if(!CreateButton()) return(false); //--- return(true); } //+------------------------------------------------------------------+ //| Инициализация свойств | //+------------------------------------------------------------------+ void CColorButton::InitializeProperties(const string text,const int x_gap,const int y_gap) { m_x =CElement::CalculateX(x_gap); m_y =CElement::CalculateY(y_gap); m_x_size =(m_x_size<1)? 100 : m_x_size; m_y_size =(m_y_size<1)? 20 : m_y_size; m_label_text =text; m_back_color =(m_back_color!=clrNONE)? m_back_color : m_main.BackColor(); //--- Отступы и цвет текстовой метки m_label_x_gap =(m_label_x_gap!=WRONG_VALUE)? m_label_x_gap : 0; m_label_y_gap =(m_label_y_gap!=WRONG_VALUE)? m_label_y_gap : 4; m_label_color =(m_label_color!=clrNONE)? m_label_color : clrBlack; m_label_color_hover =(m_label_color_hover!=clrNONE)? m_label_color_hover : C'0,120,215'; m_label_color_locked =(m_label_color_locked!=clrNONE)? m_label_color_locked : clrSilver; //--- Отступы от крайней точки CElementBase::XGap(x_gap); CElementBase::YGap(y_gap); } //+------------------------------------------------------------------+ //| Создаёт объект для рисования | //+------------------------------------------------------------------+ bool CColorButton::CreateCanvas(void) { //--- Формирование имени объекта string name=CElementBase::ElementName("color_button"); //--- Создание объекта if(!CElement::CreateCanvas(name,m_x,m_y,m_x_size,m_y_size)) return(false); //--- return(true); } //+------------------------------------------------------------------+ //| Создаёт кнопку | //+------------------------------------------------------------------+ bool CColorButton::CreateButton(void) { //--- Сохраним указатель на главный элемент m_button.MainPointer(this); //--- Размеры int x_size=(m_button.XSize()<1)? 80 : m_button.XSize(); //--- Координаты int x =(m_button.XGap()<1)? x_size : m_button.XGap(); int y =0; //--- Отступы для картинки int icon_x_gap =(m_button.IconXGap()<1)? 4 : m_button.IconXGap(); int icon_y_gap =(m_button.IconYGap()<1)? 3 : m_button.IconYGap(); //--- Отступы для текста int label_x_gap =(m_button.LabelXGap()<1)? 24 : m_button.LabelXGap(); int label_y_gap =(m_button.LabelYGap()<1)? 4 : m_button.LabelYGap(); //--- Свойства m_button.XSize(x_size); m_button.YSize(m_y_size); m_button.IconXGap(icon_x_gap); m_button.IconYGap(icon_y_gap); m_button.LabelXGap(label_x_gap); m_button.LabelYGap(label_y_gap); //--- Установка цвета для кнопки CurrentColor(m_current_color); m_button.IconFile(m_resource_name); m_button.IconFileLocked(m_resource_name); //--- Создадим элемент управления if(!m_button.CreateButton(::ColorToString(m_current_color),x,y)) return(false); //--- Добавить элемент в массив CElement::AddToArray(m_button); return(true); } //+------------------------------------------------------------------+ //| Изменяет текущий цвет параметра | //+------------------------------------------------------------------+ void CColorButton::CurrentColor(const color clr) { //--- Сохраним цвет m_current_color=clr; //--- Размер изображения и массива (image_size x image_size) uint image_size=14; uint image_data[196]; //--- Инициализация массива цветом for(uint y=0,i=0; y error: ",::GetLastError()); //--- if(m_button.IconXGap()<1) { m_button.IconXGap(4); m_button.IconYGap(3); } //--- Установка пути к изображению в свойствах кнопки m_button.IconFile(m_resource_name); m_button.IconFileLocked(m_resource_name); //--- Установка текста для кнопки m_button.LabelText(::ColorToString(m_current_color)); } //+------------------------------------------------------------------+ //| Рисует элемент | //+------------------------------------------------------------------+ void CColorButton::Draw(void) { //--- Нарисовать фон CElement::DrawBackground(); //--- Нарисовать картинку CColorButton::DrawImage(); //--- Нарисовать текст CElement::DrawText(); } //+------------------------------------------------------------------+ //| Рисует картинку | //+------------------------------------------------------------------+ void CColorButton::DrawImage(void) { //--- Выйти, если (1) чек-бокс не нужен или (2) картинка не определена if(CElement::IconFile()=="") return; //--- Определим индекс uint image_index=(m_is_pressed)? 2 : 0; //--- Если элемент не заблокирован if(!CElementBase::IsLocked()) { if(CElementBase::MouseFocus()) image_index=(m_is_pressed)? 2 : 0; } else image_index=(m_is_pressed)? 3 : 1; //--- Рисуем картинку CElement::DrawImage(); } //+------------------------------------------------------------------+