El lienzo es genial. - página 24

 
Rafil Nurmukhametov:

Hola@Nikolai Semko, ¿podrías decirme si es posible hacer un objeto transparente superpuesto al texto en una capa del lienzo, ver la imagen? El segundo círculo transparente es la segunda capa, este objeto no me supone ningún problema para hacerlo transparente.

Una pregunta más, ¿cómo insertar una imagen en la capa del lienzo o debo colocarla como una capa adicional? Sé que es un recurso, pero no consigo que funcione, ¿puedes mostrarme un ejemplo de código?

Si se utiliza la transparencia (COLOR_FORMAT_ARGB_NORMALIZE), la transparencia de dos capas tr1 y tr2 debe mezclarse mediante la fórmula

double tr=tr1+tr2-tr1*tr2; // где tr, tr1, tr1 меняются от нуля (абсолютная прозрачность) до 1(абсолютная непрозрачность) 

Ejemplo de un guión con círculos aleatorios de color aleatorio y transparencia aleatoria:


#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164
#define  Num 100
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
// инициализация случайных окружностей
   uint X[Num],Y[Num],sr[Num],clr[Num],Rmin[Num],Rmax[Num];
   double sx[Num],sy[Num];
   for(int i=0; i<Num; i++)
     {
      X[i]=rand()%3141;
      Y[i]=rand()%3141;
      sr[i]=rand()%3141;
      sx[i]=0.3+0.7*(double)rand()/32767.0;
      sy[i]=0.3+0.7*(double)rand()/32767.0;
      clr[i]=ARGB(rand()%256,rand()%256,rand()%256,rand()%256);
      int r2=5+rand()%100;
      int r1=5+rand()%100;
      Rmin[i]=(int)fmin(r1,r2);
      Rmax[i]=(int)fmax(r1,r2);
     }
// формирование изображения из Num (= 100) полупрозрачных кругов
   double j=0;
   while(!IsStopped())
     {
      Canvas.Erase();
      Canvas.CurentFont("Arial",30);
      Canvas.TextPosY=100;
      Canvas.Comm("Hello World!");
      for(int i=0; i<Num; i++)
        {
         Circle(W.Width/2*(1+sin((X[i]+sx[i]*j)*M_PI/1000)),
                W.Height/2*(1+sin((Y[i]+sy[i]*j)*M_PI/1000)),
                Rmin[i]+double(Rmax[i]-Rmin[i])/2*(1.0+cos((j+sr[i])*M_PI/1000)),clr[i]);
        }
      Canvas.Update();
      j+=0.3;
      Sleep(30);
     }
  }
//+------------------------------------------------------------------+

void Circle(double x,double y,double r,uint clr) 
  {
   double R2=r*r;
   for(int X=Round(x-r); X <=Round(x+r);X++)
      for(int Y=Round(y-r); Y<=Round(y+r);Y++)
         if(((x-X)*(x-X)+(y-Y)*(y-Y))<=R2) Canvas.PixelSet(X,Y,MixColor(clr,Canvas.PixelGet(X,Y)));
  }
//+------------------------------------------------------------------+

uint MixColor(uint clr,uint clrback)// смешиваем цвет и прозрачность clr c цветом и прозрачностью фона clrback
  {
   argb C,Bg;
   if(clrback==0) return clr;
   C.clr=clr;
   if(C.c[3]==255) return clr;
   Bg.clr=clrback;
   double tr=C.c[3]/255.0;
   double trb=Bg.c[3]/255.0;

   C.c[2]=uchar(Bg.c[2]+tr*(C.c[2]-Bg.c[2]));
   C.c[1]=uchar(Bg.c[1]+tr*(C.c[1]-Bg.c[1]));
   C.c[0]=uchar(Bg.c[0]+tr*(C.c[0]-Bg.c[0]));

   C.c[3]=uchar((trb+tr-trb*tr)*255.0+0.49999);
   return C.clr;
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
 
Rafil Nurmukhametov:

@Nikolai Semko

Tengo una pregunta más: ¿cómo insertar una imagen en la capa del lienzo o debo colocarla como una capa adicional? Entiendo que de alguna manera a través de un recurso, pero no consigo nada, ¿puedes mostrarme un ejemplo de código?

Puede ver cómo trabajar con imágenes aquí .
Al fin y al cabo, una imagen es lo mismo que una matriz de puntos.
Este ejemplo muestra cómo convertir los recursos de dos archivos bmp en arrays uint BMP1[], BMP2[] y seguir trabajando con estos arrays en un lienzo.

 
Muchas gracias Nikolai, por fin lo he solucionado
 
Rafil Nurmukhametov:
Muchas gracias Nikolai, por fin lo he solucionado

De nada.

 

Primeros experimentos con el marco temporal dinámico.

EURUSD toda la historia en la dinámica:

.

La fractura es evidente.
 
Nikolai Semko:

Primeros experimentos con el marco temporal dinámico.

EURUSD toda la historia en la dinámica:

.

La fractura es evidente.
He visto tu mensaje en inglés.
Por favor, publica más en inglés, incluyendo CodaBase (tu material es muy popular allí).
Para información.
 
Sergey Golubev:
He visto tu mensaje en inglés.
Quiero pedirte que publiques más en la parte inglesa, incluyendo KodaBase (tu material es muy popular allí).
Sólo para información.
Gracias. Haré lo que pueda.
Sin embargo, me pareció que en la parte anglófona del foro, la reacción a mis mensajes fue casi nula. La sensación todo el tiempo es que "en silencio para mí...".
 
Nikolai Semko:

Primeros experimentos con el marco temporal dinámico.

EURUSD toda la historia en la dinámica:

.

La fractura es evidente.
¡Bien hecho!
 
¡Genial!
 
Nikolai Semko:

Primeros experimentos con el marco temporal dinámico.

EURUSD toda la historia en la dinámica:

.

La fractura es evidente.

Bastante visual, interesante.

¿Te imaginas las garrapatas también de esta manera?