La toile est cool ! - page 73

 
Vitaliy Kuznetsov #:

Quelqu'un peut-il me dire s'il existe un code prêt à l'emploi pour l'insertion d'une boîte d'édition dans un canevas ?

Je suis en train de créer un panneau en caoutchouc et j'ai besoin d'un tel élément. Lorsque vous cliquez dessus, vous devez entrer et supprimer des nombres et voir un curseur clignotant.

Si ce n'est pas le cas, je ferai une substitution normale lorsque l'on clique dessus.

Quelqu'un l'a fait, et il y a eu des problèmes non pas avec les graphiques, mais avec la saisie - MetaTrader a "traîné/traité" les boutons habituels (Entrée/Tab) et la pression/répétition/relâchement des touches en général.

Il est plus facile de prendre une DLL et d'y intégrer la fenêtre de contrôle de Windows, ou Notepad.exe.

Quelques jours de mate sur le manque d'information (les choses de bas niveau sont difficiles à trouver de nos jours, il y en a peu), mais au final le code sera deux ordres de grandeur en moins et fonctionnera mieux.

 
Vitaliy Kuznetsov #:

Quelqu'un peut-il me dire s'il existe un code prêt à l'emploi pour l'insertion d'une boîte d'édition dans un canevas ?

...

EasyAndFastGUI - bibliothèque pour la création d'interfaces graphiques >>>

Voir le fichier TextBox.mqh

EasyAndFastGUI - библиотека для создания графических интерфейсов
EasyAndFastGUI - библиотека для создания графических интерфейсов
  • www.mql5.com
Библиотека EasyAndFastGUI дает возможность создавать графические интерфейсы для своих MQL-программ.
 
Merci à tous, je vais essayer différentes options.
 
Maxim Kuznetsov #:

Si quelqu'un l'a fait, il y a eu des problèmes non pas avec les graphiques, mais avec la saisie - MetaTrader a "traîné/traité" les boutons habituels (Entrée/Tab) et la pression/répétition/relâchement des touches en général.

Il est plus facile de prendre une DLL et d'y intégrer la fenêtre de contrôle de Windows, ou Notepad.exe.

Quelques jours de mate sur le manque d'information (les choses de bas niveau sont difficiles à trouver de nos jours, il y en a peu), mais au final le code sera deux ordres de grandeur en moins et fonctionnera mieux.

A propos de "zambed" et de la mémoire des différentes expériences : les fenêtres sont intégrées, mais il y a des problèmes de redécoupage et de saisie. Ce n'est tout simplement pas utilisable, je me suis arrêté au "fait que cela fonctionne potentiellement"

Mais ce n'est pas surprenant - les EA fonctionnent dans une voie, l'interface graphique dans une autre et il y a aussi des choses différentes ici apparemment.
Il est nécessaire d'expliquer Windows d'une manière ou d'une autre afin que tous les messages nécessaires soient envoyés et que le rendu soit traité correctement. Ce n'est pas tout à fait une conception typique d'interface graphique quand il y a un contrôle (en termes de win, c'est une fenêtre après tout) qui a tout dans une autre piste.

Bien sûr, je suis dans une impasse ici, la pratique Linux n'est pas favorable. Il est nécessaire de mettre certains (quoi ?) drapeaux au processus Expert (en termes de système d'exploitation, ce n'est pas un GUI-tread, comme il semble, et une partie de celui-ci ne vole tout simplement pas vers lui) et / ou de tirer AttachThreadInput.

Si ce problème est résolu, les perspectives sont bonnes pour ceux qui n'ont pas peur des DLL :

- il sera possible d'utiliser Gtk/Qt/Lazarus avec leurs concepteurs et leurs très bons graphiques, pour des "dialogues à l'intérieur du graphique" (et les dialogues à deux niveaux sont réalisés, mais ce n'est pas toujours pratique, car l'utilisateur travaille toujours avec le graphique)

- il sera possible de créer ses propres "onglets" - à l'intérieur de la MDI et de passer de "dessiner une fenêtre dans le graphique" à "créer un onglet dans MT" en une demi-étape. Toutes sortes de tableaux ne nécessiteront pas l'ouverture d'un nouveau graphique.

Oui, au niveau du hack :-)

 
Vitaliy Kuznetsov #:

Quelqu'un peut-il me dire s'il existe un code prêt à l'emploi pour l'insertion d'une boîte d'édition dans un canevas ?

Je suis en train de créer un panneau en caoutchouc et j'ai besoin d'un tel élément. Lorsque vous cliquez dessus, vous devez entrer et supprimer des nombres et voir un curseur clignotant.

Si ce n'est pas le cas, je ferai une substitution normale lorsque l'on clique dessus.

Exemple de code d'un tel EditCtrl (base)

//+------------------------------------------------------------------+
//|                                                     EditCtrl.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Canvas/Canvas.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CControl : protected CCanvas
  {
public:

   bool              Create(int x,int y,int w,int h)
     {
      if(!CCanvas::CreateBitmapLabel("TEST_EDIT",x,y,w,h,COLOR_FORMAT_ARGB_NORMALIZE))
         return(false);
      if(!OnCreate())
         return(false);

      Update();
      return(true);
     }

   void              TimerSet(uint msec)
     {
      if(msec)
         EventSetMillisecondTimer(msec);
      else
         EventKillTimer();
     }

   void              Update(void)
     {
      OnDraw(this);
      CCanvas::Update();
     }

   virtual bool      OnCreate(void) { return(true); }
   virtual void      OnKeyDown(int key,uint flags) { }
   virtual void      OnTimer(void) { }
   virtual void      OnDraw(CCanvas &canvas) { }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CEditCtrl : public CControl
  {
protected:
   string            m_text;
   uint              m_cursor_pos;
   bool              m_cursor_visible;

public:
   virtual bool      OnCreate(void)
     {
      m_cursor_pos    =0;
      m_cursor_visible=true;
      m_text          ="";
      TimerSet(500);
      return(true);
     }

   virtual void      OnKeyDown(int key,uint flags)
     {
      short code;

      switch(key)
        {
         case 35: // END
            if(m_cursor_pos==m_text.Length())
               return;
            m_cursor_pos=m_text.Length();
            break;
         case 36: // HOME
            if(m_cursor_pos==0)
               return;
            m_cursor_pos=0;
            break;
         case 37: // LEFT
            if(m_cursor_pos==0)
               return;
            m_cursor_pos--;
            break;
         case 39: // RIGHT
            if(m_cursor_pos>=m_text.Length())
               return;
            m_cursor_pos++;
            break;
         default:
            if((code=TranslateKey(key))==-1)
               return;

            if(code<32)
              {
               if(code==8 && m_cursor_pos)
                 {
                  m_text=m_text.Substr(0,m_cursor_pos-1) + m_text.Substr(m_cursor_pos,-1);

                  if(--m_cursor_pos>m_text.Length())
                     m_cursor_pos=m_text.Length();
                     
                  break;
                 }

               return;
              }

            if(m_cursor_pos!=m_text.Length())
               m_text = m_text.Substr(0,m_cursor_pos) + "\xFFFF" + m_text.Substr(m_cursor_pos,m_text.Length());

            m_text.SetChar(m_cursor_pos,code);
            m_cursor_pos++;
            break;
        }

      Update();
     }

   virtual void      OnTimer(void)
     {
      m_cursor_visible=!m_cursor_visible;
      Update();
     }

   virtual void      OnDraw(CCanvas &canvas)
     {
      CCanvas::Erase(ARGB(255,255,255,255));

      if(m_text.Length())
         canvas.TextOut(0,0,m_text,ARGB(255,0,0,0));

      if(m_cursor_visible)
        {
         int x=0,y;

         if(m_cursor_pos)
            canvas.TextSize(m_text.Substr(0,m_cursor_pos),x,y);

         canvas.FillRectangle(x,0,x,canvas.Height(),ARGB(255,0,0,0));
        }
     }
  };

CEditCtrl ExtEditCtrl;
CControl *ExtInputFocus=&ExtEditCtrl;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   ExtEditCtrl.Create(100,100,200,20);

   ChartSetInteger(0,CHART_QUICK_NAVIGATION,false);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer(void)
  {
   ExtInputFocus.OnTimer();
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_KEYDOWN)
      ExtInputFocus.OnKeyDown((int)lparam,(uint)sparam);
  }
//+------------------------------------------------------------------+
 
Ilyas #:

Exemple de code d'un tel EditCtrl (base)

Je vous remercie. Je l'essaierai sur MT5 un peu plus tard.

 
Ilyas #:

Exemple de code d'un tel EditCtrl (base)

Merci, Ilyas, pour cet exemple de code de qualité.
 
Ilyas #:

Exemple de code d'un tel EditCtrl (base)

Existe-t-il un moyen de désactiver le retour arrière afin que l'objet ne soit pas supprimé ?

 
Aleksei Beliakov #:

Existe-t-il un moyen de désactiver le retour arrière afin que l'objet ne soit pas supprimé ?

int OnInit()
  {
   ChartSetInteger(0,CHART_EVENT_OBJECT_CREATE,true);   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_OBJECT_CREATE)
     {
      ObjectSetInteger(0,sparam,OBJPROP_HIDDEN,true);
      ChartRedraw();
      Print(sparam);
     }
  }
 
Ilyas #:
Même si je définis cette propriété, l'objet est supprimé par un effacement arrière, peut-être est-ce parce qu'il est sélectionné ?
Y a-t-il un moyen de placer un objet au-dessus d'un autre si le temps de création est plus court ?
Par exemple, je crée un objet bitmap label puis n'importe quel autre objet, bitmaplabel se trouve sous les objets qui sont créés après lui.
La question est de savoir s'il existe un moyen de placer l'étiquette bitmap au-dessus des objets créés après elle, à moins de la supprimer et de la créer à nouveau.