//+------------------------------------------------------------------+ //| Tooltip.mqh | //| Copyright 2015, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #include "..\Element.mqh" //+------------------------------------------------------------------+ //| Класс для создания всплывающей подсказки | //+------------------------------------------------------------------+ class CTooltip : public CElement { private: //--- Указатель на элемент, к которому присоединена всплывающая подсказка CElement *m_element; //--- Текст и цвет заголовока string m_header_text; color m_header_color; //--- Массив строк текста подсказки string m_tooltip_lines[]; //--- public: CTooltip(void); ~CTooltip(void); //--- Методы для создания всплывающей подсказки bool CreateTooltip(void); //--- private: void InitializeProperties(void); bool CreateCanvas(void); //--- public: //--- (1) Сохраняет указатель элемента, (2) заголовок всплывающей подсказки void ElementPointer(CElement &object) { m_element=::GetPointer(object); } void HeaderText(const string text) { m_header_text=text; } void HeaderColor(const color clr) { m_header_color=clr; } //--- Добавляет строку для подсказки void AddString(const string text); //--- (1) Показывает и (2) скрывает всплывающую подсказку void ShowTooltip(void); void FadeOutTooltip(void); //--- public: //--- Обработчик событий графика virtual void OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam); //--- Управление virtual void Reset(void); virtual void Delete(void); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CTooltip::CTooltip(void) : m_header_text(""), m_header_color(C'50,50,50') { //--- Сохраним имя класса элемента в базовом классе CElement::ClassName(CLASS_NAME); //--- Изначально полностью прозрачна CElement::Alpha(0); } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CTooltip::~CTooltip(void) { } //+------------------------------------------------------------------+ //| Обработчик событий графика | //+------------------------------------------------------------------+ void CTooltip::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam) { //--- Обработка события перемещения курсора if(id==CHARTEVENT_MOUSE_MOVE) { //--- Выйти, если элемент скрыт if(!CElement::IsVisible()) return; //--- Выйти, если кнопка всплывающих подсказок на форме отключена if(!m_wnd.IsTooltip()) return; //--- Если форма заблокирована, скрыть подсказку if(m_main.CElementBase::IsLocked()) { FadeOutTooltip(); return; } //--- Если есть фокус на элементе, показать подсказку if(m_element.MouseFocus()) ShowTooltip(); //--- Если нет фокуса, скрыть подсказку else FadeOutTooltip(); //--- return; } } //+------------------------------------------------------------------+ //| Создаёт объект Tooltip | //+------------------------------------------------------------------+ bool CTooltip::CreateTooltip(void) { //--- Выйти, если нет указателя на главный элемент if(!CElement::CheckMainPointer()) return(false); //--- Выйти, если нет указателя на элемент if(::CheckPointer(m_element)==POINTER_INVALID) { ::Print(__FUNCTION__," > Перед созданием всплывающей подсказки классу нужно передать " "указатель на элемент: CTooltip::ElementPointer(CElement &object)."); return(false); } //--- Инициализация свойств InitializeProperties(); //--- Создаёт всплывающую подсказку if(!CreateCanvas()) return(false); //--- return(true); } //+------------------------------------------------------------------+ //| Инициализация свойств | //+------------------------------------------------------------------+ void CTooltip::InitializeProperties(void) { m_x =CElement::CalculateX(m_element.XGap()); m_y =CElement::CalculateY(m_element.YGap()+m_element.YSize()+1); m_x_size =(m_x_size<1)? 100 : m_x_size; m_y_size =(m_y_size<1)? 50 : m_y_size; //--- Цвета по умолчанию m_border_color =(m_border_color!=clrNONE)? m_border_color : C'150,170,180'; m_label_color =(m_label_color!=clrNONE)? m_label_color : clrDimGray; //--- Отступы от крайней точки CElement::XGap(CElement::CalculateXGap(m_x)); CElement::YGap(CElement::CalculateYGap(m_y)); } //+------------------------------------------------------------------+ //| Создаёт холст для рисования | //+------------------------------------------------------------------+ bool CTooltip::CreateCanvas(void) { //--- Формирование имени объекта string name=CElementBase::ElementName("tooltip"); //--- Создание объекта if(!CElement::CreateCanvas(name,m_x,m_y,m_x_size,m_y_size)) return(false); //--- Очистка холста для рисования m_canvas.Erase(::ColorToARGB(clrNONE,0)); m_canvas.Update(); //--- Обнулить приоритет на нажатие Z_Order(WRONG_VALUE); return(true); } //+------------------------------------------------------------------+ //| Добавляет строку | //+------------------------------------------------------------------+ void CTooltip::AddString(const string text) { //--- Увеличим размер массивов на один элемент int array_size=::ArraySize(m_tooltip_lines); ::ArrayResize(m_tooltip_lines,array_size+1); //--- Сохраним значения переданных параметров m_tooltip_lines[array_size]=text; } //+------------------------------------------------------------------+ //| Отображает всплывающую подсказку | //+------------------------------------------------------------------+ void CTooltip::ShowTooltip(void) { //--- Выйти, если подсказка видна на 100% if(m_alpha>=255) return; //--- Координаты и отступ для заголовка int x=5,y=5; int y_offset=15; //--- Признак полностью видимой подсказки m_alpha=255; //--- Рисуем фон и рамку DrawBackground(); DrawBorder(); //--- Рисуем заголовок (если установлен) if(m_header_text!="") { //--- Установим параметры шрифта m_canvas.FontSet(CElement::Font(),-CElement::FontSize()*10,FW_BLACK); //--- Рисуем текст заголовка m_canvas.TextOut(x,y,m_header_text,::ColorToARGB(m_header_color),TA_LEFT|TA_TOP); } //--- Координаты для основного текста подсказки (с учётом наличия заголовка) x =(m_header_text!="")? 15 : 5; y =(m_header_text!="")? 25 : 5; //--- Установим параметры шрифта m_canvas.FontSet(CElement::Font(),-CElement::FontSize()*10,FW_THIN); //--- Рисуем основной текст подсказки int lines_total=::ArraySize(m_tooltip_lines); for(int i=0; i=0; a-=fadeout_step) { m_alpha=a; //--- Если следующий шаг в минус, остановим цикл if(a-fadeout_step<0) { m_alpha=0; m_canvas.Erase(::ColorToARGB(clrNONE,m_alpha)); m_canvas.Update(); break; } //--- Координаты для заголовка int x=5,y=5; //--- Рисуем фон и рамку DrawBackground(); DrawBorder(); //--- Рисуем заголовок (если установлен) if(m_header_text!="") { //--- Установим параметры шрифта m_canvas.FontSet(CElement::Font(),-CElement::FontSize()*10,FW_BLACK); //--- Рисуем текст заголовка m_canvas.TextOut(x,y,m_header_text,::ColorToARGB(m_header_color,m_alpha),TA_LEFT|TA_TOP); } //--- Координаты для основного текста подсказки (с учётом наличия заголовка) x =(m_header_text!="")? 15 : 5; y =(m_header_text!="")? 25 : 5; //--- Установим параметры шрифта m_canvas.FontSet(CElement::Font(),-CElement::FontSize()*10,FW_THIN); //--- Рисуем основной текст подсказки int lines_total=::ArraySize(m_tooltip_lines); for(int i=0; i