Обсуждение статьи "Как создать графическую панель любой сложности и как это работает" - страница 8

 
Alexander:

Здравствуйте!

У меня такой вопрос - я хотел бы создать на торговой панели несколько вкладок т.е. по нажатии одной кнопки появляется один набор элементов, по нажатии другой кнопки другой набор элементов. Чтобы скрыть элементы из одной вкладки я применил свойство Hide() для этого элемента в обработчике события onClick кнопки-вкладки и элемент перестает быть видимым на панели, но своих свойств он не теряет и если кликнуть по тому месту где находился этот элемент, то onEvent() панели примет в обработку это событие. Вопрос - как сделать так чтобы скрытый элемент так же и не реагировал ни на какие действия пользователя. Пробовал включить свойство Элемент.Disable() опять же в методе onClick кнопки-вкладки, но ничего не происходит, элемент как реагировал на клик кнопки так и реагирует хотя и невидим. Как програмно его выключить по нажатию на одной вкладке и потом програмно включить по нажатию на другой вкладке?

Попробуйте пропатчить библиотеку контролов: в файле Wnd.mqh в начале метода OnMouseEvent не хватает строки:

if(!IS_ENABLED || !IS_VISIBLE) return false;

Подробности описаны в статье (Применение OLAP в трейдинге (Часть 2) - статья про OLAP, но там есть раздел по GUI, где указанная проблема затрагивается):

в минимизированном состоянии кнопка "ресайза" скрывается и делается неактивной. Проблема находится в методе CWnd::OnMouseEvent. В нем не хватает такой проверки:

  // if(!IS_ENABLED || !IS_VISIBLE) return false; - этой строки нет

В результате даже отключенные и невидимые "контролы" перехватывают события. Очевидно, что проблему можно было бы решить с помощью установки соответствующего Z-порядка управляющих элементов. Однако и здесь обнаружилась недоработка — библиотека не учитывает Z-порядок элементов. В частности, если заглянуть в метод CWndContainer::OnMouseEvent, то мы увидим простой цикл в обратном порядке по всем подчиненным элементам, без попыток определить их приоритет по Z-порядку.

Таким образом, требуется либо очередной "патч" библиотеки, либо некий "финт" в производном классе.

В принципе, в стандартной библиотеке контролов много что надо бы подправить. Поэтому была написана альтернативная, уже пропатченная, реализация ControlsPlus - целиком её можно взять в статье Язык MQL как средство разметки графического интерфейса MQL-программ. Часть 2 (если интересно - есть части 1 и 3).

Язык MQL как средство разметки графического интерфейса MQL-программ. Часть 2
Язык MQL как средство разметки графического интерфейса MQL-программ. Часть 2
  • www.mql5.com
В первой части публикации мы рассмотрели базовые принципы описания раскладки графического интерфейса MQL-программ на языке MQL. Для их реализации потребовалось создать несколько классов, отвечающих непосредственно за инициализацию интерфейсных элементов, их объединение в общую иерархию и настройку свойств. Сейчас мы готовимся перейти к более...
 
Stanislav Korotky:

Попробуйте пропатчить библиотеку контролов: в файле Wnd.mqh в начале метода OnMouseEvent не хватает строки:

Подробности описаны в статье (Применение OLAP в трейдинге (Часть 2) - статья про OLAP, но там есть раздел по GUI, где указанная проблема затрагивается):

В принципе, в стандартной библиотеке контролов много что надо бы подправить. Поэтому была написана альтернативная, уже пропатченная, реализация ControlsPlus - целиком её можно взять в статье Язык MQL как средство разметки графического интерфейса MQL-программ. Часть 2 (если интересно - есть части 1 и 3).

  Спасибо, будем пробовать.

 

Как записать/передать текст в CLabel из OnTick ?

class CControlsDialog : public CAppDialog
  {
private:
   CLabel            m_label;                         // CLabel object

.....

void OnTick()
{

m_label.Text(DoubleToString(Ask,4));

....

получаю ошибку

'm_label' - undeclared identifier ...

что не так?

Документация по MQL5: Стандартная библиотека / Панели и диалоги / CLabel
Документация по MQL5: Стандартная библиотека / Панели и диалоги / CLabel
  • www.mql5.com
//|                                                ControlsLabel.mq5 | //|                        Copyright 2017, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| defines                                                          |  INDENT_LEFT                         (11)      ...
 
Renat Akhtyamov:

Как записать/передать текст в CLabel из OnTick ?

получаю ошибку

'm_label' - undeclared identifier ...

что не так?

А привязка к графику, координаты и т.д. как в функции  CreateLabel() тут в справке показывается, сделали?

 
Vasiliy Pushkaryov:

А привязка к графику, координаты и т.д. как в функции  CreateLabel() тут в справке показывается, сделали?

да

если прямо там записать в объект текст, то все норм

а если в OnTick пытаюсь записать, то ругается

не надо же объект на каждом тике пересоздавать?
 
Renat Akhtyamov:

да

если прямо там записать в объект текст, то все норм

а если в OnTick пытаюсь записать, то ругается

не надо же объект на каждом тике пересоздавать?
А если m_label в public секцию перенести ?
 
Vasiliy Pushkaryov:
А если m_label в public секцию перенести ?

пробовал, ошибка та же

просто я на 4-рке делаю

думаю что в этом засада

плюсом вот это еще не прокатывает, хотя и компилится

m_scroll_v1. Disable(); (пробую по переключению радиокнопок, интересно же менять интерфейс). Destroy() срабатывает, а вот Disable не хочет

 
Renat Akhtyamov:

пробовал

просто я на 4-рке делаю

думаю что в этом засада

плюсом вот это еще не прокатывает, хотя и компилится

m_scroll_v1. Disable(); (пробую по переключению радиокнопок, интересно же менять интерфейс). Destroy() срабатывает, а вот Disable не хочет

В 4-ке тоже все работает. А объект который определили. Вызов из него нужно делать.  Типа Panel.m_label.Text( "Max.Margin")
 
Vasiliy Pushkaryov:
В 4-ке тоже все работает. А объект который определили. Вызов из него нужно делать.  Типа Panel.m_label.Text( "Max.Margin")

так работает

спасибо!

сначала добавил родителя, потом перенес в паблик и работает

а это m_scroll_v1. Disable(); пока не пашет

 
Renat Akhtyamov:

так работает

спасибо!

сначала добавил родителя, потом перенес в паблик и работает

а это m_scroll_v1. Disable(); пока не пашет

Пока не сталкивался. Не знаю. Станислав в 27-м посте этой ветки отвечает на один из вопросов, там и Disable стандартной библиотеки затрагивается, посмотрите.