Обсуждение статьи "Графические интерфейсы I: "Оживление" графического интерфейса (Глава 3)"

 

Опубликована статья Графические интерфейсы I: "Оживление" графического интерфейса (Глава 3):

Эта статья является продолжением первой части серии о графических интерфейсах. Более подробно, для чего предназначена эта библиотека, можно прочитать в самой первой статье: Графические интерфейсы I: Подготовка структуры библиотеки (Глава 1). Полный список ссылок на статьи первой части находится в конце каждой главы и там же есть возможность загрузить к себе на компьютер полную версию библиотеки на текущей стадии разработки. Файлы нужно разместить по тем же директориям, как они расположены в архиве.

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


Изменение внешнего вида элементов интерфейса при наведении курсора

Ранее, когда рассматривалась реализация класса CElement, который является базовым классом для всех элементов управления, в качестве одного из его членов был создан метод CElement::ChangeObjectColor() для изменения цвета объекта при наведении курсора. Пришло время создать механизм, который позволит использовать это в своей работе. Для того чтобы включить такой функционал, понадобится таймер. По умолчанию он отключен в настройках MQL-приложения, и разработчик этого приложения сам решает, включать ли его в зависимости от того, какие задачи перед ним поставлены.

Для включения таймера язык MQL предоставляет две функции с разной частотой: EventSetTimer() и EventSetMillisecondTimer(). Первая позволяет установить интервал не более одной секунды, и для наших задач это не подходит, так как одна секунда — очень большой интервал для изменения внешнего вида элемента управления при наведении курсора. Изменение должно производиться мгновенно и без задержек. Поэтому воспользуемся функцией EventSetMillisecondTimer(), которая позволяет установить таймер с интервалами, измеряющимися в миллисекундах. В справочнике MQL написано, что минимальный интервал, который можно установить с помощью этой функции: 10-16 миллисекунд. Этого вполне достаточно для реализации задуманного.

Рис. 2. Тест на реакцию объектов при наведении курсора мыши.

Рис. 2. Тест на реакцию объектов при наведении курсора мыши

Автор: Anatoli Kazharski

 
Анатолий! Уровень кодинга, его качество - все просто на заоблачной, лично для меня, высоте. Огромная благодарность Вам за эту грандиозную работу! Ждем оставшихся частей!
 

Привет, Анатолий,

Мне очень интересно использовать графический интерфейс. Но он не работает в моем приложении. Окно панели не перемещается. Также в примере программы "InfoPanel.mq5" (с установленным свойством Movable в true) ничего не происходит. Панель появляется, но не перемещается. Возможно, у вас есть идеи, что может быть не так? (Я использовал Windows10 и metatrader ver 5.0 build 1340)


С уважением, Роланд

 

Привет всем,

Я получил исходники из последней части (4). Теперь все работает нормально.

С уважением, Роланд

 

Каков способ обработки движения мыши с помощью стандартной библиотеки? Я тестировал с файлом, расположенным в Experts\Examples\Controls. Модификация класса CListView стандартной библиотеки.
Событие ON_MOUSE_FOCUS_SET не обрабатывается, когда я использую только функцию .ChartEvent(...).
Когда я использую функцию .OnEvent(...), событие ON_MOUSE_FOCUS_SET обрабатывается, но я не могу переместить окно.
Когда я использую обе функции, сначала вызывая .ChartEvent(), а затем .OnEvent(), событие ON_MOUSE_FOCUS_SET обрабатывается, но когда я нажимаю на кнопку увеличения и уменьшения, оно изменяется более чем на один шаг.


   virtual bool      OnItemFocusSet(const int index);
   //--- перерисовать
   bool              Redraw(void);
   bool              RowState(const int index,const bool select);
   bool              CheckView(void);
  };
//+------------------------------------------------------------------+
//| Общий обработчик событий графика|
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CListView)
ON_INDEXED_EVENT(ON_CLICK,m_rows,OnItemClick)
ON_INDEXED_EVENT(ON_MOUSE_FOCUS_SET,m_rows,OnItemFocusSet)
EVENT_MAP_END(CWndClient)
bool CListView::OnItemFocusSet(const int index)
  {
//--- выберите "ряд"
   Select(index+m_offset);
//--- отправьте уведомление
   EventChartCustom(CONTROLS_SELF_MESSAGE,ON_CHANGE,m_id,0.0,m_name);
//--- обрабатывается
   return(true);
  }
 
Пример очень интересен и полезен для личностного роста:))) Автору большая благодарность!
Возник вопрос: при смене Тайм фрейма (переинициализации) блок улетает в левый верхний угол (x=0, y=0)... как правильно реализовать что бы сохранялись текущие координаты блока?

ЗЫ: в голове крутится 2 варианта:
1) записывать координаты в глобальные переменные...
2) записывать в фаил...
3) Любопытно ваше профессиональное решение этой задачи! Как бы вы реализовали это?