Управление нажатым состоянием объекта

Для объектов типа кнопки (OBJ_BUTTON) и панели с картинкой (OBJ_BITMAP_LABEL) терминал поддерживает специальное свойство, визуально переключающее объект из нормального (отжатого) состояния в нажатое и обратно. Для этого зарезервирована константа OBJPROP_STATE. Свойство имеет логический тип: при значении true объект считается нажатым, а при false — отжатым (по умолчанию).

Если для OBJ_BUTTON эффект объемной рамки рисует сам терминал, то для OBJ_BITMAP_LABEL программист должен указать два изображения (как файлы или ресурсы), которые обеспечат подходящее внешнее представление. Поскольку с технической точки зрения данное свойство является просто переключателем, его легко использовать не только для эффекта "нажатия" и "отжатия", но и других целей. Например, с помощью соответствующих изображений можно реализовать флаг (опцию).

Об использовании изображений в объектах будет рассказано в следующем разделе.

В принципе, состояние объектов обычно меняется в интерактивных MQL-программах, которые реагируют на действия пользователя, в частности, нажатия мыши. Мы обратимся к этой возможности в главе про события.

Сейчас протестируем свойство на простых кнопках, в статичном режиме. Скрипт ObjectButtons.mq5 создает на графике две кнопки: одну в нажатом состоянии, другую — в отжатом.

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

#include "ObjectPrefix.mqh"
   
void SetupButton(const string button,
   const int xconst int y,
   const int dxconst int dy,
   const bool state = false)
{
   const string name = ObjNamePrefix + button;
   ObjectCreate(0nameOBJ_BUTTON000);
   // позиция и размер
   ObjectSetInteger(0nameOBJPROP_XDISTANCEx);
   ObjectSetInteger(0nameOBJPROP_YDISTANCEy);
   ObjectSetInteger(0nameOBJPROP_XSIZEdx);
   ObjectSetInteger(0nameOBJPROP_YSIZEdy);
   // надпись на кнопке
   ObjectSetString(0nameOBJPROP_TEXTbutton);
   
   // нажата (true) / отжата (false)   
   ObjectSetInteger(0nameOBJPROP_STATEstate);
}

Затем в OnStart дважды вызываем эту функцию.

void OnStart()
{
   SetupButton("Pressed"10010010020true);
   SetupButton("Normal"10015010020);
}

Получившиеся кнопки могут выглядеть следующим образом.

Нажатая и отжатая кнопки OBJ_BUTTON

Нажатая и отжатая кнопки OBJ_BUTTON

Что интересно — вы можете щелкнуть по любой из кнопок мышью, и кнопка сменит свое состояние. Правда, мы еще не научились перехватывать уведомление об этом.

Важно отметить, что данное автоматическое переключение состояния выполняется, только если в свойствах объектов взведена опция Отключить выделение, но это условие по умолчанию выполняется для всех объектов, созданных программно. Напомним, что при необходимости выделение можно и разрешить — для этого надо явным образом установить свойство OBJPROP_SELECTABLE в true, чем мы пользовались в некоторых предыдущих примерах.

Для удаления ставших ненужными кнопок воспользуйтесь скриптом ObjectCleanup1.mq5.