La toile est cool ! - page 27

 
Aлександр Антошкин:
L'aigle à deux têtes, sous différentes formes, couleurs et versions, figure sur nos armoiries depuis plus de cinq siècles - depuis l'époque de l'État de Moscou sous Ivan III jusqu'en 1918, suite à une mutation génétique......
Qu'est-ce que vous voulez corriger chez Pierre ?

Je ne comprends pas la logique. Où avez-vous vu que je veux corriger quelque chose chez quelqu'un ?

 
Nikolai Semko:

Je ne comprends pas la logique. Où avez-vous vu que je voulais corriger quelque chose de quelqu'un ?

C'est un troll si subtil. laissant entendre que je suis une conséquence incorrigible de la mutation génétique). J'ai lu les autres messages de l'auteur et j'ai pensé qu'il était lui-même une IA expérimentale sur notre forum. ))

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

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

Est-ce ainsi que les tiques peuvent être présentées ?

 
fxsaber:

Je veux dire que les ticks devraient être présentés sous forme de barres - 5 secondes chacune, disons.

 

Bonjour !

Est-il possible d'utiliser Canvas pour créer des panneaux ? (CAppDialog).

Directement, avec Add(), un objet CCanvas ne peut évidemment pas être ajouté à un panneau.

Il existe peut-être une solution de rechange, par exemple créer d'abord une ressource et ensuite, en la traitant comme un objet plus simple, la lier à un CAppDialog ?

Mais je ne suis même pas sûr des fonctions à utiliser pour essayer de réaliser un tel tour.

Bref, à l'aide !

Il y a tellement de choses intéressantes dans ce fil de discussion que ma tâche semble très simple dans ce contexte !

 
Evgeny Potapov:

Bonjour !

Est-il possible d'utiliser Canvas pour créer des panneaux ? (CAppDialog).

Directement, avec Add(), un objet CCanvas ne peut évidemment pas être ajouté à un panneau.

Il existe peut-être une solution de rechange, par exemple créer d'abord une ressource et ensuite, en la traitant comme un objet plus simple, la lier à un CAppDialog ?

Mais je ne suis même pas sûr des fonctions à utiliser pour essayer de réaliser un tel tour.

Bref, à l'aide !

Il y a tellement de choses intéressantes dans ce domaine que ma tâche semble très simple dans ce contexte !

J'ai peur que ça ne marche pas.
Parce que CAppDialog est dessiné sur des objets OBJ_RECTANGLE, et CCanvas est un objet OBJ_BITMAP_LABEL et il n'y a aucun moyen de les croiser.
Mais il est possible de dessiner un canevas au-dessus de la fenêtre du panneau, de surveiller les changements dans le panneau et de redessiner le canevas en même temps.

Comme ça :

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



mais comme un panneau est un ensemble d'objets, il suffit d'en ajouter un autre à cet ensemble.

Ainsi, de cette façon, cela fonctionne et kanvas est dessiné à un seul endroit (dans ce cas, la fonction DrawCanvas) dans les coordonnées du panneau et je n'ai pas besoin de me soucier de l'attacher au panneau et de le redessiner.

 
   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:

Oui, merci, Alexey. Ralentie ))
Corrigé.

 
Nikolai Semko:

J'ai peur que cela ne fonctionne pas.
Parce que CAppDialog est dessiné à l'aide d'objets OBJ_RECTANGLE et CCanvas est un objet OBJ_BITMAP_LABEL et qu'il n'y a aucun moyen de les fusionner.

Merci ! Cette variante semble très réaliste !

Est-il possible d'étendre le CAppDialog et d'y inclure OBJ_BITMAP_LABEL?

 
Evgeny Potapov:

Merci ! Cette variante semble très réaliste !

Est-il possible d'étendre le CAppDialog et d'y inclure OBJ_BITMAP_LABEL?

Bien sûr, c'est possible, si vous en avez le désir et le temps.