Клик по OBJ_LABEL расположенному на OBJ_RECTANGLE_LABEL. ПРОБЛЕМА!!!

 

Коллеги, подскажите как сделать так что бы в обработчик событий приходило событие при клике по OBJ_LABEL расположенному на OBJ_RECTANGLE_LABEL? Что я только не пытался и в фоне создавать OBJ_RECTANGLE_LABEL и OBJPROP_ZORDER менять, при клике по  OBJ_LABEL, в обработчик приходит событие от OBJ_RECTANGLE_LABEL 

void OnChartEvent(const int id,           // идентификатор события  
                  const long& lparam,     // параметр события типа long
                  const double& dparam,   // параметр события типа double
                  const string& sparam    // параметр события типа string
                  )
{
   // Клик по объекту
   if (id == CHARTEVENT_OBJECT_CLICK)
   {
      Print(sparam); // Выведем в журнал имя объекта по которому кликнули
   }
}

 

 создание объекта не стал выкладывать, там кода много и смасла в нем помоему нет, если OBJ_LABEL создавать на OBJ_RECTANGLE то все нормально

 
Sergey Pekshev:

Коллеги, подскажите как сделать так что бы в обработчик событий приходило событие при клике по OBJ_LABEL расположенному на OBJ_RECTANGLE_LABEL? Что я только не пытался и в фоне создавать OBJ_RECTANGLE_LABEL и OBJPROP_ZORDER менять, при клике по  OBJ_LABEL, в обработчик приходит событие от OBJ_RECTANGLE_LABEL 

 

 создание объекта не стал выкладывать, там кода много и смасла в нем помоему нет, если OBJ_LABEL создавать на OBJ_RECTANGLE то все нормально

Там имя объекта передается, вот пример. На будущее - пиши такое в раздел индюков плз, тут раздел юмора ))

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
    bool stateSell = false, stateBuy = false;

    if(id == CHARTEVENT_OBJECT_CLICK)
    {
        if(StringFind(sparam, "btnSellEnable") != -1) 
        {
            if(TrButtons.GetPressedState(sparam, stateSell))
            {
                if(TrButtons.GetPressedState("btnBuyEnable", stateBuy))
                {
                    if(stateBuy && stateSell)
                        TradeState = EnableAll;
                    if(stateBuy && !stateSell)
                        TradeState = EnableBuy;
                    if(!stateBuy && stateSell)
                        TradeState = EnableSell;
                    if(!stateBuy && !stateSell)
                        TradeState = DisableAll;
                    SmartDsp.SetTradeEnable(TradeState);
                }    
            }    
        }    
 
Alexey Volchanskiy:

Там имя объекта передается, вот пример. На будущее - пиши такое в раздел индюков плз, тут раздел юмора ))

Напиши код создания этих лейблов плз, что-то там не так
 
Alexey Volchanskiy:
Напиши код создания этих лейблов плз, что-то там не так

Это и так понятно, что имя передается, оно то мне как раз и нужно, но имя передается не  OBJ_LABEL  по которому я кликаю, а имя OBJ_RECTANGLE_LABEL  и в разном порядке создавал и OBJPROP_ZORDER  игрался, хоть закликайся, а клик приходит от OBJ_RECTANGLE_LABEL  

если я рисую OBJ_LABEL  на OBJ_RECTANGLE , то по клику на OBJ_LABEL, передается имя объекта OBJ_LABEL, а  с OBJ_RECTANGLE_LABEL  все не так и в фоне его рисовал и не в фоне, все равно клик на себя забирет

 

Вообще мне это нужно, что бы скрыть разделители периодов в подокне индикатора, там и индкатора то нет, просто нужно подокно без разделителей периодов, но что бы они были в основном окне, все это дело хорошо прячется OBJ_RECTANGLE_LABEL даже когда он в фоне, но объекты на нем не кликабельны 

 

свойство

CHART_SHOW_PERIOD_SEP Отображение вертикальных разделителей между соседними периодами bool

с указанием подокна, вкл./выкл. периоды все равно на всем графике

 

Задает значение соответствующего свойства в указанном подокне указанного графика:

bool  ChartSetInteger(
   long   chart_id,     // идентификатор графика
   int    property_id,  // идентификатор свойства
   uint   sub_window,   // номер подокна графика
   long   value         // значение
   );

Примеры работы с графиком - Документация на MQL4
  • docs.mql4.com
Примеры работы с графиком - Документация на MQL4
 
Sergey Pekshev:

свойство

CHART_SHOW_PERIOD_SEP Отображение вертикальных разделителей между соседними периодами bool

с указанием подокна, вкл./выкл. периоды все равно на всем графике

 

Задает значение соответствующего свойства в указанном подокне указанного графика:

bool  ChartSetInteger(
   long   chart_id,     // идентификатор графика
   int    property_id,  // идентификатор свойства
   uint   sub_window,   // номер подокна графика
   long   value         // значение
   );

Я тебя четко прошу по русски - код создания лейблов. А ты мне пишешь, что тебе нужно )) Тут раздел юмора, но не настолько же )) У тебя этот код секретный, что ли? ))
 
Alexey Volchanskiy:
Я тебя четко прошу по русски - код создания лейблов. А ты мне пишешь, что тебе нужно )) Тут раздел юмора, но не настолько же )) У тебя этот код секретный, что ли? ))
понял))) сейчас сочиню, вырежу все лишнее, что бы не мешало
 
#property indicator_chart_window

void OnInit()
{

   // OBJ_RECTANGLE_LABEL
   
   string name = "OBJ_RECTANGLE_LABEL";
   
   ObjectCreate(name, OBJ_RECTANGLE_LABEL, 0, 0, 0);
   ObjectSetInteger(0, name, OBJPROP_CORNER, 0);
   ObjectSetInteger(0, name, OBJPROP_XDISTANCE, 10);
   ObjectSetInteger(0, name, OBJPROP_YDISTANCE, 10);
   ObjectSetInteger(0, name, OBJPROP_XSIZE, 200);
   ObjectSetInteger(0, name, OBJPROP_YSIZE, 200);
  
   ObjectSetInteger(0, name, OBJPROP_BGCOLOR, Gray);
   ObjectSetInteger(0, name, OBJPROP_WIDTH, 0);

   ObjectSetInteger(0, name, OBJPROP_SELECTED, 0);    // Выделенность объекта 0 - нет, 1 - да
   ObjectSetInteger(0, name, OBJPROP_SELECTABLE, 0);  // Доступность объекта для редактирования 0 - нет, 1 - да
   ObjectSetInteger(0, name, OBJPROP_HIDDEN, 1);      // Запрет на показ имени графического объекта в списке объектов 0 - нет, 1 - да
   ObjectSetInteger(0, name, OBJPROP_BACK, 1);        // Рисовать объект в фоне 0 - нет, 1 - да
   
   ObjectSetInteger(0, name, OBJPROP_ZORDER, 0);



   // OBJ_LABEL
   
   name = "OBJ_LABEL";
   
   ObjectCreate (name, OBJ_LABEL, 0, 0, 0);
   ObjectSetText(name, "OBJ_LABEL", 20, "Arial Black", Red);
   ObjectSetInteger(0, name, OBJPROP_CORNER, 0);
   ObjectSetInteger(0, name, OBJPROP_XDISTANCE, 100); 
   ObjectSetInteger(0, name, OBJPROP_YDISTANCE, 40);
   ObjectSetInteger(0, name, OBJPROP_SELECTED, 0);    // Выделенность объекта 0 - нет, 1 - да
   ObjectSetInteger(0, name, OBJPROP_SELECTABLE, 0);  // Доступность объекта для редактирования 0 - нет, 1 - да
   ObjectSetInteger(0, name, OBJPROP_HIDDEN, 1);      // Запрет на показ имени графического объекта в списке объектов 0 - нет, 1 - да
   ObjectSetInteger(0, name, OBJPROP_BACK, 0);        // Рисовать объект в фоне 0 - нет, 1 - да
   ObjectSetInteger(0, name, OBJPROP_ZORDER, 1);
}

void start(){}
  
void OnChartEvent(const int id,           // идентификатор события  
                  const long& lparam,     // параметр события типа long
                  const double& dparam,   // параметр события типа double
                  const string& sparam    // параметр события типа string
                  )
{
   // Клик по объекту
   if (id == CHARTEVENT_OBJECT_CLICK)
   {
      Print(sparam); // Выведем в журнал имя объекта по которому кликнули
   }
}  
 
Sergey Pekshev:
Так все верно: у Rectangle Label выше zOrder. Вот он и получает событие. Поставьте zOrder у Label выше (0 - самый высокий, 1 - ниже 2 - еще ниже и т. д.)
 
всяко пробовал, не помогает