Diskussion zum Artikel "Panels verbessern: Transparenz hinzufügen, Hintergrundfarbe ändern und von CAppDialog/CWndClient übernehmen"
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
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.
Das Video zeigt, dass das Doppelklick-Ereignis nur auf dem Bedienfeld ausgelöst wird. Außerhalb des Bedienfelds wird das Ereignis nicht aufgezeichnet.
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.
***
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.
Vielen Dank! Ich werde mich mal mit diesem Thema beschäftigen.
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?

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:

Abb. 1: Breite der Kopfzeile nach dem ersten Start

Abb. 2: Breite des Headers nach der Minimierung/Entfaltung
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.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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.
Autor: Vladimir Karputov