Есть панель. Объект "Edit" и поверх него объект "Button". Все нормально работает, но есть одно НО.... если под кнопкой (назовем - "объект панели") находится какой-либо иной объект ("объект графика"), например, индикаторная линия, или трендовая, то два (или более) быстрых клика на "объект панели" понимаются программой как двойной клик на "объект графика". Насколько я понимаю "zorder priority" имеет значение для одиночного клика, при двойном выставление приоритетов не помогает.
Очень прошу помогите советом как с этим бороться. Как можно сделать так чтобы объекты графика находящиеся под созданными юзером объектами (кнопками и т.п.) не реагировали на клики мыши. Заранее спасибо.
Может Настройки-Объекты-Выделять объект по одиночному клику мышки?
Или обрабатывать OnChartEvent и там снимать выделение с линии?
Может Настройки-Объекты-Выделять объект по одиночному клику мышки?
Или обрабатывать OnChartEvent и там снимать выделение с линии?
Спасибо за скорый ответ. Не совсем понял то что Вы имели ввиду под "снимать выделение с линии". Отвечу на то как понял ))
Дело в том что клик на кнопку может быть как одиночным так и повторяющимся в зависимости от обстоятельств (например кнопка изменения какого-либо числового параметра ордера, СЛ или ТП, например). Оптимальным было бы чтобы нажатие кнопки (одиночное или двойное) всегда относилось только к этой кнопке, а не к объекту под ней, так как объекты под ней могут быть самые разные (трендовая, идникаторная, мовинг, фибо... и т.д). С параметрами этих многочисленных объектов тоже не хотелось бы играться, так как к их вызову никаких нареканий нет, и даже хорошо бы чтобы этот вызов оставался прежним ВНЕ той небольшой площади графика которую покрывает кнопка.
Да, есть некоторые проблемы с очередностью реакции объектов на клики мыши. Но, в основном, у меня все как-то решалось путем подкладывания панели под подобные объекты.
P. S. Панель - это OBJ_RECTANGLE_LABEL.
А OBJPROP_SELECTED или OBJPROP_SELECTABLE к тем объектам которые внизу не поможет?
Я это и имел в виду, но ТС видно с этими свойствами не работал.
Для ТС - при любом событии на графике вызывается OnChartEvent, в этой функции можно узнать, по какому объекту щелкнули, его свойства и много чего еще, смотрите справку. Я думаю, надо для объектов внизу OBJPROP_SELECTABLE выставлять в false, возможно, проверять OBJPROP_SELECTED. Надо проверить, сходу трудно сказать.
Вот пример вытаскивания свойств кнопок
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) // btnSellEnable - имя объекта { if(TrButtons.GetPressedState(sparam, stateSell)) // TrButtons - мой класс, приводить не буду { 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); } } } if(StringFind(sparam, "btnBuyEnable") != -1) { if(TrButtons.GetPressedState(sparam, stateBuy)) { if(TrButtons.GetPressedState("btnSellEnable", stateSell)) { if(stateBuy && stateSell) TradeState = EnableAll; if(stateBuy && !stateSell) TradeState = EnableBuy; if(!stateBuy && stateSell) TradeState = EnableSell; if(!stateBuy && !stateSell) TradeState = DisableAll; SmartDsp.SetTradeEnable(TradeState); } } } ChartRedraw(); } }
Да, есть некоторые проблемы с очередностью реакции объектов на клики мыши. Но, в основном, у меня все как-то решалось путем подкладывания панели под подобные объекты.
P. S. Панель - это OBJ_RECTANGLE_LABEL.
Здравствуйте Игорь. Большое Вам спасибо за то что Вы меня уже пару раз очень сильно выручили (правда был я тогда под другим ником). Надеюсь что поможете советом и на этот раз.
Дело в том что моя панель использует OBJ_EDIT и OBJ_BUTTON. Чаще всего располагается в подокне, поверх какого-нибудь индикатора (Stoch, MACD, etc). Вот и получается что никогда не знаешь есть в данный момент под одной из кнопок линия индикатора или нет. Никаким образом сделать либо кнопки либо объект EDIT непрозрачными для кликов у меня не получилось. Поэтому при измении например парматера SL или TP, требующем несколько частых кликов, выскакивает окно параметров индикатора. (((
Готов к любому способу решения проблемы, кроме необходимости переписывать эксперта на корню )
А OBJPROP_SELECTED или OBJPROP_SELECTABLE к тем объектам которые внизу не поможет?
Я это и имел в виду, но ТС видно с этими свойствами не работал.
Для ТС - при любом событии на графике вызывается OnChartEvent, в этой функции можно узнать, по какому объекту щелкнули, его свойства и много чего еще, смотрите справку. Я думаю, надо для объектов внизу OBJPROP_SELECTABLE выставлять в false, возможно, проверять OBJPROP_SELECTED. Надо проверить, сходу трудно сказать.
Вот пример вытаскивания свойств кнопок
Большое всем спасибо. Игорь навел меня на мысль, попробовал - получилось. Алексея действительно не так понял, но дело оказалось немного в другом. Опишу, может кому-то понадобится.
Так вот, OBJPROP_SELECTED или OBJPROP_SELECTABLE изначально и преднамеренно были установлены на FALSE. Не хотелось чтобы объекты могли быть выделены при любых обстоятельствах. Оказалось что именно поэтому двойные клики, так сказать, проходили насквозь. Как только изменил OBJPROP_SELECTABLE на TRUE двойной клик стал выделять объект, но, по крайней мере, то что под ним он уже не трогает. А это было главное. Прописал немедленное отключение выделения объекта панели, и все.
Еще раз спасибо что помогли.
P.S. Алексей, то что Вы предоставили намного превосходит мои знания предмета ))) но тем не менее благодарю.
P.S. Алексей, то что Вы предоставили намного превосходит мои знания предмета ))) но тем не менее благодарю.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Есть панель. Объект "Edit" и поверх него объект "Button". Все нормально работает, но есть одно НО.... если под кнопкой (назовем - "объект панели") находится какой-либо иной объект ("объект графика"), например, индикаторная линия, или трендовая, то два (или более) быстрых клика на "объект панели" понимаются программой как двойной клик на "объект графика". Насколько я понимаю "zorder priority" имеет значение для одиночного клика, при двойном выставление приоритетов не помогает.
Очень прошу помогите советом как с этим бороться. Как можно сделать так чтобы объекты графика находящиеся под созданными юзером объектами (кнопками и т.п.) не реагировали на клики мыши. Заранее спасибо.