El lienzo es genial. - página 73

 
Vitaliy Kuznetsov #:

¿Puede alguien por favor aconsejar si hay algún código listo para Editar cuadro a la lona.

Estoy haciendo un panel de goma y necesito un elemento de este tipo. Al hacer clic en él, es necesario introducir y eliminar números y ver un cursor parpadeante.

Si no, voy a hacer una sustitución normal al hacer clic en él.

Alguien lo hizo, y hubo problemas no con los gráficos, pero con la entrada - MetaTrader "arrastrado / procesado" los botones habituales (Enter / Tab) y KeyPress / Repeate / Release en general.

Es más fácil tomar una DLL e incrustar la ventana de control de Windows, o Notepad.exe.

Unos días de mate por la falta de información (las cosas de bajo nivel son difíciles de encontrar hoy en día, hay pocas), pero al final el código será dos órdenes de magnitud menor y funcionará mejor.

 
Vitaliy Kuznetsov #:

¿Puede alguien por favor aconsejar si hay algún código listo para Editar cuadro a la lona.

...

EasyAndFastGUI - librería para crear interfaces gráficas >>>

Ver archivo TextBox.mqh

EasyAndFastGUI - библиотека для создания графических интерфейсов
EasyAndFastGUI - библиотека для создания графических интерфейсов
  • www.mql5.com
Библиотека EasyAndFastGUI дает возможность создавать графические интерфейсы для своих MQL-программ.
 
Gracias a todos, voy a probar diferentes opciones
 
Maxim Kuznetsov #:

alguien lo hizo, hubo problemas no con los gráficos, pero con la entrada - MetaTrader "arrastrado / procesado" los botones habituales (Enter / Tab) y KeyPress / Repetir / Liberar en general.

Es más fácil tomar una DLL e incrustar la ventana de control de Windows, o Notepad.exe.

Unos días de mate por la falta de información (las cosas de bajo nivel son difíciles de encontrar hoy en día, hay pocas), pero al final el código será dos órdenes de magnitud menor y funcionará mejor.

por cierto sobre "zambed" y recordar diferentes experimentos: las ventanas se incrustan, pero hay problemas con el redibujado y la entrada. Simplemente no es utilizable, me detuve en "el hecho de que potencialmente funciona".

Pero no es sorprendente - EAs trabajan en una pista, GUI del gráfico en otro y también hay cosas diferentes allí aparentemente.
Es necesario explicar Windows de alguna manera para que todos los mensajes requeridos se envían y renderizado se procesa correctamente. No es un diseño típico de GUI cuando hay un control (en términos de win, es una ventana después de todo) que tiene todo en otra pista.

Por supuesto, estoy en un poco de un callejón sin salida aquí, la práctica de Linux no es favorable. es necesario establecer algunos (¿qué?) banderas para el proceso de Expertos (en términos de OS, no es una GUI-pista, como parece, y alguna parte de ella simplemente no volar a ella) y / o tirar AttachThreadInput.

Si se resuelve este problema, las perspectivas son brillantes para aquellos que no tienen miedo de DLLs:

- Será posible usar Gtk/Qt/Lazarus con sus diseñadores y gráficos realmente buenos, para "diálogos dentro del gráfico" (y toplevel se hacen, pero no siempre es conveniente, aún así el usuario trabaja con el gráfico)

- será posible hacer tus propias "pestañas" - dentro de MDI y de "dibujar una ventana en el gráfico" a "hacer una pestaña en MT" medio paso. Todo tipo de tablas/tablas no requerirán abrir un nuevo gráfico

Sí, a nivel de hack :-)

 
Vitaliy Kuznetsov #:

¿Puede alguien por favor aconsejar si hay algún código listo para Editar cuadro a la lona.

Estoy haciendo un panel de goma y necesito un elemento de este tipo. Al hacer clic en él, es necesario introducir y eliminar números y ver un cursor parpadeante.

Si no, voy a hacer una sustitución normal al hacer clic en él.

Ejemplo de código de tal 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 #:

Ejemplo de código de EditCtrl (base)

Gracias. Voy a probarlo en MT5 un poco más tarde.

 
Ilyas #:

Ejemplo de código de EditCtrl (base)

Gracias, Ilyas, por un buen ejemplo tutorial de código de calidad
 
Ilyas #:

Ejemplo de código de EditCtrl (base)

¿Hay alguna forma de desactivar el retroceso para que no se borre el objeto?

 
Aleksei Beliakov #:

¿Hay alguna forma de desactivar la función de retroceso para que no se borre el objeto?

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 #:
Aunque configure esta propiedad el objeto se borra por retroceso, ¿quizás es porque está seleccionado?
¿Hay alguna forma de colocar un objeto encima de otro si el tiempo de creación es menor?
Por ejemplo, si creo un objeto de etiqueta de mapa de bits y luego cualquier otro objeto, la etiqueta de mapa de bits queda debajo de los objetos creados después de ella.
Pregunta ¿hay alguna manera de poner la etiqueta bitmap encima de los objetos creados después de él excepto borrar y crear de nuevo?