El lienzo es genial. - página 27

 
Aлександр Антошкин:
El águila con dos cabezas, en diferentes formas, colores y versiones, figura en nuestro escudo desde hace más de cinco siglos, desde la época del Estado de Moscú en tiempos de Iván III hasta 1918, como consecuencia de una mutación genética.....
¿Qué es lo que quiere corregir en Pedro?

No entiendo la lógica. ¿Dónde has visto que quiero corregir algo en alguien?

 
Nikolai Semko:

No entiendo la lógica. ¿Dónde has visto que quiera corregir algo de alguien?

Es un troleo tan sutil. insinuando que soy una consecuencia incorregible de la mutación genética). He leído los otros mensajes del autor y he pensado que él mismo es una IA experimental en nuestro foro. ))

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

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

¿Es así como se pueden presentar las garrapatas?

 
fxsaber:

Me refiero a que los ticks deberían presentarse como barras - 5 segundos cada una, digamos.

 

¡Hola!

¿Es posible utilizar Canvas para crear paneles? (CAppDialog).

Directamente, con Add(), un objeto CCanvas obviamente no puede ser añadido a un panel.

¿Tal vez haya una solución, por ejemplo, crear primero un recurso y luego, tratándolo como un objeto más simple, se puede vincular a un CAppDialog?

Pero ni siquiera estoy seguro de qué funciones usar para intentar hacer tal truco.

De todos modos, ¡ayuda!

Hay tantas cosas buenas en este hilo, que mi tarea parece bastante sencilla en este contexto.

 
Evgeny Potapov:

¡Hola!

¿Es posible utilizar Canvas para crear paneles? (CAppDialog).

Directamente, con Add(), un objeto CCanvas obviamente no puede ser añadido a un panel.

¿Tal vez haya una solución, por ejemplo, crear primero un recurso y luego, tratándolo como un objeto más simple, se puede vincular a un CAppDialog?

Pero ni siquiera estoy seguro de qué funciones usar para intentar hacer tal truco.

De todos modos, ¡ayuda!

Hay tantas cosas buenas en este tema, que mi tarea parece bastante sencilla en este contexto.

Me temo que no funcionará.
Porque CAppDialog se dibuja sobre objetos OBJ_RECTANGLE, y CCanvas es un objeto OBJ_BITMAP_LABEL y no hay forma de cruzarlos.
Pero es posible dibujar un lienzo encima de la ventana del panel y controlar los cambios en el panel y redibujar el lienzo al mismo tiempo.

Así:

// это эксперт
#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;
 }
}



pero como un panel es un conjunto de objetos, basta con añadir otro a ese conjunto.

Así, de esta manera funciona y el kanvas se dibuja sólo en un lugar (en este caso, la función DrawCanvas) en las coordenadas del panel y no tengo que preocuparme de adjuntarlo al panel y redibujarlo.

 
   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:

Sí, gracias, Alexey. Se ha ralentizado ))
Corregido.

 
Nikolai Semko:

Me temo que esto no funcionará.
Porque CAppDialog se dibuja usando objetos OBJ_RECTANGLE y CCanvas es un objeto OBJ_BITMAP_LABEL y no hay forma de fusionarlos.

Gracias. Esta variante parece bastante realista.

¿Es posible extender CAppDialog e incluir OBJ_BITMAP_LABEL en él?

 
Evgeny Potapov:

Gracias. Esta variante parece bastante realista.

¿Es posible extender CAppDialog e incluir OBJ_BITMAP_LABEL en él?

Por supuesto que es posible, si se tienen ganas y tiempo.

Razón de la queja: