#property strict
//--- описание
#property description "Скрипт создает графический объект \"Прямоугольная метка\"."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="RectLabel"; // Имя метки
input color InpBackColor=clrSkyBlue; // Цвет фона
input ENUM_BORDER_TYPE InpBorder=BORDER_FLAT; // Тип рамки
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Угол графика для привязки
input color InpColor=clrDarkBlue; // Цвет плоской границы (Flat)
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Стиль плоской границы (Flat)
input int InpLineWidth=3; // Толщина плоской границы (Flat)
input bool InpBack=false; // Объект на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает прямоугольную метку |
//+------------------------------------------------------------------+
bool RectLabelCreate(const long chart_ID=0, // ID графика
const string name="RectLabel", // имя метки
const int sub_window=0, // номер подокна
const int x=0, // координата по оси X
const int y=0, // координата по оси Y
const int width=50, // ширина
const int height=18, // высота
const color back_clr=C'236,233,216', // цвет фона
const ENUM_BORDER_TYPE border=BORDER_SUNKEN, // тип границы
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки
const color clr=clrRed, // цвет плоской границы (Flat)
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль плоской границы
const int line_width=1, // толщина плоской границы
const bool back=false, // на заднем плане
const bool selection=false, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- сбросим значение ошибки
ResetLastError();
//--- создадим прямоугольную метку
if(!ObjectCreate(chart_ID,name,OBJ_RECTANGLE_LABEL,sub_window,0,0))
{
Print(__FUNCTION__,
": не удалось создать прямоугольную метку! Код ошибки = ",GetLastError());
return(false);
}
//--- установим координаты метки
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим размеры метки
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- установим цвет фона
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
//--- установим тип границы
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,border);
//--- установим угол графика, относительно которого будут определяться координаты точки
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим цвет плоской рамки (в режиме Flat)
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линии плоской рамки
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину плоской границы
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает прямоугольную метку |
//+------------------------------------------------------------------+
bool RectLabelMove(const long chart_ID=0, // ID графика
const string name="RectLabel", // имя метки
const int x=0, // координата по оси X
const int y=0) // координата по оси Y
{
//--- сбросим значение ошибки
ResetLastError();
//--- переместим прямоугольную метку
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
": не удалось переместить X-координату метки! Код ошибки = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
": не удалось переместить Y-координату метки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет размер прямоугольной метки |
//+------------------------------------------------------------------+
bool RectLabelChangeSize(const long chart_ID=0, // ID графика
const string name="RectLabel", // имя метки
const int width=50, // ширина метки
const int height=18) // высота метки
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим размеры метки
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
": не удалось изменить ширину метки! Код ошибки = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
": не удалось изменить высоту метки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет тип границы прямоугольной метки |
//+------------------------------------------------------------------+
bool RectLabelChangeBorderType(const long chart_ID=0, // ID графика
const string name="RectLabel", // имя метки
const ENUM_BORDER_TYPE border=BORDER_SUNKEN) // тип границы
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим тип рамки
if(!ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,border))
{
Print(__FUNCTION__,
": не удалось изменить тип границы! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет прямоугольную метку |
//+------------------------------------------------------------------+
bool RectLabelDelete(const long chart_ID=0, // ID графика
const string name="RectLabel") // имя метки
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим метку
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить прямоугольную метку! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- размеры окна графика
long x_distance;
long y_distance;
//--- определим размеры окна
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print("Не удалось получить ширину графика! Код ошибки = ",GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print("Не удалось получить высоту графика! Код ошибки = ",GetLastError());
return;
}
//--- определим координаты прямоугольной метки
int x=(int)x_distance/4;
int y=(int)y_distance/4;
//--- установим размеры метки
int width=(int)x_distance/4;
int height=(int)y_distance/4;
//--- создадим прямоугольную метку
if(!RectLabelCreate(0,InpName,0,x,y,width,height,InpBackColor,InpBorder,InpCorner,
InpColor,InpStyle,InpLineWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем одну секунду
ChartRedraw();
Sleep(1000);
//--- изменим размер прямоугольной метки
int steps=(int)MathMin(x_distance/4,y_distance/4);
for(int i=0;i<steps;i++)
{
//--- изменим размеры
width+=1;
height+=1;
if(!RectLabelChangeSize(0,InpName,width,height))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график и подождем 0.01 секунды
ChartRedraw();
Sleep(10);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- изменим тип рамки
if(!RectLabelChangeBorderType(0,InpName,BORDER_RAISED))
return;
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- изменим тип рамки
if(!RectLabelChangeBorderType(0,InpName,BORDER_SUNKEN))
return;
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- удалим метку
RectLabelDelete(0,InpName);
ChartRedraw();
//--- подождем 1 секунду
Sleep(1000);
//---
} |