A lona é legal! - página 27

 
Aлександр Антошкин:
A águia com duas cabeças em diferentes formas, cores e versões está em nosso brasão há mais de cinco séculos - desde a época do Estado de Moscou durante o tempo de Ivan III até 1918, como conseqüência da mutação genética.....
O que você quer corrigir em Peter?

Eu não entendo a lógica. Onde você viu que eu quero corrigir algo em alguém?

 
Nikolai Semko:

Eu não entendo a lógica. Onde você me viu querendo corrigir algo de alguém?

É um trolling tão sutil. Insinuando que sou uma conseqüência incorrigível da mutação genética). Eu li outros posts do autor e pensei que ele mesmo é uma IA experimental em nosso fórum. ))

https://www.mql5.com/ru/forum/221552/page1485#comment_12959767

От теории к практике
От теории к практике
  • 2019.08.23
  • www.mql5.com
Добрый вечер, уважаемые трейдеры! Решил было на какое-то время покинуть форум, и сразу как-то скучно стало:)))) А просто читать, увы - неинтересно...
 
Aleksey Vyazmikin:

É assim que os carrapatos podem ser apresentados?

 
fxsaber:

Os carrapatos devem ser apresentados como barras - 5 segundos cada, digamos.

 

Olá!

É possível usar a Tela para criar painéis? (CAppDialog).

Diretamente, com Add(), um objeto CCanvas obviamente não pode ser adicionado a um painel.

Talvez haja uma alternativa, por exemplo, primeiro criar um recurso e depois, tratando-o como um objeto mais simples, você pode ligá-lo a um CAppDialog?

Mas eu nem sei bem que funções usar para tentar puxar um truque desses.

De qualquer forma, socorro!

Há tanta coisa grande neste fio que minha tarefa parece bastante simples neste contexto!

 
Evgeny Potapov:

Olá!

É possível usar a Tela para criar painéis? (CAppDialog).

Diretamente, com Add(), um objeto CCanvas obviamente não pode ser adicionado a um painel.

Talvez haja uma alternativa, por exemplo, primeiro criar um recurso e depois, tratando-o como um objeto mais simples, você pode ligá-lo a um CAppDialog?

Mas eu nem sei bem que funções usar para tentar puxar um truque desses.

De qualquer forma, socorro!

Há tanta coisa ótima neste tópico, que minha tarefa parece bastante simples neste contexto!

Receio que não vai funcionar.
Porque CAppDialog é desenhado em objetos OBJ_RECTANGLE, e CCanvas é objeto OBJ_BITMAP_LABEL e não há maneira de cruzá-los.
Mas é possível desenhar uma tela em cima da janela do painel e monitorar as mudanças no painel e, ao mesmo tempo, redesenhar a tela.

Assim:

// это эксперт
#define protected public  // увы, это необходимо, чтобы расширить наши возможности 
#include <Controls\Dialog.mqh>
#include <Canvas\Canvas.mqh> 
#undef protected
CAppDialog D;
CCanvas C;
int OnInit()
  {
   if(!D.Create(0,"AppWindow",0,100,100,400,300))
      return(INIT_FAILED);
   D.Run();
   if(!C.CreateBitmapLabel(D.m_chart_id,D.m_subwin,D.m_name+"_Canvas",D.m_rect.left,D.m_rect.top,D.m_rect.right-D.m_rect.left,D.m_rect.bottom-D.m_rect.top,COLOR_FORMAT_ARGB_NORMALIZE))
      Print("Error creating canvas: ",GetLastError());
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   D.Destroy(reason);
   C.Destroy();
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,          
                  const long& lparam,   
                  const double& dparam, 
                  const string& sparam) 
  {
   static int X=0, Y=0;
   D.ChartEvent(id,lparam,dparam,sparam);
   if (D.m_rect.left!=X || D.m_rect.top!=Y) 
   { DrawCanvas(); X=D.m_rect.left; Y=D.m_rect.top;}
  }
//+------------------------------------------------------------------+
void DrawCanvas()
{
 // изменяем канвас в соответсвии положения и размера панели
 static int w=0, h=0, tf=0;
 int x=D.m_rect.left;
 int y=D.m_rect.top;
 int width = D.m_rect.right-x;
 int height =D.m_rect.bottom-y;
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_XDISTANCE,x);
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_YDISTANCE,y);
 if (w!=width) ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_XSIZE,width);
 if (h!=height) ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_YSIZE,height);
 
 if(w!=width || h!=height || tf!=_Period)
 {
   C.Erase();
// здесь формируем рисунок на панели
   C.FillCircle(50,20,30,ColorToARGB(clrViolet,200));
   C.FillCircle(100,100,50,ColorToARGB(clrLightBlue,100));
   C.Rectangle(200,50,250,150,ColorToARGB(clrAqua));
//----------------------------------
   C.Update(); 
   
   tf=_Period;
   w=width;
   h=height;
 }
}



mas como um painel é um conjunto de objetos, basta adicionar outro a esse conjunto.

Assim, desta forma funciona e a tela é desenhada apenas em um lugar (neste caso, a função DrawCanvas) nas coordenadas do painel e não preciso me preocupar em anexá-la ao painel e desenhá-la novamente.

 
   if (D.m_rect.left!=X || D.m_rect.top!=Y) DrawCanvas();
   else {X=D.m_rect.left; Y=D.m_rect.top;}
Else сработает только когда left=x и top=y , тогда зачем их присваивать ещё раз
 
Aleksei Beliakov:

Sim, obrigado, Alexey. Abrandado ))
Corrigido.

 
Nikolai Semko:

Receio que isto não vá funcionar.
Porque CAppDialog é desenhado usando objetos OBJ_RECTANGLE e CCanvas é um objeto OBJ_BITMAP_LABEL e não há maneira de fundi-los.

Obrigado! Esta variante parece bastante realista!

É possível estender o CAppDialog e incluir nele OBJ_BITMAP_LABEL?

 
Evgeny Potapov:

Obrigado! Esta variante parece bastante realista!

É possível estender o CAppDialog e incluir nele OBJ_BITMAP_LABEL?

É claro que é possível, se você tiver o desejo e o tempo.