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

Для объектов типа кнопки (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 x, const int y,
   const int dx, const int dy,
   const bool state = false)
{
   const string name = ObjNamePrefix + button;
   ObjectCreate(0, name, OBJ_BUTTON, 0, 0, 0);
   // позиция и размер
   ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
   ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
   ObjectSetInteger(0, name, OBJPROP_XSIZE, dx);
   ObjectSetInteger(0, name, OBJPROP_YSIZE, dy);
   // надпись на кнопке
   ObjectSetString(0, name, OBJPROP_TEXT, button);
   
   // нажата (true) / отжата (false)   
   ObjectSetInteger(0, name, OBJPROP_STATE, state);
}

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

void OnStart()
{
   SetupButton("Pressed", 100, 100, 100, 20, true);
   SetupButton("Normal", 100, 150, 100, 20);
}

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

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

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

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

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

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