Diskussion zum Artikel "Panels verbessern: Transparenz hinzufügen, Hintergrundfarbe ändern und von CAppDialog/CWndClient übernehmen"

 

Neuer Artikel Panels verbessern: Transparenz hinzufügen, Hintergrundfarbe ändern und von CAppDialog/CWndClient übernehmen :

In diesem Artikel beschäftigen wir uns weiter mit dem Einsatz von CAppDialog. Hier lernen wir, wie man die Farbe für den Hintergrund, die Ränder und die Überschrift der Dialogbox einstellt. Außerdem wird in diesem Artikel Schritt für Schritt beschrieben, wie ein Anwendungsfenster beim Ziehen innerhalb des Diagramms transparent gemacht werden kann. Wir werden überlegen, wie man Unterklassen von CAppDialog oder CWndClient erstellt und neue Besonderheiten bei der Arbeit mit Steuerelementen analysiert. Schließlich werden wir neue Projekte aus einer neuen Perspektive betrachten.

Jetzt ist das Ändern des Dialogfelds des Panels und der Farbe der Taste während des Ziehens des Panels vollständig in der Datei "Live panel and transparent Button.mq5" umgesetzt.

Das panel mit transparenten Tasten

Autor: Vladimir Karputov

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Diskussion des Artikels "Wie man ein grafisches Panel beliebiger Komplexität erstellt und wie es funktioniert"

Rashid Umarov, 2018.04.23 10:30 AM

Ein Doppelklick sind zwei Klicks mit einem sehr kleinen Zeitintervall zwischen ihnen. Es kann also auf die gleiche Weise wie ein normaler Klick behandelt werden - Sie müssen nur eine statische Variable zu OnChartEvent hinzufügen. Schauen Sie sich das Beispiel in https://www.mql5.com/de/docs/constants/chartconstants/enum_chartevents an und machen Sie etwas wie folgt:

....

Lassen Sie uns anhand eines Beispiels zeigen, wie man die Behandlung von Doppelklicks in das Panel einfügt. Nehmen wir Änderungen an der Klasse CMyWndClient vor



1. Überschreiben Sie die virtuelle Methode OnDblClick, die aus dem CWnd-Vorläufer stammt.

class CMyWndClient : public CWndClient
  {
private:
   CButton           m_button1;                       // das Button-Objekt
   CButton           m_button2;                       // das Button-Objekt
   //--- Bildlaufgröße
   int               m_scroll_size;                   // scroll_size
   //--- den Besitzer speichern
   CAppDialog        m_owner;                         // Eigentümer
   //--- das Unsichtbare ausblenden
   bool              m_hide_invisble;
   //---
   bool              AddButton1(void);
   bool              AddButton2(void);
protected:
   //--- Handler für die Ereignisse der abhängigen Steuerelemente
   void              OnClickButton1(void);
   void              OnClickButton2(void);
   void              OnShowScrollH(void);
   virtual bool      OnScrollLineRight(void);
   virtual bool      OnScrollLineLeft(void);
   virtual bool      OnDblClick(void);
.....
//+------------------------------------------------------------------+
//|| Überschreiben Sie die OnDblClick-Ereignisbehandlung |
//+------------------------------------------------------------------+
bool CMyWndClient::OnDblClick(void)
  {
   Print(__FUNCTION__);
   return ColorBackground(GetRandomColor());
  }

2. Fügen Sie die Verarbeitung dieses Ereignisses hinzu

//+------------------------------------------------------------------+
//| Ereignisbehandlung|
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CMyWndClient)
ON_EVENT(ON_CLICK,m_button1,OnClickButton1)
ON_EVENT(ON_CLICK,m_button2,OnClickButton2)
ON_EVENT(ON_DBL_CLICK,this,OnDblClick)
ON_EVENT(ON_SHOW,m_scroll_h,OnShowScrollH)
EVENT_MAP_END(CWndClient)

3. Fügen Sie in der Anwendungsdatei MyWndClient.mq5 Zeilen zum Abfangen des DoubleClick-Ereignisses hinzu

//+------------------------------------------------------------------+
//| Expertentabelle Ereignisfunktion|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // Ereignis-ID 
                  const long& lparam,   // Ereignisparameter vom Typ long
                  const double& dparam, // Ereignisparameter vom Typ Double
                  const string& sparam) // Ereignisparameter vom Typ String
  {
//--- Zeitpunkt des letzten Mausklicks
   static uint last_click=0;
//--- Linksklick auf das Diagramm
   if(id==CHARTEVENT_OBJECT_CLICK)   
     {
      uint click_time=GetTickCount();
      //Drucken("click_time=",click_time);
      //Drucken("Koordinaten des Mausklicks im Diagramm: x = ",lparam," y = ",dparam);
      if(click_time-last_click<dbl_click_time)
        {
         PrintFormat("DoubleClick! time=%d msec",click_time-last_click);
         // Senden Sie das ON_DBL_CLICK-Ereignis an den Client-Bereich - lassen Sie ihn es verarbeiten 
         EventChartCustom(CONTROLS_SELF_MESSAGE,ON_DBL_CLICK,ClientArea.Id(),dparam,ClientArea.Name());       
        }
      last_click=click_time;
      //---
     }
   AppWindow.ChartEvent(id,lparam,dparam,sparam);
  }

Fügen Sie die Zeit zwischen den Klicks in Millisekunden zum externen Parameter der Anwendung hinzu - wenn sie kleiner als die angegebene Zeit ist, wird das DoubleClick-Ereignis erzeugt.

//+------------------------------------------------------------------+
//|MyWndClient.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. | |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.001"
#property description "MyWndClient-Anwendung basierend auf der Klasse CMyWndClient"
#property description "Schaltflächen zum Einstellen der Hintergrund- und Kopfzeilenfarbe hinzugefügt"
#include "MyWndClient.mqh"
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
//--- Eingabeparameter
input bool InpTwoButtonsVisible=false; // Breite der Platte
input bool HideInvisble=false;         // das Unsichtbare ausblenden
input uint dbl_click_time=500;         // Zeitraum zwischen den Klicks in msec

Die Dateien sind angehängt. Sie können sie einzeln anzeigen oder das Archiv in den Ordner MQL5/Experts extrahieren.

Dateien:
 

Das Video zeigt, dass das Doppelklick-Ereignis nur auf dem Bedienfeld ausgelöst wird. Außerhalb des Bedienfelds wird das Ereignis nicht aufgezeichnet.

Dateien:
 
Ich frage mich, ob es möglich ist, das Panel undurchsichtig für die Maus zu machen. Beim Ziehen und sogar bei der Bearbeitung im Feld "Bearbeiten" bleiben die Objekte auf dem Diagramm haften und lassen sich nicht mehr ziehen.
 
Photic:
Ich frage mich, ob es möglich ist, das Bedienfeld undurchsichtig für die Maus zu machen. Beim Ziehen und sogar beim Bearbeiten im Feld "Bearbeiten" bleiben die Objekte in der Grafik hängen und lassen sich nicht mehr ziehen.

Außerdem. Sehr oft bleiben Haltestellen und Takeouts auf diese Weise hängen.

Sie können versuchen, dieses Problem zu lösen, indem Sie die Ansicht auf virtuell umstellen - wenn die Linien nicht zum Bearbeiten ausgewählt sind, werden sie beim Verschieben des Feldes nicht eingeklemmt.

Und außerdem ... wäre es cool zu wissen, wie man aktuelle Informationen (z.B. Gewinn bei offenem Buy oder Sell oder andere sich ändernde aktuelle Informationen) im Panel-Fenster selbst ausgeben kann?

Vielleicht hat jemand etwas ähnliches gemacht. MT4.

 
Vyacheslav Nekipelov:

***

Und noch etwas ... es wäre toll zu wissen, wie man die Ausgabe von aktuellen Informationen (z.B. Gewinn bei offenem Kauf oder Verkauf oder jede sich ändernde aktuelle Information) im Panel-Fenster selbst machen kann?

Vielleicht hat jemand etwas ähnliches gemacht. MT4.

Man kann alles in das Panel ausgeben - man muss nur neue Methoden schreiben, die für die Ausgabe verantwortlich sind.

Aber für ein altes Terminal ist das nicht interessant.

Hier ist ein Beispiel für ein Panel, das Informationen über Positionen anzeigt: https: //www.mql5.com/ru/code/16931.
 
Vladimir Karputov:
Hier ist ein Beispiel für ein Panel, das Positionsinformationen anzeigt: https: //www.mql5.com/ru/code/16931

Vielen Dank! Ich werde mich mal mit diesem Thema beschäftigen.

 
Sehr guter Artikel!
 

Danke, Vladimir, für diesen und den vorherigen Artikel. Ich habe einige neue nützliche Punkte für mich gelernt.

Sie haben es nicht geschafft, zu sehen, warum die Kopfzeile beim ersten Mal zusammen mit den Schaltflächen zum Schließen gefärbt wird, aber nach dem Minimieren/Entfalten die Farbänderungen die Steuerelemente nicht mehr beeinflussen?


 
Vasiliy Pushkaryov:

Danke, Vladimir, für diesen und den vorherigen Artikel. Ich habe einige neue nützliche Punkte für mich gelernt.

Sie haben es nicht geschafft, zu sehen, warum die Kopfzeile beim ersten Mal zusammen mit den Schaltflächen zum Schließen gefärbt wird, aber nach dem Minimieren/Entfalten die Farbänderungen die Steuerelemente nicht mehr beeinflussen?


Ich habe den Grund dafür gefunden. Sehen Sie sich die Breite der Kopfzeile nach dem ersten Durchlauf und nach dem Minimieren/Entfalten an:

Breite der Kopfzeile nach dem ersten Durchlauf

Abb. 1: Breite der Kopfzeile nach dem ersten Start


Breite der Kopfzeile nach dem Zusammenklappen/Ausklappen

Abb. 2: Breite des Headers nach der Minimierung/Entfaltung


 
Vladimir Karputov:

Ich habe die Ursache entdeckt. Schauen Sie sich die Breite der Kopfzeile nach dem ersten Durchlauf und nach dem Minimieren/Deaktivieren an:


Großartig, danke. Ich habe eine Zeile in den Code eingefügt und das Anklicken der Schaltfläche färbte die Kopfzeile komplett ein.

//+------------------------------------------------------------------+
//| Ereignisbehandler|
//+------------------------------------------------------------------+
void CLivePaneButtonClicks::OnClickButton2(void)
  {
   string prefix=Name();
   int total=ExtDialog.ControlsTotal();
   for(int i=0;i<total;i++)
     {
      CWnd*obj=ExtDialog.Control(i);
      string name=obj.Name();
      //---
      if(name==prefix+"Caption")
        {
         CEdit *edit=(CEdit*) obj;
         color clr=(color)GETRGB(XRGB(rand()%255,rand()%255,rand()%255));
         edit.ColorBackground(clr);
         edit.Width(336);
         ChartRedraw();
         return;
        }
     }
  }

Jetzt können Sie diesen Punkt einfach in den Funktionen überschreiben

virtual void Minimize(void);
virtual void Maximize(void);

Und alles wird gut.

Aber mit Ihrer Erlaubnis werde ich Sie ein paar Mal in den Zweigen mit neuen Builds an diese Funktion erinnern. Vielleicht werden sie es korrigieren.