Запаздывание при нажатии кнопок

Vasiliy Pushkaryov  

Взял код кнопок на панельке из стандартной библиотеки отсюда. Сменил расширение файла на mq5.

Так как в коде три кнопки, я оставил только одну, чтобы было поменьше кода.

В событиях для третьей кнопки вместо функции Comment() изменил на Print(), чтобы видеть очередь нажатий в журнале. И добавил при нажатой кнопке - подкраска в зеленый, при отжатой - возвращаем умолчательный цвет.

//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton3(void)
  {
   if(m_button3.Pressed())
   {
      Print(__FUNCTION__+" Состояние элемента управления: On");
      m_button3.ColorBackground(clrLime);
   }
   else
   {
      Print(__FUNCTION__+" Состояние элемента управления: Off");
      m_button3.ColorBackground(CONTROLS_BUTTON_COLOR_BG);
   }
  }

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

Кнопка ведь нажимается и отжимается, это всегда происходит! Как сделать, чтобы всегда при нажатой/отжатой кнопке менялся цвет, т.е. отлавливалось событие без пропусков?

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


Файлы:
testButton.mq5  15 kb
Artyom Trishkin  
Vasiliy Pushkaryov:

Взял код кнопок на панельке из стандартной библиотеки отсюда. Сменил расширение файла на mq5.

Так как в коде три кнопки, я оставил только одну, чтобы было поменьше кода.

В событиях для третьей кнопки вместо функции Comment() изменил на Print(), чтобы видеть очередь нажатий в журнале. И добавил при нажатой кнопке - подкраска в зеленый, при отжатой - возвращаем умолчательный цвет.

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

Кнопка ведь нажимается и отжимается, это всегда происходит! Как сделать, чтобы всегда при нажатой/отжатой кнопке менялся цвет, т.е. отлавливалось событие без пропусков?

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


ChartRedraw() при событии нажатия. Но правильнее - перед выходом из OnChartEvent(), и при наличии необходимости перерисовки по любому из объектов графического интерфейса, или сразу по нескольким из них.

Vasiliy Pushkaryov  
Artyom Trishkin:

ChartRedraw() при событии нажатия. Но правильнее - перед выходом из OnChartEvent(), и при наличии необходимости перерисовки по любому из объектов графического интерфейса, или сразу по нескольким из них.

Пробовал вставлять сюда

void CControlsDialog::OnClickButton3(void)
  {
   if(m_button3.Pressed())
   {
      Print(__FUNCTION__+" Состояние элемента управления: On");
      m_button3.ColorBackground(clrLime);
      ChartRedraw();
   }
   else
   {
      Print(__FUNCTION__+" Состояние элемента управления: Off");
      m_button3.ColorBackground(CONTROLS_BUTTON_COLOR_BG);
      ChartRedraw();
   }
  }
или сюда
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
   ChartRedraw();
  }

все равно не помогает.

Просто потом на ВПС запаздывание со сменой цвета, т.е. реакцией на событие нажатия, может уже доходить до 3-5 секунд. Хотя, опять же кнопки визуально жмуться и отжимаються довольно быстро.

Vasiliy Pushkaryov  

В стандартной библиотеке в классе CButton создается объект класса CChartObjectButton.

class CButton : public CWndObj
  {
private:
   CChartObjectButton m_button;             // chart object

public:
                     CButton(void);
                    ~CButton(void);
   //--- create
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   //--- state
   bool              Pressed(void)          const { return(m_button.State());                       }
   bool              Pressed(const bool pressed)  { return(m_button.State(pressed));                }

Я в этом классе CChartObjectButton добавил принт

bool CChartObjectButton::State(void) const
  {
   Print(__FUNCTION__, " get");
//--- check
   if(m_chart_id==-1)
      return(false);
//--- result
   return((bool)ObjectGetInteger(m_chart_id,m_name,OBJPROP_STATE));
  }

Нажал и отжал кнопку, вот что выводится в лог


Получается, что происходит двойной вызов функции State(void) const ?

Кто с ООП дружит, как думаете, это правильно?

Причина обращения: