Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2596

 

Andrei Sokolov #:
Осталось найти как сделать чтоб OnChartEvent работал в тестере робота mt5.

Aleksandr Slavskii #:
Повесь сверху над кнопкой картинку сделанную на канвасе, там можно хоть какие закругления лепить, а чтоб кнопка срабатывала под этой картинкой , сделать ей приоритет OBJPROP_ZORDER на нажатие больше чем у OBJ_BITMAP_LABEL.


Такой вариант, это эксперт МТ5.

Файлы:
obj_test.mq5  3 kb
 
Tretyakov Rostyslav #:

Такой вариант, это эксперт МТ5.

Вопрос был в том, как сделать кнопку скруглённой и рабочей в тестере.

Такой вариант отвечает только на вторую часть вопроса.

 
Andrei Sokolov #:

Все ли места на картинке, в тч где скругления, приведут к срабатыванию кнопки? 

Ну тогда вписать картинку внутрь кнопки, кнопку сделать под цвет фона или задать невидимый цвет и сделать её на заднем плане, чтоб поверх свечей не вылазила.

Не проверял.

 
Aleksandr Slavskii #:

Ну тогда вписать картинку внутрь кнопки, кнопку сделать под цвет фона или задать невидимый цвет и сделать её на заднем плане, чтоб поверх свечей не вылазила.

Не проверял.

Не, не работает, BORDER_FLAT для кнопки не работает, рамку сделать невидимой или под цвет графика тоже не получается.

Значит только сверху картинку, ну не будут при этом закругления срабатывать, так ведь только в тестере.

Сказать заказчику, что это у него целкость нарушена, поэтому попасть не может. Пусть тренируется, целится по центру кнопки.

 
М да. Довольно таки громоздко получилось. Но зато края закруглённые :)
Файлы:
obj_test.mq5  9 kb
 
Aleksandr Slavskii #:
М да. Довольно таки громоздко получилось. Но зато края закруглённые :)

Если бы было показано кодом, было бы видно. А загружать и захламлять и так захламлённые каталоги ради "просто посмотреть для интереса" - не интересно. Посему - не глядим, хоть и интересно.

Такая вот печаль...

 
Artyom Trishkin #:

Если бы было показано кодом, было бы видно. А загружать и захламлять и так захламлённые каталоги ради "просто посмотреть для интереса" - не интересно. Посему - не глядим, хоть и интересно.

Такая вот печаль...

Да там ничего интересного нет, практически тоже самое, что у Ростислава, только кнопка с закруглёнными краями.

Хотя если рисовать только кнопку, без границ и не сильно широкую, то можно и менее громоздко

#include <Canvas\Canvas.mqh>
CCanvas           canv;
bool obj_state = false;
bool tester = false;
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ObjectCreate(0, "name", OBJ_BUTTON, 0, 0, 0);
   ObjectSetInteger(0, "name", OBJPROP_XDISTANCE, 100);
   ObjectSetInteger(0, "name", OBJPROP_YDISTANCE, 100);
   ObjectSetInteger(0, "name", OBJPROP_XSIZE, 120);
   ObjectSetInteger(0, "name", OBJPROP_YSIZE, 20);
   ObjectSetInteger(0, "name", OBJPROP_BGCOLOR, clrNONE);
   ObjectSetInteger(0, "name", OBJPROP_BORDER_COLOR, clrNONE);
   ObjectSetInteger(0, "name", OBJPROP_BACK, true);
   ObjectSetInteger(0, "name", OBJPROP_ZORDER, 1);
   ObjectCreate(0, "name1", OBJ_RECTANGLE_LABEL, 0, 0, 0);
   ObjectSetInteger(0, "name1", OBJPROP_XDISTANCE, 100);
   ObjectSetInteger(0, "name1", OBJPROP_YDISTANCE, 150);
   ObjectSetInteger(0, "name1", OBJPROP_XSIZE, 120);
   ObjectSetInteger(0, "name1", OBJPROP_YSIZE, 20);
   ObjectSetInteger(0, "name1", OBJPROP_BGCOLOR, clrRed);
   ObjectSetInteger(0, "name1", OBJPROP_BACK, false);


   string objName = "RoundedRect";
   int x = 95, y = 99, width = 130, height = 22;
   int radius = height / 2; // Радиус скругления
   canv.CreateBitmapLabel(0, 0, objName, x, y, width, height, COLOR_FORMAT_ARGB_NORMALIZE);
   canv.Erase(ColorToARGB(clrBlack, 0));
   uint fillColor = ColorToARGB(clrBlue, 255);
   canv.FillRectangle(radius, 0, width - radius - 1, height - 1, fillColor);
   canv.FillCircle(radius, radius, radius, fillColor); 
   canv.FillCircle(width - radius - 1, radius, radius, fillColor);
   canv.Update(true);

   tester = MQLInfoInteger(MQL_TESTER);
   if(!tester)
      EventSetMillisecondTimer(20);

   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0, "name");
   ObjectDelete(0, "name1");
   canv.Destroy();
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   if(tester)
      Work();
  }
//+------------------------------------------------------------------+
void OnTimer()
  {
   Work();
  }
//+------------------------------------------------------------------+
void Work()
  {
   if(ObjectGetInteger(0, "name", OBJPROP_STATE))
     {
      ObjectSetInteger(0, "name1", OBJPROP_BGCOLOR, clrRed);
      ChartRedraw();
     }
   else
      if(!ObjectGetInteger(0, "name", OBJPROP_STATE))
        {
         ObjectSetInteger(0, "name1", OBJPROP_BGCOLOR, clrGreen);
         ChartRedraw();
        }
  }
//+------------------------------------------------------------------+
 
Aleksandr Slavskii #:

Да там ничего интересного нет, практически тоже самое, что у Ростислава, только кнопка с закруглёнными краями.


Хорошо. Но почему Вы говорите, что BORDER_FLAT для кнопки не работает?

Работает же

 
Artyom Trishkin #:

Хорошо. Но почему Вы говорите, что BORDER_FLAT для кнопки не работает?

Работает же

У меня кнопка никак не захотела реагировать на эту настройку, вот я и подумал...

А сейчас вот думаю, что возможно я каким то чудом сеттер с геттером перепутал. 


PS. Ну проверил, хоть что выбирай, кнопка плоской не становится. Вообще никак не реагирует

Может я не правильно чего то делаю?

ObjectSetInteger(0, "name", OBJPROP_BORDER_TYPE, BORDER_FLAT);
Это правильно?
 
Aleksandr Slavskii #:
Не, не работает, BORDER_FLAT для кнопки не работает, рамку сделать невидимой или под цвет графика тоже не получается.
В моем примере кнопки вообще не видно, посмотрите где клики на видео