El lienzo es genial. - página 5

 

Se ha modificado ligeramente el código. Había dos centros de gravedad giratorios, ahora hay cuatro.

#include <Canvas\Canvas.mqh>

void OnStart()
  {
   ChartSetInteger(0,CHART_FOREGROUND,true);
   CCanvas C;
   int Width=(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);                               // получаем Ширину окна
   int Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);                             // получаем Высоту окна
   if(!C.CreateBitmapLabel(0,0,"CanvasExamlple",0,0,Width,Height,COLOR_FORMAT_XRGB_NOALPHA)) // создаем канвас размером текущего окна
   Print("Error creating canvas: ",GetLastError()); 
   uint i=0,j=100000;
   int size=Width*Height;
   uchar h[25600];
   for (int w=0;w<25600;w++) 
   h[w]= uchar(128+128*sin(double(w)/256));//создаем массив для ускорения работы
   double X1=0,Y1=0,X2=0,Y2=0,X3=0,Y3=0,X4=0,Y4=0;
   while(!IsStopped())
     {
      int pos=int(i%size);
      if(pos==0)
        {
         C.Update();
         //Sleep(30);
         X1= Width/2-(sin((double)j/100)*(double)Width/2);
         Y1= Height/2-(cos((double)j/140)*(double)Height/2);
         X2= Width/2+(cos((double)j/80)*(double)Width/2);
         Y2= Height/2+(sin((double)j/20)*(double)Height/2);
         X3= Width/2+(cos((double)j/85)*(double)Width/2);
         Y3= Height/2+(sin((double)j/65)*(double)Height/2);
         X4= Width/2+(cos((double)j/152)*(double)Width/2);
         Y4= Height/2+(sin((double)j/42)*(double)Height/2);
         j++;
        }
      int X=pos%Width;
      int Y=int(pos/Width);
      double D1=sqrt((X1-X)*(X1-X)+(Y1-Y)*(Y1-Y));
      double D2=sqrt((X2-X)*(X2-X)+(Y2-Y)*(Y2-Y));
      double D3=sqrt((X3-X)*(X3-X)+(Y3-Y)*(Y3-Y));
      double D4=sqrt((X4-X)*(X4-X)+(Y4-Y)*(Y4-Y));
      double d= (D1+D2)/(D1+D2+D3+D4);
      //C.m_pixels[pos]=XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]); // чуть быстрее работает, но требует переноса в Canvas.mqh массива m_pixels из protected в public
      C.PixelSet(X,Y,XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]));
      i++;
     }
   C.Destroy();
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
LSD.mq5  4 kb
 
Nikolai Semko:

Se ha modificado ligeramente el código. Había dos centros de gravedad giratorios, ahora hay cuatro.


¡Genial!

Es bueno hipnotizar a los clientes para que no paguen

las pérdidas y simplemente disfrutar del proceso.

 
Denis Sartakov:

¡genial!

Es bueno hipnotizar a los clientes para que no paguen

La mejor manera es hipnotizar a los clientes para que no presten atención a las pérdidas, sino que se limiten a disfrutar del proceso.

No quiero caer en esta hipnosis. :)

Y tengo que estar de acuerdo, ¡el lienzo es genial!

Vaya, creo que lo tengo. ))))

 
Nikolai Semko:

Se ha modificado ligeramente el código. Había dos centros de gravedad giratorios, ahora hay cuatro.

Necesito un fotograma veinticinco con una sugerencia de "planta" - "compra tal robot, compra tal robot..."- ¡entonces será un desarrollo supervalioso!
 
Aleksey Ivanov:
También deberías poner un marco de veinticinco con una oferta "para plantar" - "compra tal robot, compra tal robot...", ¡entonces, en absoluto, saldrá un desarrollo súper valioso!
Es una idea genial. Lo haré hoy.
 
Aleksey Ivanov:
Necesitas un marco de veinticinco con una oferta "de planta" - "compra tal robot, compra tal robot..."-, ¡entonces será un desarrollo súper valioso!

Hecho.

Archivos adjuntos:
LSD25.mq5  6 kb
 
Nikolai Semko:

Hecho.

¡Bien hecho! Llegarás lejos.

 

En OnInit creo un lienzo

   canvas.CreateBitmapLabel(prefix+"bg",1,17,WidthBg,HeightBg,COLOR_FORMAT_ARGB_NORMALIZE);
   ObjectSetInteger(0,prefix+"bg",OBJPROP_SELECTABLE,true);
   ObjectSetInteger(0,prefix+"bg",OBJPROP_SELECTED,true);
   ObjectSetInteger(0,prefix+"bg",OBJPROP_COLOR,clrNONE);
   canvas.Erase(ColorToARGB(C'221,219,219',200)); // цвет фона
   canvas.Rectangle(0,0,canvas.Width()-1,canvas.Height()-1,ColorToARGB(clrGray));// Рамка
   canvas.Update();

Entonces necesito cambiar el color a las 10:00 a gris en OnTick y devolverlo al estado original de nuevo a las 11:00.

No funciona:

   if(Flag) {
    // Перекрашиваем фон
      canvas.Erase(ColorToARGB(C'221,219,219',200));
      canvas.Rectangle(0,0,canvas.Width()-1,canvas.Height()-1,ColorToARGB(clrDarkOliveGreen));// Рамка
      canvas.Update();
   } else { 
    // Возвращаем фон в нормальный цвет
      canvas.Erase(ColorToARGB(ResultColor,200));
      canvas.Rectangle(0,0,canvas.Width()-1,canvas.Height()-1,ColorToARGB(clrGray));// Рамка
      canvas.Update();
   }

Pregunta:

¿Cómo puedo cambiar el color del lienzo y del marco - sin referencia a los nombres de los objetos?

Gracias.

 
Vitaly Muzichenko:

En OnInit creo un lienzo

Entonces necesito cambiar el color a las 10:00 a gris en OnTick y devolverlo al estado original de nuevo a las 11:00.

No funciona:

Pregunta:

¿Cómo puedo cambiar el color del lienzo y del marco - sin referencia a los nombres de los objetos?

Gracias.

El canvas.Rectangle no es un objeto, es un comando para dibujar un montón de píxeles. Es como un disparo: se dispara una bala y adiós. No hay retroalimentación.

 

Hay un artículo que explica la clase CCanvas.Implementación de la transparencia de los objetos gráficos, debe haber una solución allí.

Razón de la queja: