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

258 lines
20 KiB
MQL5

//+------------------------------------------------------------------+
//| Pointer.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include "..\Element.mqh"
//+------------------------------------------------------------------+
//| Класс для создания указателя курсора мыши |
//+------------------------------------------------------------------+
class CPointer : public CElement
{
private:
//--- Картинки для указателя
string m_file_on;
string m_file_off;
//--- Тип указателя
ENUM_MOUSE_POINTER m_type;
//--- Состояние указателя
bool m_state;
//---
public:
CPointer(void);
~CPointer(void);
//--- Создаёт ярлык указателя
bool CreatePointer(const long chart_id,const int subwin);
//---
private:
bool CreateCanvas(void);
//---
public:
//--- Установка ярлыков для указателя
void FileOn(const string file_path) { m_file_on=file_path; }
void FileOff(const string file_path) { m_file_off=file_path; }
//--- Возвращение и установка (1) типа указателя, (2) состояния указателя
ENUM_MOUSE_POINTER Type(void) const { return(m_type); }
void Type(ENUM_MOUSE_POINTER type) { m_type=type; }
bool State(void) const { return(m_state); }
void State(const bool state);
//--- Обновление координат
void UpdateX(const int mouse_x) { ::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_XDISTANCE,mouse_x-CElementBase::XGap()); }
void UpdateY(const int mouse_y) { ::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_YDISTANCE,mouse_y-CElementBase::YGap()); }
//---
public:
//--- Перемещение элемента
virtual void Moving(const int mouse_x,const int mouse_y);
//--- Управление
virtual void Show(void);
virtual void Hide(void);
virtual void Reset(void);
virtual void Delete(void);
//--- Рисует элемент
virtual void Draw(void);
//---
private:
//--- Установка картинок для указателя курсора мыши
void SetPointerBmp(void);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CPointer::CPointer(void) : m_state(true),
m_file_on(""),
m_file_off(""),
m_type(MP_X_RESIZE)
{
//--- Сохраним имя класса элемента в базовом классе
CElementBase::ClassName(CLASS_NAME);
//--- Значение индекса элемента по умолчанию
CElement::Index(0);
//--- Прозрачный фон
m_alpha=0;
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CPointer::~CPointer(void)
{
Delete();
}
//+------------------------------------------------------------------+
//| Создаёт указатель |
//+------------------------------------------------------------------+
bool CPointer::CreatePointer(const long chart_id,const int subwin)
{
//--- Свойства
m_chart_id =chart_id;
m_subwin =subwin;
m_x_size =(m_x_size<1)? 16 : m_x_size;
m_y_size =(m_y_size<1)? 16 : m_y_size;
//--- Сохранить указатель на себя
CElement::MainPointer(this);
//--- Установка картинок для указателя
SetPointerBmp();
//--- Создаёт элемент
if(!CreateCanvas())
return(false);
//--- Скрыть элемент
Hide();
return(true);
}
//+------------------------------------------------------------------+
//| Создаёт объект для рисования |
//+------------------------------------------------------------------+
bool CPointer::CreateCanvas(void)
{
//--- Формирование имени объекта
string name=CElementBase::ElementName("pointer");
//--- Создание объекта
if(!CElement::CreateCanvas(name,m_x,m_y,m_x_size,m_y_size))
return(false);
//--- По умолчанию отключено
State(false);
return(true);
}
//+------------------------------------------------------------------+
//| Установка состояния указателя |
//+------------------------------------------------------------------+
void CPointer::State(const bool state)
{
//--- Выйти, если повтор
if(state==m_state)
return;
//--- Сохранить состояние
m_state=state;
//--- Сохранить индекс выбранного изображения
CElement::ChangeImage(0,CElement::SelectedImage());
//--- Рисуем картинку
Draw();
//--- Применить
CElement::Update(true);
}
//+------------------------------------------------------------------+
//| Перемещение элемента |
//+------------------------------------------------------------------+
void CPointer::Moving(const int mouse_x,const int mouse_y)
{
UpdateX(mouse_x);
UpdateY(mouse_y);
}
//+------------------------------------------------------------------+
//| Показывает элемент |
//+------------------------------------------------------------------+
void CPointer::Show(void)
{
//--- Выйти, если элемент уже видим
if(CElementBase::IsVisible())
return;
//--- Сделать видимыми все объекты
::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS);
//--- Состояние видимости
CElementBase::IsVisible(true);
}
//+------------------------------------------------------------------+
//| Скрывает элемент |
//+------------------------------------------------------------------+
void CPointer::Hide(void)
{
//--- Выйти, если элемент скрыт
if(!CElementBase::IsVisible())
return;
//--- Скрыть объекты
::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_TIMEFRAMES,OBJ_NO_PERIODS);
//--- Состояние видимости
CElementBase::IsVisible(false);
}
//+------------------------------------------------------------------+
//| Перерисовка |
//+------------------------------------------------------------------+
void CPointer::Reset(void)
{
//--- Скрыть и показать
Hide();
Show();
}
//+------------------------------------------------------------------+
//| Удаление |
//+------------------------------------------------------------------+
void CPointer::Delete(void)
{
m_canvas.Destroy();
//--- Сохранить состояние
m_state=true;
//--- Состояние видимости
CElementBase::IsVisible(true);
}
//+------------------------------------------------------------------+
//| Рисует элемент |
//+------------------------------------------------------------------+
void CPointer::Draw(void)
{
//--- Нарисовать задний фон
CElement::DrawBackground();
//--- Нарисовать картинку
CElement::DrawImage();
}
//+------------------------------------------------------------------+
//| Установка картинок для указателя по типу указателя |
//+------------------------------------------------------------------+
void CPointer::SetPointerBmp(void)
{
switch(m_type)
{
case MP_X_RESIZE :
m_file_on =(string)RESOURCE_POINTER_X_RS;
m_file_off =(string)RESOURCE_POINTER_X_RS_BLUE;
break;
case MP_Y_RESIZE :
m_file_on =(string)RESOURCE_POINTER_Y_RS;
m_file_off =(string)RESOURCE_POINTER_Y_RS_BLUE;
break;
case MP_XY1_RESIZE :
m_file_on =(string)RESOURCE_POINTER_XY1_RS;
m_file_off =(string)RESOURCE_POINTER_XY1_RS_BLUE;
break;
case MP_XY2_RESIZE :
m_file_on =(string)RESOURCE_POINTER_XY2_RS;
m_file_off =(string)RESOURCE_POINTER_XY2_RS_BLUE;
break;
case MP_WINDOW_RESIZE :
{
CElement::AddImagesGroup(0,0);
CElement::AddImage(0,(string)RESOURCE_POINTER_X_RS);
CElement::AddImage(0,(string)RESOURCE_POINTER_Y_RS);
break;
}
case MP_X_RESIZE_RELATIVE :
m_file_on =(string)RESOURCE_POINTER_X_RS_REL;
m_file_off =(string)RESOURCE_POINTER_X_RS_REL;
break;
case MP_Y_RESIZE_RELATIVE :
m_file_on =(string)RESOURCE_POINTER_Y_RS_REL;
m_file_off =(string)RESOURCE_POINTER_Y_RS_REL;
break;
case MP_X_SCROLL :
m_file_on =(string)RESOURCE_POINTER_X_SCROLL;
m_file_off =(string)RESOURCE_POINTER_X_SCROLL_BLUE;
break;
case MP_Y_SCROLL :
m_file_on =(string)RESOURCE_POINTER_Y_SCROLL;
m_file_off =(string)RESOURCE_POINTER_Y_SCROLL_BLUE;
break;
case MP_TEXT_SELECT :
m_file_on =(string)RESOURCE_POINTER_TEXT_SELECT;
m_file_off =(string)RESOURCE_POINTER_TEXT_SELECT;
break;
}
//--- Если указан пользовательский тип (MP_CUSTOM)
if(m_type==MP_CUSTOM)
if(m_file_on=="" || m_file_off=="")
::Print(__FUNCTION__," > Для указателя курсора нужно установить картинки!");
//--- Установить картинку
if(m_type!=MP_WINDOW_RESIZE)
{
CElement::IconFile((uint)m_file_on);
CElement::IconFileLocked((uint)m_file_off);
}
}
//+------------------------------------------------------------------+