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

 

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

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

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

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

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

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

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

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

Автор: Anatoli Kazharski

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

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

 

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


 
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);
  }

//---

Результат:

 

 
Спасибо за разъяснение!
 

Не нашел метод, который изменял цвет текста Заголовка, поэтому решил добавить в 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);
  }


 

 
Alexander Fedosov:

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

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

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

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

Причина обращения: