Обсуждение статьи "Графические интерфейсы III: Группы простых и многофункциональных кнопок (Глава 2)"

 

Опубликована статья Графические интерфейсы III: Группы простых и многофункциональных кнопок (Глава 2):

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


Разработка класса для создания групп простых кнопок

Группа простых кнопок представляет собой массив графических объектов типа OBJ_BUTTON. Отличительная особенность подобных элементов управления заключается в том, что одновременно может быть нажата только одна кнопка в группе. На текущий момент создать класс этого элемента можно двумя способами:

  1. создать группу из уже реализованного элемента типа CSimpleButton;
  2. создать группу из объектов примитивов типа CButton.

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


Разработка класса для создания групп радио-кнопок

Создаём файл RadioButtons.mqh с классом CRadioButtons, в котором должны быть стандартные виртуальные методы и члены класса для сохранения и получения указателя на форму. Примеры можете посмотреть в классах других элементов в статье выше. Подключаем файл RadioButtons.mqh к библиотеке (WndContainer.mqh).

Каждая радио-кнопка будет собираться из трёх объектов примитивов:

  1. фон;
  2. ярлык;
  3. текстовая метка.

Рис. 3. Составные части радио-кнопок.

Рис. 3. Составные части радио-кнопок.

Автор: Anatoli Kazharski

 
При компиляции файла SplitButton.mqh выдает ошибку "'return' - cannot convert from const pointer to nonconst pointer SplitButton.mqh 90 65"

 
Alexander:
При компиляции файла SplitButton.mqh выдает ошибку "'return' - cannot convert from const pointer to nonconst pointer SplitButton.mqh 90 65"

Да, после последнего обновления терминала появилась такая ошибка. Правила "игры" немного изменились. Исправить можно просто удалив спецификатор const.

Перейдите к строке с ошибкой и замените эту строку:

CContextMenu     *GetContextMenuPointer(void)        const { return(::GetPointer(m_drop_menu)); }

На эту: 

CContextMenu     *GetContextMenuPointer(void)              { return(::GetPointer(m_drop_menu)); }

//---

Подобные исправления нужно будет внести во всех файлах, где будет встречаться такая ошибка. В следующих статьях серии ошибка будет устранена.

Спасибо за сообщение. 

 

Отличная работа!


Но: при попытке использовать панель в качестве индикатора в MT4 (!), каждое нажатие на "Иконку-кнопку" приводит к двукратному выводу вашего
::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);

Таким образом, каждое действие по клику, как инкремент или что-то еще, будет сделано дважды :(
Есть ли способ исправить это?

P.S. Интересно то, что все работает нормально на MT5. Только в MT4 есть эта проблема при использовании в качестве индикатора. В качестве эксперта работает также нормально.

 
marquez:

...

Есть ли способ исправить это?

P.S. Самое любопытное, что все прекрасно работает на MT5. Только в MT4 есть эта проблема при использовании в качестве индикатора. В качестве эксперта работает также нормально.

Спасибо. Эта ошибка обсуждается в Сервисдеске. Исправление будет сделано после того, как будет опубликована первая версия библиотеки. В ней будет 25 статей.
 

Привет,


Я сделал быстрое и грязное решение, которое работает для меня очень хорошо. Мой способ заключался в том, чтобы сначала проверить нажатие левой кнопки отдельно в OnEvent и, если она установлена, записать bool true в хелпер. После этого обычная строка if расширяется с помощью helper == true , а установка внутри if просто сбрасывает helper. Работает почти идеально. В некоторых случаях быстрые клики не упоминаются, но лучше медленные клики, чем двойные результаты :)

BTW: было бы неплохо, если бы кто-нибудь обновил все ваши текущие Библиотеки на английский язык. Ваши самые новые, например, статья 05 и т.д. только на русском.

 

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



У меня вопрос,

как сделать черную часть вокруг иконок прозрачной?

Спасибо

 

Привет.

Я только что скачал файлы из статьи3.

Когда я скомпилировал его. я получил следующую ошибку

CContextMenu *GetContextMenuPointer(void) const { return(::GetPointer(m_drop_menu));

Файл = splitButton.mqh.

Кто-нибудь знает, как это исправить?


Я пытаюсь создать простую кнопку.

Спасибо

 
Kristina Suh простую кнопку.

спасибо

Удалить "const" - это нормально

CContextMenu *GetContextMenuPointer(void) { return(::GetPointer(m_drop_menu));