Arrastar todos objetos

 
Olá pessoal,

eu estou desenvolvendo um painel simples para abrir e fechar ordens.

Estou usando objetos para fazer a parte gráfica e gostaria de saber se há alguma forma de adicionar todos os labels, botões e textos em um único retângulo? Seria como parentear os objetos em um único objeto e após mover o ponto de ancoragem todos os outros seriam movidos também.

 

Eu já fiz algo parecido usando o CAppDialog com o método Add e infelizmente não encontrei método semelhante para o retângulo e os objetos gráficos.


Eu pensei em colocar um CHARTEVENT_OBJECT_DRAG mas eu não tenho a minima ideia de como ligar todas as ancoras ou se isso é possível.

Faz pouco tempo que eu estou estudando MQL5 e então algumas coisas ainda são um mistérios para mim.

 

Abraços,

Evandro Teixeira. 

#property copyright "Copyright 2015, EvandroTeixeira"
#property link      "http://www.evandroteixeira.com"
#property version   "1.00"

#include <ChartObjects\ChartObjectsTxtControls.mqh>
#include <ChartObjects\ChartObjectsShapes.mqh>

//---
CChartObjectRectLabel   boleta;
CChartObjectRectLabel   sell;
CChartObjectRectLabel   buy;

CChartObjectRectLabel   buyA;
CChartObjectRectLabel   sellA;

CChartObjectRectLabel   buyB;
CChartObjectRectLabel   sellB;

CChartObjectButton      btnBuy;

string nameRect    = "TradePanel";

int      posX        =  6;
int      posY        =  15;
int      sizeXbtn    =  120;
int      sizeYbtn    =  55;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

      boleta.Create(0,nameRect,0,posX,posY,285,220);
      boleta.BackColor(clrDimGray);
      boleta.Selectable(true);
      boleta.BorderType(BORDER_RAISED);
      boleta.Style(STYLE_DASH);
      boleta.Width(5);
      boleta.Anchor(ANCHOR_LEFT_UPPER);

      buy.Create(0,"nameRect2",0,posX+15,posY+45,sizeXbtn+5,sizeYbtn);
      buy.BackColor(clrLightGreen);
      buy.Selectable(false);
      buy.BorderType(BORDER_RAISED);
      buy.Anchor(ANCHOR_LEFT_UPPER);

      sell.Create(0,"nameRect3",0,posX+(sizeXbtn+25),posY+45,sizeXbtn+5,sizeYbtn);
      sell.BackColor(clrLightCoral);
      sell.Selectable(false);
      sell.BorderType(BORDER_RAISED);
      sell.Anchor(ANCHOR_LEFT_UPPER);

      buyA.Create(0,"nameRect4",0,posX+15,posY+15,sizeXbtn-55,sizeYbtn-25);
      buyA.BackColor(clrLightGreen);
      buyA.Selectable(false);
      buyA.BorderType(BORDER_RAISED);
      buyA.Anchor(ANCHOR_LEFT_UPPER);

      sellA.Create(0,"nameRect5",0,posX+(sizeXbtn+85),posY+15,sizeXbtn-55,sizeYbtn-25);
      sellA.BackColor(clrLightCoral);
      sellA.Selectable(false);
      sellA.BorderType(BORDER_RAISED);
      sellA.Anchor(ANCHOR_LEFT_UPPER);

      buyB.Create(0,"reverse",0,posX+15,posY+(sizeYbtn+49),sizeXbtn+5,sizeYbtn-25);
      buyB.BackColor(clrLightSalmon);
      buyB.Selectable(false);
      buyB.BorderType(BORDER_RAISED);
      buyB.Anchor(ANCHOR_LEFT_UPPER);

      sellB.Create(0,"closePos",0,posX+(sizeXbtn+25),posY+(sizeYbtn+49),sizeXbtn+5,sizeYbtn-25);
      sellB.BackColor(clrLightGray);
      sellB.Selectable(false);
      sellB.BorderType(BORDER_RAISED);
      sellB.Anchor(ANCHOR_LEFT_UPPER);

      btnBuy.Create(0,"btnBuy",0,sizeXbtn-31,posY+15,sizeXbtn,sizeYbtn-26);
      btnBuy.BackColor(clrAliceBlue);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
      ObjectsDeleteAll(0,0,-1);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {

//--- 
  }
 
Evandro Teixeira:
Olá pessoal,

eu estou desenvolvendo um painel simples para abrir e fechar ordens.

Estou usando objetos para fazer a parte gráfica e gostaria de saber se há alguma forma de adicionar todos os labels, botões e textos em um único retângulo? Seria como parentear os objetos em um único objeto e após mover o ponto de ancoragem todos os outros seriam movidos também. 

Eu já fiz algo parecido usando o CAppDialog com o método Add e infelizmente não encontrei método semelhante para o retângulo e os objetos gráficos.


Eu pensei em colocar um CHARTEVENT_OBJECT_DRAG mas eu não tenho a minima ideia de como ligar todas as ancoras ou se isso é possível.

Faz pouco tempo que eu estou estudando MQL5 e então algumas coisas ainda são um mistérios para mim.

Abraços,

Evandro Teixeira. 

Olá Evandro Teixeira,

Já deu uma olhada na função ObjectMove ?

https://www.mql5.com/pt/docs/objects/objectmove 

Abraços,
Malacarne

Documentação sobre MQL5: Funções de Objeto / ObjectMove
Documentação sobre MQL5: Funções de Objeto / ObjectMove
  • www.mql5.com
Funções de Objeto / ObjectMove - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Rodrigo Malacarne:

Olá Evandro Teixeira,

Já deu uma olhada na função ObjectMove ?

https://www.mql5.com/pt/docs/objects/objectmove 

Abraços,
Malacarne

Olá Rodrigo,

na verdade eu não entendi muito bem a logica de como usar o ObjectMove no código.

Se você pudesse explicar um pouco melhor ajudaria os meus estudos :)

 

Porém eu consegui uma solução usando o X_Distance e o Y_Distance, não sei se é a melhor opção para esse caso mas funcionou.

Muito obrigado.

 

 

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   if (sparam == boleta.Name())
   {
      if (id == CHARTEVENT_OBJECT_DRAG)
      {
            int x_dis = boleta.X_Distance();
            int y_dis = boleta.Y_Distance();

            buy.X_Distance(x_dis+15);
            buy.Y_Distance(y_dis+45);

            sell.X_Distance(x_dis+(sizeXbtn+25));
            sell.Y_Distance(y_dis+45);

            buyA.X_Distance(x_dis+15);
            buyA.Y_Distance(y_dis+15);

            sellA.X_Distance(x_dis+(sizeXbtn+85));
            sellA.Y_Distance(y_dis+15);

            buyB.X_Distance(x_dis+15);
            buyB.Y_Distance(y_dis+(sizeYbtn+49));

            sellB.X_Distance(x_dis+(sizeXbtn+25));
            sellB.Y_Distance(y_dis+(sizeYbtn+49));

            btnBuy.X_Distance(x_dis+(sizeXbtn-37));
            btnBuy.Y_Distance(y_dis+15);

            ChartRedraw();
      }
   }

        ChartRedraw();
}