Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
MetaQuotes Software Corp.
Модератор
185911
MetaQuotes Software Corp.  

Опубликована статья Графические интерфейсы I: Форма для элементов управления (Глава 2):

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

В предыдущей главе мы рассматривали структуру библиотеки для создания графических интерфейсов. Были созданы (1) производные классы для объектов-примитивов, (2) базовый класс для всех элементов управления, (3) основные классы, предназначенные для хранения указателей на элементы и управления этими элементами в общем обработчике событий.

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

Из каких частей состоит окно, которое мы собираемся создать?

  1. Фон. В этой области будут размещаться все элементы управления.
  2. Заголовок. Эта часть служит для перемещения окна, а также содержит в себе элементы интерфейса, которые перечислены в пунктах ниже.
  3. Ярлык. Дополнительный атрибут визуальной идентификации.
  4. Надпись. Название окна.
  5. Кнопка «Всплывающие подсказки». Если нажата, то включен режим показа всплывающих подсказок элементов управления, в которых они есть.
  6. Кнопка для сворачивания/разворачивания окна.
  7. Кнопка для закрытия окна.

Рис. 1. Составные части формы для элементов управления

Рис. 1. Составные части формы для элементов управления

Автор: Anatoli Kazharski

Ruslan Khasanov
3082
Ruslan Khasanov  
Приветствую Анатолий, не увидел в базовом классе методов сохранения,загрузки параметров формы(положение, состояние...). Планируете ли в будущем добавить такие методы с учётом типа форм?
Anatoli Kazharski
61186
Anatoli Kazharski  
Ruslan Khasanov:
Приветствую Анатолий, не увидел в базовом классе методов сохранения,загрузки параметров формы(положение, состояние...). Планируете ли в будущем добавить такие методы с учётом типа форм?

Такая статья запланирована. Но в моей версии, какие параметры сохранять и загружать будет определять сам разработчик MQL-приложения.

Pavel Trofimov
1858
Pavel Trofimov  

Доброго времени суток. Анатолий, конечно же хочу высказать глубочайшее уважение к Вашему труду и работе, которую Вы проделали. Но у меня при тестировании библиотеки на примере советника возник вопрос. Почему цвет окна получается черным, тогда как все цвета элементов, из которых оно состоит,по умолчанию выставлены как LightGray? Не происходит ли где-то наложения цветов, в результате чего окно получается черным? Скриншот прилагаю:


Anatoli Kazharski
61186
Anatoli Kazharski  
Pavel Trofimov:

Доброго времени суток. Анатолий, конечно же хочу высказать глубочайшее уважение к Вашему труду и работе, которую Вы проделали. Но у меня при тестировании библиотеки на примере советника возник вопрос. Почему цвет окна получается черным, тогда как все цвета элементов, из которых оно состоит,по умолчанию выставлены как LightGray? Не происходит ли где-то наложения цветов, в результате чего окно получается черным? Скриншот прилагаю:

Какими у формы выставлены цвета по умолчанию Вы можете посмотреть в конструкторе класса CWindow (файл Window.mqh).

Если Вам нужно изменить цвета формы, воспользуйтесь соответствующими методами класса CWindow. Свойства формы устанавливаются перед её созданием.

В статье был показан вот такой пример:

//+------------------------------------------------------------------+
//| Создает форму для элементов управления                           |
//+------------------------------------------------------------------+
bool CProgram::CreateWindow(const string caption_text)
  {
//--- Добавим указатель окна в массив окон
   CWndContainer::AddWindow(m_window);
//--- Свойства
   m_window.XSize(200);
   m_window.YSize(200);
   m_window.WindowBgColor(clrWhiteSmoke);
   m_window.WindowBorderColor(clrLightSteelBlue);
   m_window.CaptionBgColor(clrLightSteelBlue);
   m_window.CaptionBgColorHover(C'200,210,225');
//--- Создание формы
   if(!m_window.CreateWindow(m_chart_id,m_subwin,caption_text,1,1))
      return(false);
//---
   return(true);
  }

//---

Результат:

 

Pavel Trofimov
1858
Pavel Trofimov  
Спасибо за разъяснение!
Alexander Fedosov
9445
Alexander Fedosov  

Не нашел метод, который изменял цвет текста Заголовка, поэтому решил добавить в window.mqh:

//--- Свойства заголовка
   string            m_caption_text;
   int               m_caption_height;
   color             m_caption_text_color;
   color             m_caption_bg_color;
   color             m_caption_bg_color_off;
   color             m_caption_bg_color_hover;
   color             m_caption_color_bg_array[];

И методы: 

void              CaptionTextColor(const color text_color)                { m_caption_text_color=text_color;        }
color             CaptionTextColor(void)                            const { return(m_caption_text_color);           }

Ну и этот метод соответственно меняется:

//+------------------------------------------------------------------+
//| Создаёт текстовую метку заголовка                                |
//+------------------------------------------------------------------+
bool CWindow::CreateLabel(void)
  {
   string name=CElementBase::ProgramName()+"_window_label_"+(string)CElementBase::Id();
//--- Координаты объекта
   int x=CElementBase::X()+m_label_x_gap;
   int y=CElementBase::Y()+m_label_y_gap;
//--- Установим текстовую метку
   if(!m_label.Create(m_chart_id,name,m_subwin,x,y))
      return(false);
//--- Установим свойства
   m_label.Description(m_caption_text);
   m_label.Font(CElementBase::Font());
   m_label.FontSize(CElementBase::FontSize());
   m_label.Color(m_caption_text_color);
   m_label.Corner(m_corner);
   m_label.Selectable(false);
   m_label.Z_Order(m_button_zorder);
   m_label.Tooltip("\n");
//--- Сохраним координаты
   m_label.X(x);
   m_label.Y(y);
//--- Отступы от крайней точки
   m_label.XGap(x-m_x);
   m_label.YGap(y-m_y);
//--- Сохраним размеры
   m_label.XSize(m_label.X_Size());
   m_label.YSize(m_label.Y_Size());
//--- Сохраним указатель объекта
   CElementBase::AddToArray(m_label);
   return(true);
  }


 

Anatoli Kazharski
61186
Anatoli Kazharski  
Alexander Fedosov:

Не нашел метод, который изменял цвет текста Заголовка, поэтому решил добавить в window.mqh:

Хорошо. Тоже добавлю такую возможность в одной из следующих статей.

Последнюю на текущий момент версию библиотеки можно скачать вот в этой статье: Графические интерфейсы X: Новые возможности для нарисованной таблицы (build 9)

Возможно уже на следующей неделе выйдет новая версия (build 10).

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий