Leinwand ist cool! - Seite 73

 
Vitaliy Kuznetsov #:

Kann jemand bitte beraten, wenn es eine fertige Code für Edit Box zu Leinwand.

Ich bin ein Gummi-Panel zu machen und brauchen ein solches Element. Wenn Sie darauf klicken, müssen Sie eingeben und löschen Zahlen und sehen einen blinkenden Cursor.

Wenn nicht, werde ich eine normale Ersetzung machen, wenn Sie darauf klicken.

Jemand hat es getan, und es gab Probleme nicht mit der Grafik, sondern mit der Eingabe - MetaTrader "zog/verarbeitete" die üblichen Schaltflächen (Enter/Tab) und KeyPress/Repeate/Release im Allgemeinen.

Es ist einfacher, eine DLL zu nehmen und das Windows Control Fenster oder Notepad.exe einzubetten.

Ein paar Tage der Mate über den Mangel an Informationen (Low-Level-Dinge sind schwer zu finden heutzutage, es gibt nur wenige von ihnen), aber am Ende der Code wird zwei Größenordnungen weniger und wird besser funktionieren.

 
Vitaliy Kuznetsov #:

Kann jemand bitte beraten, wenn es eine fertige Code für Edit Box zu Leinwand.

...

EasyAndFastGUI - Bibliothek für die Erstellung von grafischen Oberflächen >>>

Siehe Datei TextBox.mqh

EasyAndFastGUI - библиотека для создания графических интерфейсов
EasyAndFastGUI - библиотека для создания графических интерфейсов
  • www.mql5.com
Библиотека EasyAndFastGUI дает возможность создавать графические интерфейсы для своих MQL-программ.
 
Danke an alle, ich werde verschiedene Optionen ausprobieren.
 
Maxim Kuznetsov #:

jemand tat, gab es Probleme nicht mit Grafiken, sondern mit der Eingabe - MetaTrader "zog/verarbeitete" die üblichen Tasten (Enter/Tab) und KeyPress/Repeate/Release im Allgemeinen.

Es ist einfacher, eine DLL zu nehmen und das Windows Control-Fenster, oder Notepad.exe einzubetten.

Ein paar Tage der Mate über den Mangel an Informationen (Low-Level-Dinge sind schwer zu finden heutzutage, es gibt nur wenige von ihnen), aber am Ende der Code wird zwei Größenordnungen weniger und wird besser funktionieren.

Übrigens zu "zambed" und der Erinnerung an verschiedene Experimente: Fenster sind eingebettet, aber es gibt Probleme mit dem Redrawing und der Eingabe. Es ist einfach nicht brauchbar, ich habe bei der "Tatsache, dass es potentiell funktioniert" aufgehört.

Aber das ist nicht verwunderlich - EAs arbeiten in einer Schiene, die GUI des Charts in einer anderen, und auch da gibt es anscheinend unterschiedliche Dinge .
Man muss Windows irgendwie erklären, damit alle erforderlichen Nachrichten gesendet werden und das Rendering korrekt verarbeitet wird. Nicht gerade ein typisches GUI-Design, wenn es ein Steuerelement gibt (im Sinne von win, es ist schließlich ein Fenster), das alles in einer anderen Spur hat.

Natürlich bin ich hier ein wenig in einer Sackgasse, die Linux-Praxis ist nicht günstig. es ist notwendig, einige (was?) Flags an den Expert-Prozess zu setzen (in OS-Begriffen, es ist kein GUI-Tread, wie es scheint, und ein Teil davon fliegt einfach nicht zu ihm) und/oder AttachThreadInput zu ziehen.

Wenn ein solches Problem gelöst ist, sind die Aussichten für diejenigen, die keine Angst vor DLLs haben, rosig:

- Es wird möglich sein, Gtk/Qt/Lazarus mit ihren Designern und wirklich guten Grafiken für "Dialoge innerhalb des Diagramms" zu verwenden (und Toplevel werden gemacht, aber es ist nicht immer bequem, trotzdem arbeitet der Benutzer mit dem Diagramm)

- es wird möglich sein, eigene "Tabs" zu erstellen - innerhalb von MDI und von "zeichne ein Fenster im Diagramm" zu "mache einen Tab in MT" ist es nur ein halber Schritt. Für alle Arten von Boards/Boards wird es nicht erforderlich sein, ein neues Chart zu öffnen.

Ja, auf der Hack-Ebene :-)

 
Vitaliy Kuznetsov #:

Kann jemand bitte beraten, wenn es eine fertige Code für Edit Box zu Leinwand.

Ich bin ein Gummi-Panel zu machen und brauchen ein solches Element. Wenn Sie darauf klicken, müssen Sie eingeben und löschen Zahlen und sehen einen blinkenden Cursor.

Wenn nicht, werde ich eine normale Ersetzung machen, wenn Sie darauf klicken.

Beispielcode für ein solches 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 #:

Beispielcode für ein solches EditCtrl (base)

Ich danke Ihnen. Ich werde es auf MT5 ein wenig später versuchen.

 
Ilyas #:

Beispielcode für ein solches EditCtrl (base)

Vielen Dank, Ilyas, für ein gutes Tutorial Beispiel für Qualitätscode
 
Ilyas #:

Beispielcode für ein solches EditCtrl (base)

Gibt es eine Möglichkeit, die Rücktaste zu deaktivieren, damit das Objekt nicht gelöscht wird?

 
Aleksei Beliakov #:

Gibt es eine Möglichkeit, die Rücktaste zu deaktivieren, damit das Objekt nicht gelöscht wird?

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 #:
Auch wenn ich diese Eigenschaft einstelle, wird das Objekt mit der Rücktaste gelöscht, vielleicht weil es ausgewählt ist?
Gibt es eine Möglichkeit, ein Objekt über einem anderen Objekt zu platzieren, wenn die Erstellungszeit kürzer ist?
Wenn ich z.B. ein Bitmap-Label-Objekt erstelle und dann ein anderes Objekt, liegt Bitmaplabel unter den Objekten, die danach erstellt werden.
Gibt es eine Möglichkeit, ein Bitmap-Etikett über ein danach erstelltes Objekt zu legen, außer es zu löschen und neu zu erstellen?