La tela è forte! - pagina 73

 
Vitaliy Kuznetsov #:

Qualcuno può indicare se c'è un codice pronto per la casella di modifica su tela.

Sto realizzando un pannello di gomma e ho bisogno di un elemento di questo tipo. Quando si fa clic su di esso, è necessario inserire e cancellare numeri e vedere un cursore lampeggiante.

In caso contrario, farò una normale sostituzione quando si fa clic su di esso.

Qualcuno l'ha fatto, e ci sono stati problemi non con la grafica, ma con l'input - MetaTrader ha "trascinato/elaborato" i soliti pulsanti (Invio/Tab) e la pressione/ripetizione/rilascio dei tasti in generale.

È più facile prendere una DLL e incorporare la finestra di controllo di Windows o Notepad.exe.

Qualche giorno di mate per la mancanza di informazioni (le cose di basso livello sono difficili da trovare al giorno d'oggi, ce ne sono poche), ma alla fine il codice sarà di due ordini di grandezza inferiore e funzionerà meglio.

 
Vitaliy Kuznetsov #:

Qualcuno può indicare se c'è un codice pronto per la casella di modifica su tela.

...

EasyAndFastGUI - libreria per la creazione di interfacce grafiche >>>

Vedere il file TextBox.mqh

EasyAndFastGUI - библиотека для создания графических интерфейсов
EasyAndFastGUI - библиотека для создания графических интерфейсов
  • www.mql5.com
Библиотека EasyAndFastGUI дает возможность создавать графические интерфейсы для своих MQL-программ.
 
Grazie a tutti, proverò diverse opzioni
 
Maxim Kuznetsov #:

qualcuno lo ha fatto, ci sono stati problemi non con la grafica, ma con l'input - MetaTrader ha "trascinato/elaborato" i soliti pulsanti (Enter/Tab) e KeyPress/Repeate/Release in generale.

È più facile prendere una DLL e incorporare la finestra di controllo di Windows o Notepad.exe.

Qualche giorno di mate per la mancanza di informazioni (le cose di basso livello sono difficili da trovare al giorno d'oggi, ce ne sono poche), ma alla fine il codice sarà di due ordini di grandezza inferiore e funzionerà meglio.

A proposito di "zambed" e di ricordare diversi esperimenti: le finestre sono incorporate, ma ci sono problemi con il ridisegno e l'input. Non è utilizzabile, mi sono fermato al "fatto che potenzialmente funziona".

Ma non è sorprendente - gli EA lavorano in una traccia, la GUI del grafico in un'altra e ci sono anche cose diverse a quanto pare.
È necessario spiegare Windows in qualche modo, in modo che tutti i messaggi richiesti siano inviati e il rendering sia elaborato correttamente. Non è un tipico design della GUI quando c'è un controllo (in termini di win, è una finestra dopo tutto) che ha tutto in un'altra traccia.

Naturalmente, mi trovo in un vicolo cieco, la pratica di Linux non è favorevole. è necessario impostare alcuni (quali?) flag al processo Expert (in termini di sistema operativo, non è un binario della GUI, come sembra, e una parte di esso semplicemente non vola ad esso) e/o tirare AttachThreadInput.

Se questo problema viene risolto, le prospettive sono rosee per chi non ha paura delle DLL:

- sarà possibile usare Gtk/Qt/Lazarus con i loro designer e la loro grafica davvero buona, per "dialoghi all'interno del grafico" (e i livelli superiori sono fatti, ma non è sempre comodo, l'utente lavora comunque con il grafico)

- sarà possibile creare le proprie "schede" - all'interno di MDI e da "disegna una finestra nel grafico" a "crea una scheda in MT" sarà un mezzo passo avanti. Tutti i tipi di schede non richiederanno l'apertura di un nuovo grafico.

Sì, a livello di hack :-)

 
Vitaliy Kuznetsov #:

Qualcuno può indicare se c'è un codice pronto per la casella di modifica su tela.

Sto realizzando un pannello di gomma e ho bisogno di un elemento di questo tipo. Quando si fa clic su di esso, è necessario inserire e cancellare numeri e vedere un cursore lampeggiante.

In caso contrario, farò una normale sostituzione quando si fa clic su di esso.

Esempio di codice di tale 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 #:

Codice di esempio di tale EditCtrl (base)

Grazie. Lo proverò su MT5 un po' più tardi.

 
Ilyas #:

Codice di esempio di tale EditCtrl (base)

Grazie, Ilyas, per un buon esempio di codice di qualità.
 
Ilyas #:

Codice di esempio di tale EditCtrl (base)

C'è un modo per disabilitare il backspace in modo che l'oggetto non venga cancellato?

 
Aleksei Beliakov #:

C'è un modo per disabilitare il backspace in modo che l'oggetto non venga cancellato?

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 #:
Anche se imposto questa proprietà l'oggetto viene cancellato con il backspace, forse perché è selezionato?
C'è un modo per posizionare un oggetto sopra un altro oggetto se il tempo di creazione è più breve?
Ad esempio, se creo un oggetto etichetta bitmap e poi qualsiasi altro oggetto, l'etichetta bitmap si trova sotto gli oggetti creati dopo di essa.
Domanda: c'è un modo per mettere l'etichetta bitmap sopra gli oggetti creati dopo di essa, a parte cancellare e creare di nuovo?
Motivazione: