La tela è forte! - pagina 27

 
Aлександр Антошкин:
L'aquila con due teste in diverse forme, colori e versioni è presente sul nostro stemma da oltre cinque secoli - dai tempi dello Stato di Mosca durante Ivan III fino al 1918, come conseguenza di una mutazione genetica.....
Cos'è che vuoi correggere in Pietro?

Non capisco la logica. Dove hai visto che voglio correggere qualcosa in qualcuno?

 
Nikolai Semko:

Non capisco la logica. Dove hai visto che volevo correggere qualcosa da qualcuno?

È un trolling così sottile. Alludendo al fatto che sono una conseguenza incorreggibile della mutazione genetica). Ho letto gli altri post dell'autore e ho pensato che lui stesso è un AI sperimentale sul nostro forum. ))

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

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

È così che si possono presentare le zecche?

 
fxsaber:

Voglio dire che i tick dovrebbero essere presentati come barre - 5 secondi ciascuno, diciamo.

 

Ciao!

È possibile usare Canvas per creare pannelli? (CAppDialog).

Direttamente, con Add(), un oggetto CCanvas ovviamente non può essere aggiunto ad un pannello.

Forse c'è un workaround, per esempio creare prima una risorsa e poi, trattandola come un oggetto più semplice, la si può legare a un CAppDialog?

Ma non sono nemmeno sicuro di quali funzioni usare per provare a fare un tale trucco.

Comunque, aiuto!

C'è così tanto materiale in questo thread, che il mio compito sembra abbastanza semplice su questo sfondo!

 
Evgeny Potapov:

Ciao!

È possibile usare Canvas per creare pannelli? (CAppDialog).

Direttamente, con Add(), un oggetto CCanvas ovviamente non può essere aggiunto ad un pannello.

Forse c'è un workaround, per esempio creare prima una risorsa e poi, trattandola come un oggetto più semplice, la si può legare a un CAppDialog?

Ma non sono nemmeno sicuro di quali funzioni usare per provare a fare un tale trucco.

Comunque, aiuto!

C'è così tanto materiale in questo argomento, che il mio compito sembra abbastanza semplice su questo sfondo!

Ho paura che non funzioni.
Perché CAppDialog è disegnato su oggetti OBJ_RECTANGLE, e CCanvas è un oggetto OBJ_BITMAP_LABEL e non c'è modo di attraversarli.
Ma è possibile disegnare una tela sopra la finestra del pannello e monitorare i cambiamenti nel pannello e ridisegnare la tela allo stesso tempo.

Come questo:

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



ma poiché un pannello è un insieme di oggetti, basta aggiungerne un altro a questo insieme.

Così, in questo modo funziona e il kanvas viene disegnato solo in un posto (in questo caso, la funzione DrawCanvas) nelle coordinate del pannello e non devo preoccuparmi di attaccarlo al pannello e ridisegnarlo.

 
   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ì, grazie, Alexey. Rallentato ))
Corretto.

 
Nikolai Semko:

Temo che questo non funzionerà.
Perché CAppDialog è disegnato usando oggetti OBJ_RECTANGLE e CCanvas è un oggetto OBJ_BITMAP_LABEL e non c'è modo di unirli.

Grazie! Questa variante sembra abbastanza realistica!

È possibile estendere CAppDialog e includervi OBJ_BITMAP_LABEL?

 
Evgeny Potapov:

Grazie! Questa variante sembra abbastanza realistica!

È possibile estendere CAppDialog e includervi OBJ_BITMAP_LABEL?

Naturalmente è possibile, se si ha il desiderio e il tempo.