CHARTEVENT_OBJECT_CLICK и CHARTEVENT_CLICK срабатывают одновременно - страница 2

 

задачу решал такую

1.есть объект по которому производится первый клик (при этом клик по графику не нужен, а он есть всегда)

2.зафиксировать клик по графику


координаты объекта всегда известны
клик по графику можно зафиксировать только вне объекта
только такое решение придумал

 
Iurii Tokman:

после первого нажатия существуют уже оба клика

да, я проверил

но приходят события по очереди, сначала событие клик по обьекту, затем клик по чарту, т.е OnChartEvent() вызывается 2 раза

и задержка между событиями, у меня от 8 до 20 мкс , поэтому и поставил сравнение с 50 мкс , сомневаюсь, что юзер с такой частотой (20 кликов в сек) сумеет накликать оба события


UPD: запустил свой пример, все четко работает - кликал сначала по прямоугольнику, затем по чарту:

2020.06.19 21:50:13.598 tst EURUSD,H1: Координаты щелчка мышки на графике: x = 711  y = 275.0

2020.06.19 21:50:13.118 tst EURUSD,H1: Координаты щелчка мышки на графике: x = 711  y = 275.0

2020.06.19 21:50:12.542 tst EURUSD,H1: Координаты щелчка мышки на графике: x = 711  y = 275.0

2020.06.19 21:50:11.822 tst EURUSD,H1: Координаты щелчка мышки на графике: x = 709  y = 278.0

2020.06.19 21:50:10.566 tst EURUSD,H1: Нажатие кнопки мышки на объекте с именем 'Rectangle 64203'

2020.06.19 21:50:10.278 tst EURUSD,H1: Нажатие кнопки мышки на объекте с именем 'Rectangle 64203'

2020.06.19 21:50:09.966 tst EURUSD,H1: Нажатие кнопки мышки на объекте с именем 'Rectangle 64203'

2020.06.19 21:50:09.702 tst EURUSD,H1: Нажатие кнопки мышки на объекте с именем 'Rectangle 64203'

2020.06.19 21:50:08.670 tst EURUSD,H1: Нажатие кнопки мышки на объекте с именем 'Rectangle 64203'

2020.06.19 21:50:08.439 tst EURUSD,H1: Нажатие кнопки мышки на объекте с именем 'Rectangle 64203'

2020.06.19 21:49:51.307 tst EURUSD,H1: initialized

2020.06.19 21:49:49.631 Expert tst EURUSD,H1: loaded successfully

 
Iurii Tokman:

задачу решал такую

1.есть объект по которому производится первый клик (при этом клик по графику не нужен, а он есть всегда)

2.зафиксировать клик по графику


координаты объекта всегда известны
клик по графику можно зафиксировать только вне объекта
только такое решение придумал

Может так подойдет, киньте пару стрелок и пару линий на график. Щелчок по стрелкам дает сообщение, x и y не выводится.

Ну и соответственно, перед return, где id==CHARTEVENT_CLICK задать, то на что нужно реагировать, а после return, на что не нужно.

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
  
  if(id==CHARTEVENT_OBJECT_CLICK) 
  { 
     // --- переберем все стрелки на графике
    for(int i = ObjectsTotal(0, 0, OBJ_ARROW)-1; i >= 0; --i)
    {
      string nmArrow = ObjectName(0, i, 0, OBJ_ARROW);                // имя объекта "СТРЕЛКА"
        
      if(sparam == nmArrow)
      {
        Print("Нажатие кнопки мышки на объекте с именем '"+sparam+"'"); 
        return;
      }

    }
  } 
//--- нажатие левой кнопкой мышки на графике 
  if(id==CHARTEVENT_CLICK) 
  { 
    return;
    Print("Координаты щелчка мышки на графике: x = ",lparam,"  y = ",dparam); 
  } 
}
 
Igor Makanu:

UPD: запустил свой пример, все четко работает - кликал сначала по прямоугольнику, затем по чарту:

спасибо! помогло

 
Igor Makanu:

можно так попробовать  клики мыши разделить

И всё-же, решение костыльное. Разработчикам МТ нужно что-то решить с разделением событий.

 
Vitaly Muzichenko:

Разработчикам МТ нужно что-то решить с разделением событий.

эти события разделены, можете проверить, вот код:

void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam) // параметр события типа string
{
   if(id == CHARTEVENT_OBJECT_CLICK || id == CHARTEVENT_CLICK) Print("id = ", id, " , time_ms = ", GetMicrosecondCount());
}
Vitaly Muzichenko:

И всё-же, решение костыльное.

давайте не костыльное, первое, что приходит на ум это создать очередь сообщений, затем создать свои атрибуты событий и эти атрибуты нужно будет передать через битовую маску в одном событии, а юзер должен будет лишь выделить необходимые биты и проверить поступало ли такое событие

это сделали разработчики , но  только для состояния кнопок мышки - битовая маска передается в параметре sparam ( справка )

 
Igor Makanu:

эти события разделены, можете проверить, вот код:

давайте не костыльное, первое, что приходит на ум это создать очередь сообщений, затем создать свои атрибуты событий и эти атрибуты нужно будет передать через битовую маску в одном событии, а юзер должен будет лишь выделить необходимые биты и проверить поступало ли такое событие

это сделали разработчики , но  только для состояния кнопок мышки - битовая маска передается в параметре sparam ( справка )

У меня была аналогичная задача, разделял как-то через флаги, но уже не помню чем окончилось, помню что времени отняло немало.

 

Ещё вариант поставить флаг обработки событий. Если клик по объекту, то клик по графику не обрабатывать.

/********************************************************************/
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                 )
 {
  static bool flag = false;
  if(id == CHARTEVENT_OBJECT_CLICK && sparam == "Arrow 43878")// Здесь конечно имя вашего объекта
   {
    Print("Нажатие мышки на объекте \"" + sparam + "\"");
    flag = true;
    return; // Обязательно, чтобы не дошло до последней строки
   }
  if(id == CHARTEVENT_CLICK && !flag)
   {
    Print("Координаты мышки на графике: x = ",lparam,"  y = ",dparam);
   }
  flag = false;
 }/******************************************************************/
 
В общем, самое простое это давать физическим событиям  последовательно id и onchartevent сделать хотя бы bool обрабработано/нет. Но это ломать архитектуру и совместимость. 
 
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam) // параметр события типа string
{
   static int prev_id = INT_MAX;
//--- нажатие левой кнопкой мышки на графике
   if(id == CHARTEVENT_OBJECT_CLICK)
   {
      Print("Нажатие кнопки мышки на объекте с именем '" + sparam + "'");
   }
//--- нажатие мышкой на графическом объекте
   if(id == CHARTEVENT_CLICK && prev_id != CHARTEVENT_OBJECT_CLICK)
   {
      Print("Координаты щелчка мышки на графике: x = ", lparam, "  y = ", dparam);
   }
   prev_id = id;
}