Diskussion zum Artikel "Graphisches Interface X: Textauswahl im mehrzeiligen Textfeld (build 13)" - Seite 13

 
Anatoli Kazharski:

Es gibt noch weitere Methoden zum Binden von Elementen:

//---

In Kombination mit diesen Eigenschaften, versuchen, das Problem zu lösen.


Ja, ich habe es versucht, aber ich habe mir schon den Kopf zerbrochen, ich habe verstanden, dass die Methoden X(...) und Y(...) Elemente starr an X- und Y-Koordinaten binden und beim Empfang von Ereignissen zur Änderung der Größe des Hauptformularfensters in keiner Weise auf die Lage der X- und Y-Koordinaten reagieren.
 
Konstantin:

Ja, ich habe es versucht, aber ich habe mir schon den Kopf zerbrochen, ich habe verstanden, dass die Methoden X(...) und Y(...) Elemente starr an X- und Y-Koordinaten binden und beim Empfang von Ereignissen zur Änderung der Größe des Hauptformularfensters in keiner Weise auf die Position der X- und Y-Koordinaten reagieren.

Können Sie am Beispiel einer vorgefertigten Windows-Anwendung ein Analogon zu dem zeigen, was Sie brauchen? Ich bin nicht sicher, ob ich verstehe, was Sie brauchen. Oder stellen Sie es irgendwie grafisch dar.

Wenn ich es richtig verstanden habe, sollte element_2 an den unteren Rand des Formulars gebunden werden, und element_1 sollte automatisch vertikal mit einem Einzug auf die Höhe von element_2 skaliert werden.

 
Anatoli Kazharski:

Können Sie eine Analogie zu dem, was Sie brauchen, am Beispiel einer fertigen Windows-Anwendung zeigen? Ich bin nicht sicher, ob ich verstehe, was Sie brauchen. Oder stellen Sie es irgendwie grafisch dar.

Wenn ich es richtig verstanden habe, soll element_2 an den unteren Rand des Formulars gebunden werden, und element_1 soll automatisch vertikal mit einem Einzug auf die Höhe von element_2 skaliert werden.


Du hast es richtig verstanden, d.h. wenn sich die Fenstergröße ändert, ändert element_1 die Y-Größe, und element_2 muss dieser Verkleinerung folgen, d.h. normale Skalierung der Elemente innerhalb des Formulars. Bisher habe ich eine Krücke gebaut, dass element_1 nicht skaliert wird )). Ich werde mich später mit diesem Problem befassen.
 
der Bibliothek fehlt die Einstellung der Anzeigepriorität, da Icons aus offenen Aufträgen/Positionen eine höhere Priorität haben und dementsprechend über allen grafischen Elementen der Bibliothek platziert werden, ich denke, dass dies bei der Erstellung grafischer Objekte im "Kern" der Bibliothek realisiert werden kann.
 
Konstantin:
der Bibliothek fehlt es an Anzeigeprioritäten, da Icons aus offenen Aufträgen/Positionen eine höhere Priorität haben und dementsprechend über allen grafischen Elementen der Bibliothek platziert werden, ich denke, das kann durch das Erstellen von grafischen Objekten im "Kern" der Bibliothek realisiert werden.

Versuchen Sie es so:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Diskussion des Artikels "GUI X: Textauswahl in einem mehrzeiligen Eingabefeld (Build 13)".

Anatoli Kazharski, 2017.05.08 21:40

In der benutzerdefinierten Anwendungsklasse müssen Sie eine Methode CProgram::OnTradeEvent() erstellen.

Und in der Hauptdatei sollte sie in der Funktion OnTrade() aufgerufen werden:

//+------------------------------------------------------------------+
//| Funktion Handel|
//+------------------------------------------------------------------+
void OnTrade(void)
  {
   program.OnTradeEvent();
  }

//---

Ich habe zum Beispiel diesen Inhalt der Methode CProgram::OnTradeEvent():

//+------------------------------------------------------------------+
//| Ereignis der Handelstransaktion|
//+------------------------------------------------------------------+
void CProgram::OnTradeEvent(void)
  {
//--- Senden eines Handelsereignisses an alle Charts
   m_events.SendEventToAllCharts(0,ON_TRADE_EVENT,0,0.0,m_program_name);
//--- Festlegen der Transaktionen der letzten Position
   if(m_show_deals.CheckButtonState())
      if(m_vdeals.ShowDealsLastPosition())
         ResetWindow();
//--- Überprüfung der Stop-Loss-Distanz
   if(m_trailing_stop.CheckButtonState())
      m_ctrade.CheckStopLossSize(::Symbol());
//--- Nullstellung von Variablen für Handelsoperationen
   m_ctrade.ZeroCalcPositionVariables();
//--- Initialisierung des Balance-Arrays und Aktualisierung der Serien im Diagramm
   InitBalanceArray();
   m_line_chart.SeriesUpdate(0,m_balance_data,"Balance",clrCornflowerBlue);
  }

 
Anatoli Kazharski:

Versuchen Sie es auf diese Weise:


Ich habe dies gesehen, aber ich denke, Sie müssen die Verwendung im "Kern" der Bibliothek ergänzen, d.h. bei der Erstellung grafischer Objekte:

bool  ObjectSetInteger( 
   long                             chart_id,      // Kennung der Karte 
   string                           name,          // Name 
   ENUM_OBJECT_PROPERTY_INTEGER     prop_id,       // Eigentum 
   long                             prop_value     // Wert 
   );

property:

OBJPROP_BACK

 
Konstantin:

Ich habe das gesehen, aber ich denke, dass man im "Kern" der Bibliothek, d.h. bei der Erstellung von grafischen Objekten, die Verwendung ergänzen muss:

property:

OBJPROP_BACK

Dann wird die Grafik über den grafischen Objekten der Schnittstelle sein.

//---

Führen Sie ResetWindow() für den Moment aus. Ich werde versuchen, es später in den Kernel einzubauen, so dass es automatisch aktualisiert wird.

 
Anatoli Kazharski:

Dann werden die Graphen über den grafischen Objekten der Schnittstelle liegen.

//---

Führen Sie ResetWindow() für den Moment aus. Ich werde versuchen, es später in den Kernel einzubauen, so dass es automatisch aktualisiert wird.


nicht ganz so, man muss alle grafischen Objekte in den Vordergrund stellen, dann sind die Grafiken hinten, ich habe dies viele Male in meiner Grafikbibliothek implementiert ))
 
Konstantin:

nicht genau, Sie müssen alle grafischen Objekte in den Vordergrund, dann die Graphen werden hinter sein, ich habe dies viele Male auf meine grafische Bibliothek implementiert ))

Ich weiß nicht, was Sie gemacht haben und wie Sie es gemacht haben, aber standardmäßig sind sie im Vordergrund. Die zuletzt erstellten sind ganz oben. Die einzige Möglichkeit, die Priorität nach der Erstellung zu ändern, besteht darin, die Objekte aus- und wieder einzublenden, mit Ausnahme derjenigen, die ganz unten stehen sollten.

 

In der Methode der Klasse CTabs:

void CTabs::CalculatingPatch(int &x,int &y,int &x_size,int &y_size)
  {
   if(ArraySize(m_tabs) == 0)
      return;

   if(m_position_mode==TABS_TOP)
     {
      x      =m_tabs[m_selected_tab].X()+1;
      y      =m_tabs[m_selected_tab].Y2()-1;
      x_size =m_tabs[m_selected_tab].XSize()-2;
      y_size =1;
     }
   else if(m_position_mode==TABS_BOTTOM)
     {
      x      =m_tabs[m_selected_tab].X()+1;
      y      =m_tabs[m_selected_tab].Y();
      x_size =m_tabs[m_selected_tab].XSize()-2;
      y_size =1;
     }
   else if(m_position_mode==TABS_LEFT)
     {
      x      =m_tabs[m_selected_tab].X2()-1;
      y      =m_tabs[m_selected_tab].Y()+1;
      x_size =1;
      y_size =m_tabs[m_selected_tab].YSize()-2;
     }
   else if(m_position_mode==TABS_RIGHT)
     {
      x      =m_tabs[m_selected_tab].X();
      y      =m_tabs[m_selected_tab].Y()+1;
      x_size =1;
      y_size =m_tabs[m_selected_tab].YSize()-2;
     }
  }

sollte hervorgehoben hinzugefügt werden, es ist eine Prüfung auf Null-Array, weil ohne diese Prüfung im Falle der keine Tabs, das ganze Formular mit einem Fehler abstürzt.