Diskussion zum Artikel "Wie schnell ein Bedienfeld zu einem Indikator und Expert Advisor hinzugefügt werden kann" - Seite 2

 
Maxim Dmitrievsky:

Nun, das habe ich getan, nichts funktioniert. Das Panel ist immer noch weiß wie vorher.

Der Compiler sagt Macro redifinition, d.h. wie overdivided....

Befolge meinen ersten Rat, ersetze einfach die Farben in der Originaldatei und kompiliere den EA neu.

Um mich daran zu erinnern, wie ich die Farben in meinem Panel neu definiert habe, muss ich ein wenig kramen, aber ich habe im Moment keine Zeit.

 

Für Geschichte:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Warum bewegt sich das Panel weg, wenn ich die Einstellungen des Expert Advisors aktualisiere?

Andrey Khatimlianskii, 2016.03.10 13:17

Ungefähr so:

// BEVOR Sie Dialog.mqh verbinden!
#include <Controls\Defines.mqh>

//--- Vergessen Sie die alten Farben
#undef   CONTROLS_DIALOG_COLOR_BORDER_LIGHT
#undef   CONTROLS_DIALOG_COLOR_BORDER_DARK
#undef   CONTROLS_DIALOG_COLOR_BG
#undef   CONTROLS_DIALOG_COLOR_CAPTION_TEXT
#undef   CONTROLS_DIALOG_COLOR_CLIENT_BG
#undef   CONTROLS_DIALOG_COLOR_CLIENT_BORDER

//--- Neue Farben einstellen
#define  CONTROLS_DIALOG_COLOR_BORDER_LIGHT  clrWhite            // Farbe des Dialograhmens (außen)
#define  CONTROLS_DIALOG_COLOR_BORDER_DARK   C'0xB6,0xB6,0xB6'   // Farbe des Dialograhmens (innen)
#define  CONTROLS_DIALOG_COLOR_BG            clrLightGreen       // Dialoghintergrund (unter der Beschriftung und um den Kundenbereich herum)
#define  CONTROLS_DIALOG_COLOR_CAPTION_TEXT  C'0x28,0x29,0x3B'   // Textfarbe der Dialogüberschrift
#define  CONTROLS_DIALOG_COLOR_CLIENT_BG     clrAliceBlue        // Hintergrundfarbe des Kundenbereichs
#define  CONTROLS_DIALOG_COLOR_CLIENT_BORDER C'0xC8,0xC8,0xC8'   // Farbe des Kundenbereichs

// Jetzt verbinden
#include <Controls\Dialog.mqh>

 

Können Sie mir ein einfaches Beispiel geben, wie CWndContainer verdreht werden sollte, um zumindest ein Quadrat auf dem Chat-Bildschirm mit .Show() anzuzeigen?

Ich habe alles versucht, zum Beispiel so, aber kein Fehler, kein Bild, kein Zeichen von .Show() funktioniert

#include <Controls\WndContainer.mqh>

class MyWndContainer : public CWndContainer  {
   public:
      MyWndContainer(string name);
};

//+------------------------------------------------------------------+
//| Konstruktor|
//+------------------------------------------------------------------+
MyWndContainer::MyWndContainer(string name) {
   m_chart_id = ChartID();
   m_subwin = 0;
   m_name = name;
                   m_id = 0;
                   m_align_top = 5;
                   m_align_right = 5;
                   m_align_left = 5;
                   m_align_bottom = 5;
                   m_mouse_x = 100;
                   m_mouse_y = 100;
                   m_align_flags = ALIGN_CENTER;
                   m_prop_flags = PROGRAM_EXPERT;
                   m_mouse_flags = MOUSE_EMPTY;
} 
 
Evgeny Potapov:

Können Sie mir ein einfaches Beispiel dafür geben, wie CWndContainer verdreht werden sollte, um zumindest ein Quadrat auf dem Chat-Bildschirm mit .Show() anzuzeigen?

Ich habe alles versucht, zum Beispiel so, aber kein Fehler, kein Bild, kein Zeichen von .Show() funktioniert.

Warum CWndContainer? Was sollte man am Ende erhalten?
 

Ich verstehe die Logik hier nicht:

//+------------------------------------------------------------------+
//| Macht die Gruppe der Steuerelemente sichtbar |
//+------------------------------------------------------------------+
bool CWndContainer::Show(void)
  {
//--- Schleife nach Elementen der Gruppe
   int total=m_controls.Total();
   for(int i=0;i<total;i++)
     {
      CWnd *control=Control(i);
      //--- Überprüfung des Zeigers
      if(control==NULL)
         continue;
      control.Show();
     }
//--- Aufruf der Methode der übergeordneten Klasse
   return(CWnd::Show());
  }

Was ist, wenn ich ein Button-Objekt habe und es keine .Show()-Methode hat.

Kann es nicht in einem Container enthalten sein?

 
Karputov Vladimir:
Warum CWndContainer? Was sollten wir am Ende bekommen?
Ein Panel mit den Schaltflächen Kaufen - Verkaufen und einigen weiteren Benachrichtigungen über den Zustand des Expert Advisors. Aber es sollte auf dem Bildschirm mit der Maus gezogen werden, aber die Schaltfläche ist nicht gezogen.
 
Evgeny Potapov:
Ein Panel mit den Schaltflächen Kaufen - Verkaufen und einigen weiteren Benachrichtigungen über den Status des Expert Advisors. Aber es sollte mit der Maus auf den Bildschirm gezogen werden, aber die Schaltfläche wird nicht gezogen.
Nach der Erstellung eines Objekts (Schaltfläche, Liste, Textfeld usw.) sollte dieses Objekt zum Panel hinzugefügt werden (Methode Add). Wenn Sie dann das Panel ziehen, werden alle Objekte zusammen mit dem Panel verschoben.
 
Karputov Vladimir:
Nach der Erstellung eines Objekts (Schaltfläche, Liste, Textfeld usw.) sollte dieses Objekt dem Panel hinzugefügt werden (Methode Add). Wenn Sie dann das Panel verschieben, werden alle Objekte zusammen mit dem Panel verschoben.

Wie das geht?

#include <Controls\Button.mqh>
#include <MyControls\MyWndContainer.mqh>

CButton *MyButton;
CWndContainer  *MyContainer;
//+------------------------------------------------------------------+
//| Experteninitialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit()  {
   MyButton = new CButton;
   if(CheckPointer(MyButton) == POINTER_INVALID) return(INIT_FAILED);
   MyButton.Create(ChartID(),WindowExpertName()+"_button",0,50,100,150,250);

   MyContainer = new MyWndContainer("MyContainer");
   if(CheckPointer(MyContainer) == POINTER_INVALID) return(INIT_FAILED);
   MyContainer.Add(MyButton);
   MyContainer.Show();
   MyContainer.Enable();

   
   return(INIT_SUCCEEDED);
}
 
Karputov Vladimir:
Nach dem Erstellen eines Objekts (Schaltfläche, Liste, Textfeld usw.) sollte dieses Objekt dem Panel hinzugefügt werden (Methode Add). Wenn Sie dann das Bedienfeld verschieben, werden alle Objekte zusammen mit dem Bedienfeld verschoben.

Oder ist das kein "Hinzufügen zum Panel"?

Ein Container ist also kein Panel?

 
Evgeny Potapov:

Oder ist es kein "Hinzufügen zu einem Panel"?

Ein Container ist also kein Panel?

Nehmen wir die Datei PanelDialog2.mqh aus dem Artikel als Beispiel:

//+------------------------------------------------------------------+
//|PanelDialog2.mqh |
//| Copyright 2015, MetaQuotes Software Corp. | |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\CheckGroup.mqh>
#include <Controls\Label.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Button.mqh>
//+------------------------------------------------------------------+
//| definiert|
//+------------------------------------------------------------------+
//--- Einzüge und Lücken
#define  INDENT_LEFT                         (11)      // Einzug von links (unter Berücksichtigung der Randbreite)
#define  INDENT_TOP                          (11)      // Einzug von oben (unter Berücksichtigung der Randbreite)
#define  INDENT_RIGHT                        (11)      // Einzug von rechts (unter Berücksichtigung der Randbreite)
#define  INDENT_BOTTOM     

Diese Datei erstellt die Elemente für ein Dialogfeld. Das Zeichen des Panels ist die Klasse CDialog.

CDialog-Klasse

Die CDialog-Klasse ist eine Klasse des Dialog-Kombinationssteuerelements.

Beschreibung

Die Klasse CDialog dient dazu, eine Gruppe von funktional zusammenhängenden, heterogenen Elementen visuell zu kombinieren.