Discussione sull’articolo "Studiare la classe CCanvas. Come disegnare oggetti trasparenti" - pagina 3

 
Vladimir, non sono bravo con la tela....
Ecco una domanda.
Disegno diverse forme nella tela e le sovrappongo l'una all'altra. Come si fa a far sì che i colori rimangano originali senza mescolarsi?

Ho impostato COLOR_FORMAT_XRGB_NOALPHA, ma la miscelazione avviene :-((((.

Tuttavia, ho questa variante. C'è un'immagine di tipo CPicture collegata a una finestra di dialogo di tipo CDialog. È collegata a una risorsa di tipo CCanvas. Quest'ultima viene creata senza legarsi a una finestra.

 
Dennis Kirichenko:
Vladimir, non sono bravo con la tela....
Ecco una domanda.
Disegno diverse forme nella tela e le sovrappongo l'una all'altra. Come si fa a far sì che i colori rimangano originali senza mescolarsi?

Ho impostato COLOR_FORMAT_XRGB_NOALPHA, ma la miscelazione avviene :-((((

...

Knavas

Il colore disegnato nella tela (chiamiamolo "top" o ultimo) sostituisce il colore disegnato nella tela in precedenza.

//+------------------------------------------------------------------+
//|canvas+xor.mq5 |
//|Copyright © 2015, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property description "The script draws overlapping areas on canvas"
//--- mostra la finestra dei parametri di input all'avvio dello script
#property script_show_inputs
#include <Canvas\Canvas.mqh>
//--- ingresso
input uchar alfa=150;         // canale alfa che gestisce la trasparenza del colore
//--- larghezza e altezza variabili del grafico.
int            ChartWidth=-1;
int            ChartHeight=-1;
//+------------------------------------------------------------------+
//| Funzione di avvio del programma di script|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- larghezza e altezza del grafico
   ChartWidth=ChartWidthInPixels();
   ChartHeight=ChartHeightInPixelsGet()-50;

//--- creare la tela COLOR_FORMAT_XRGB_NOALPHA
   CCanvas canvas_XARGB_NORMALIZE;
   if(!canvas_XARGB_NORMALIZE.CreateBitmapLabel("canvas_XARGB_NORMALIZE",0,0,
      ChartWidth,ChartHeight,COLOR_FORMAT_ARGB_NORMALIZE))
     {
      Print("Error creating canvas: ",GetLastError());
      return;
     }
   canvas_XARGB_NORMALIZE.Erase(ColorToARGB(clrAqua,255));
//--- creare un rettangolo #1
   canvas_XARGB_NORMALIZE.FillRectangle(ChartWidth/20,ChartHeight/20,
                                        10*ChartWidth/20,10*ChartHeight/20,
                                        ColorToARGB(clrBlue,alfa));
   canvas_XARGB_NORMALIZE.Update();
//--- attendere 3 secondi
   Sleep(3000);
//--- creare un rettangolo #2
   canvas_XARGB_NORMALIZE.FillRectangle(7*ChartWidth/20,7*ChartHeight/20,
                                        16*ChartWidth/20,16*ChartHeight/20,
                                        ColorToARGB(clrGreen,alfa));
   canvas_XARGB_NORMALIZE.Update();
//--- attendere 3 secondi
   Sleep(3000);
  }
//+------------------------------------------------------------------+
//| Larghezza della proprietà del grafico|
//+------------------------------------------------------------------+
int ChartWidthInPixels(const long chart_ID=0)
  {
//--- preparare la variabile per ottenere il valore della proprietà
   long result=-1;
//--- ripristinare il valore dell'errore
   ResetLastError();
//--- ricevere il valore della proprietà
   if(!ChartGetInteger(chart_ID,CHART_WIDTH_IN_PIXELS,0,result))
     {
      //--- visualizzare il messaggio di errore nel Diario degli esperti
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- restituire il valore della proprietà del grafico
   return((int)result);
  }
//+------------------------------------------------------------------+
//| Altezza della proprietà del grafico|
//+------------------------------------------------------------------+
int ChartHeightInPixelsGet(const long chart_ID=0,const int sub_window=0)
  {
//--- preparare la variabile per ottenere il valore della proprietà
   long result=-1;
//--- ripristinare il valore dell'errore
   ResetLastError();
//--- ricevere il valore della proprietà
   if(!ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,result))
     {
      //--- visualizzare il messaggio di errore nel Diario degli esperti
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- restituire il valore della proprietà del grafico
   return((int)result);
  }
//+------------------------------------------------------------------+
File:
 

Vladimir, grazie mille!

Mi era sfuggita la conversione ColorToARGB().

 
Dennis Kirichenko:

Vladimir, grazie mille!

Mi era sfuggita la conversione ColorToARGB().

Non c'è di che :) .
 
Ciao, penso che questo articolo sia eccellente. Ho una domanda su come posso creare un rettangolo sullo schermo con coordinate x1, x2, y1, y2. dove:

x1 = Tempo[1]

x2 = Tempo[0]

y1 = Apertura[1]

y2 = Chiudi[1]
 
Jorge Fernando De Los Ríos De Los Ríos:
Ciao, penso che questo articolo sia eccellente. Ho una domanda su come posso creare un rettangolo sullo schermo con coordinate x1, x2, y1, y2. dove:

x1 = Tempo[1]

x2 = Tempo[0]

y1 = Apertura[1]

y2 = Chiudi[1]

Tramite la classe CCanvas?

P.S. Utilizzare CCanvas.CreateBitmap:

Crea una risorsa grafica legata a un oggetto grafico.

1. Crea una risorsa grafica nella finestra principale del grafico corrente.

bool CreateBitmap(
const string nome, // nome
const datetimetime, // time
const doubleprice, // prezzo
constintlarghezza, // larghezza
const int height, // altezza
ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA// formato
);

In questo modo sarà possibile vincolare un angolo di una tela. Ma la larghezza e l'altezza, tutte uguali, saranno impostate in pixel.

 

Facciamo un esercizio più semplice. Vado a mettere un cerchio che si muove con il prezzo; ma, perché non si muove sull'asse Y?

Questo è il codice

void OnStart()
  {
   int ChartWidth=ChartWidthInPixels();
   int ChartHeight=ChartHeightInPixelsGet();

   CCanvas pepe;

   int t1,t0,p1,p0;
   ChartTimePriceToXY(0,0,Time[1],Open[1],t1,p1);
   ChartTimePriceToXY(0,0,Time[0],Close[1],t0,p0);

   pepe.CreateBitmapLabel("canvas_XRGB_NOALPHA",0,0,ChartWidth,ChartHeight,COLOR_FORMAT_ARGB_RAW);
   pepe.Erase(0);
   pepe.FillCircle(t0,p0,25,ColorToARGB(clrBlue,255));
   pepe.Update();
   return(rates_total);
  } 
 
Jorge Fernando De Los Ríos De Los Ríos:

Facciamo un esercizio più semplice. Vado a mettere un cerchio che si muove con il prezzo; ma, perché non si muove sull'asse Y?

Questo è il codice

Questo script non è compilato. In lui un mucchio di errori.
 
Jorge Fernando De Los Ríos De Los Ríos:

Facciamo un esercizio più semplice. Vado a mettere un cerchio che si muove con il prezzo; ma, perché non si muove sull'asse Y?

Questo è il codice

"Time[]," "Close[]" - errore. Non esistono variabili di questo tipo in MQL5!
 
Karputov Vladimir:
"Tempo[]," "Chiusura[]" - errore. Non ci sono variabili di questo tipo in MQL5!
MQL4 ;)