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

 

Не поможете с таким вопросом.

Я добавил в Ваш файл "AppWindowTwoButtonsClass" функцию сдвига панели setShift().  Теперь если мы двинем границу графика справа и она подойдет к панели, панель начнет двигаться влево вместе с границей графика.

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);
   if(id == CHARTEVENT_CHART_CHANGE) ExtDialog.setShift();
  }

Вызов этой функции выделил желтым.

Вопрос в том, можно ли каким-то образом сделать вызов этой функции через этот псевдокод

EVENT_MAP_BEGIN(cGPanel)            

EVENT_MAP_END(CAppDialog)

чтобы вызов был из класса наследника, а не из глобальной функции OnChartEvent().

Несколько дефайнов перепробовал: ON_NO_ID_EVENT(event,handler), ON_OTHER_EVENTS(handler). Но что-то плохо понимаю их работу.

Файл с добавочной функцией setShift() прикладываю.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
Файлы:
 

Огромное спасибо за очень нужную статью.

У меня вопрос - можна ли в более простой способ "привязать" панел к месту куда я ее передвинул? Имею ввиду если поменять ТФ то чтобы панель отрисовалась там же где была. Пока что единственное что приходит в голову на таймере отслеживать перемещение и писать в глобальные. Если уже где-то обсуждался вопрос то буду весьма благодарен за ссылку.

Спасибо

 
Piotr Storozenko:

на таймере отслеживать перемещение и писать в глобальные

Лучше из соответствующего OnChartEvent. В глобалки или в файл.

 
Andrey Khatimlianskii:

Лучше из соответствующего OnChartEvent. В глобалки или в файл.

Спасибо

 

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

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

 
Alexander:

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

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

Попробуйте удалять объекты, а не скрывать. 

 
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() тут в справке показывается, сделали?