Взял код кнопок на панельке из стандартной библиотеки отсюда. Сменил расширение файла на mq5.
Так как в коде три кнопки, я оставил только одну, чтобы было поменьше кода.
В событиях для третьей кнопки вместо функции Comment() изменил на Print(), чтобы видеть очередь нажатий в журнале. И добавил при нажатой кнопке - подкраска в зеленый, при отжатой - возвращаем умолчательный цвет.
Кидаю на график, и пока кнопку нажимаешь медленно, примерно раз в секунду, все работает хорошо. Начинаю нажимать чуть быстрее и часто не перехватывается событие.
Кнопка ведь нажимается и отжимается, это всегда происходит! Как сделать, чтобы всегда при нажатой/отжатой кнопке менялся цвет, т.е. отлавливалось событие без пропусков?
Вот на картинке, первые разы нажимаю медленно, потом чуть быстрее.
ChartRedraw() при событии нажатия. Но правильнее - перед выходом из OnChartEvent(), и при наличии необходимости перерисовки по любому из объектов графического интерфейса, или сразу по нескольким из них.
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 секунд. Хотя, опять же кнопки визуально жмуться и отжимаються довольно быстро.
В стандартной библиотеке в классе 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 ?
Кто с ООП дружит, как думаете, это правильно?

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Взял код кнопок на панельке из стандартной библиотеки отсюда. Сменил расширение файла на mq5.
Так как в коде три кнопки, я оставил только одну, чтобы было поменьше кода.
В событиях для третьей кнопки вместо функции Comment() изменил на Print(), чтобы видеть очередь нажатий в журнале. И добавил при нажатой кнопке - подкраска в зеленый, при отжатой - возвращаем умолчательный цвет.
Кидаю на график, и пока кнопку нажимаешь медленно, примерно раз в секунду, все работает хорошо. Начинаю нажимать чуть быстрее и часто не перехватывается событие.
Кнопка ведь нажимается и отжимается, это всегда происходит! Как сделать, чтобы всегда при нажатой/отжатой кнопке менялся цвет, т.е. отлавливалось событие без пропусков?
Вот на картинке, первые разы нажимаю медленно, потом чуть быстрее.