258 lines
20 KiB
MQL5
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);
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|