EasyAndFastMod/Controls/Tooltip.mqh
2026-01-15 07:23:17 -05:00

276 行
21 KiB
MQL5

//+------------------------------------------------------------------+
//| 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<lines_total; i++)
{
m_canvas.TextOut(x,y,m_tooltip_lines[i],::ColorToARGB(m_label_color),TA_LEFT|TA_TOP);
y=y+y_offset;
}
//--- Обновить холст
m_canvas.Update();
}
//+------------------------------------------------------------------+
//| Плавное исчезновение всплывающей подсказки |
//+------------------------------------------------------------------+
void CTooltip::FadeOutTooltip(void)
{
//--- Выйти, если подсказка скрыта на 100%
if(m_alpha<1)
return;
//--- Отступ для заголовка
int y_offset=15;
//--- Шаг прозрачности
uchar fadeout_step=7;
//--- Начальное значение
uchar alpha=m_alpha;
//--- Плавное исчезновение подсказки
for(uchar a=alpha; a>=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<lines_total; i++)
{
m_canvas.TextOut(x,y,m_tooltip_lines[i],::ColorToARGB(m_label_color,m_alpha),TA_LEFT|TA_TOP);
y=y+y_offset;
}
//--- Обновить холст
m_canvas.Update();
}
}
//+------------------------------------------------------------------+
//| Перерисовка |
//+------------------------------------------------------------------+
void CTooltip::Reset(void)
{
Hide();
Show();
}
//+------------------------------------------------------------------+
//| Удаление |
//+------------------------------------------------------------------+
void CTooltip::Delete(void)
{
//--- Удаление объектов
CElement::Delete();
//--- Освобождение массивов элемента
::ArrayFree(m_tooltip_lines);
}
//+------------------------------------------------------------------+