Bibliotheken: Easy Canvas - Seite 14

 
Mighty7:

Ich muss Danke sagen. Jetzt ist es perfekt. Top Arbeit.

Können Sie mir bitte eine letzte Frage beantworten? Was ist schneller, links/rechts schalten oder hoch/runter schalten? Nochmals vielen Dank.

 
Mighty7:

Können Sie bitte 1 letzte Frage beantworten? Was ist schneller, das Schalten nach links/rechts oder das Schalten nach oben/unten? Nochmals vielen Dank.

Das Schalten nach oben/unten ist etwas schneller als das Schalten nach links/rechts. Die gesamte Verschiebung dauert etwa 0,3 Millisekunden (1/3000stel einer Sekunde) auf einem durchschnittlichen Computer mit einem Standard-FullHD-Bildschirmfenster.

Das Verschieben nach oben und unten ist etwas schneller als das Verschieben nach links und rechts. Die gesamte Verschiebung dauert auf einem durchschnittlichen Computer bei einem Standard-FullHD-Fenster etwa 0,3 Millisekunden (1/3000stel einer Sekunde).

 
Nikolai Semko:

Die Verschiebung nach unten und oben ist etwas schneller als nach links und rechts. Die gesamte Verschiebung dauert etwa 0,3 Millisekunden (1/3000stel einer Sekunde) auf einem durchschnittlichen Computer mit einem Standard-FullHD-Bildschirmfenster.

Die Verschiebung nach oben und unten ist etwas schneller als die nach links und rechts. Die gesamte Verschiebung dauert auf einem durchschnittlichen Computer bei einem Standard-FullHD-Fenster etwa 0,3 Millisekunden (1/3000stel einer Sekunde).

Vielen Dank an Sie.

 
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if (sparam=="0") W.MouseStatus=NO_PRESSED;
   else if (sparam=="1") W.MouseStatus=LEFT_BUTTON_PRESSED;
   else if (sparam=="2") W.MouseStatus=RIGHT_BUTTON_PRESSED;
   else if (sparam=="3") W.MouseStatus=LEFT_AND_RIGHT_BUTTONS_PRESSED;
   else W.MouseStatus=KEY_PRESSED;
   W.IdEvent=id;
   W.lparam=lparam;
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/(double)W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }

Ich habe hier ein paar Mal die Division durch 0 erhalten, aber nach einem Neustart des Terminals lässt es sich nicht mehr reproduzieren)

 
Oleksii Chepurnyi:

Ich habe hier ein paar Mal die Division durch 0 erhalten, aber nach einem Neustart des Terminals lässt es sich nicht mehr reproduzieren)

Seltsam, das ist mir noch nie passiert.
Nun, dann ersetzen Sie es erst einmal so:

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if (W.dx_pix==0) return;
   if (sparam=="0") W.MouseStatus=NO_PRESSED;
   else if (sparam=="1") W.MouseStatus=LEFT_BUTTON_PRESSED;
   else if (sparam=="2") W.MouseStatus=RIGHT_BUTTON_PRESSED;
   else if (sparam=="3") W.MouseStatus=LEFT_AND_RIGHT_BUTTONS_PRESSED;
   else W.MouseStatus=KEY_PRESSED;
   W.IdEvent=id;
   W.lparam=lparam;
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+

Nein, so ist es besser:

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if (sparam=="0") W.MouseStatus=NO_PRESSED;
   else if (sparam=="1") W.MouseStatus=LEFT_BUTTON_PRESSED;
   else if (sparam=="2") W.MouseStatus=RIGHT_BUTTON_PRESSED;
   else if (sparam=="3") W.MouseStatus=LEFT_AND_RIGHT_BUTTONS_PRESSED;
   else W.MouseStatus=KEY_PRESSED;
   W.IdEvent=id;
   W.lparam=lparam;
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }
Leider kann ich die Version in QB nicht aktualisieren. Irgendetwas ist wieder einmal kaputt.
Dateien:
iCanvas.mqh  52 kb
 

Es wäre interessant, eine universelle Lösung mit 4k- und 8k-Monitoren zu sehen.

Zum Beispiel zeichnen wir ein Rechteck, darauf zwei Schaltflächen und zwei Eingabefelder. Schaltflächen bzw. Objekte in Pixel.

Wenn in Pixel, dann wird alles um 2 mal auf 4k Auflösung reduziert werden, außer für Eingabefelder.

Wenn Sie aber die gesamte Leinwand automatisch x2 übersetzen, dann sieht alles bei jeder Bildschirmauflösung wie auf einem normalen Monitor aus.

Ein weiteres Problem könnte sein, dass einige Benutzer in den Windows-Einstellungen die Schriftart vergrößern (was das Standard-Eingabefeld vergrößert).

Daher gibt es eine noch universellere Lösung, um die Verpixelung der Arbeitsfläche mit einem Multiplikator in Abhängigkeit von der Schriftgröße zu verändern.


Die Hauptbedingung ist, dass man wie auf einem normalen Full-HD-Monitor mit den üblichen Pixelmaßen zeichnet. Es wird nach einer Lösung gesucht:

1. die Skalierung des Blattes strikt auf x2 (bei 4k), x4 (bei 8k) ändern

2. Skalierung des Blattes mit einem dynamischen Multiplikator, der an die Schriftgröße gebunden ist.


Wozu? Für Dashboards, Trading Panels und andere Dinge, die von Objekten in Pixeln gezeichnet werden.

 
Vitaliy Kuznetsov:

Es wäre interessant, eine universelle Lösung mit 4k- und 8k-Monitoren zu sehen.

Zum Beispiel zeichnen wir ein Rechteck, darauf zwei Schaltflächen und zwei Eingabefelder. Schaltflächen bzw. Objekte in Pixel.

Wenn sie in Pixel sind, dann wird alles um 2 mal auf 4k Auflösung reduziert werden, außer Eingabefelder.

Aber wenn Sie automatisch übersetzen die ganze Leinwand x2, dann auf jedem Bildschirm Auflösung alles wie auf einem normalen Monitor aussehen wird.

Es kann auch ein Problem sein, dass einige Benutzer in die Windows-Einstellungen gehen und die Schriftart vergrößern (was das Standard-Eingabefeld vergrößert).

Daher die noch universellere Lösung, die Verpixelung des Canvas-Blattes mit einem Multiplikator in Abhängigkeit von der Schriftgröße zu verändern.


Die Hauptbedingung ist, dass man wie auf einem normalen Full-HD-Monitor mit den üblichen Pixelmaßen zeichnet. Es wird nach einer Lösung gesucht:

1. Ändern des Blattmaßstabs streng x2 (bei 4k), x4 (bei 8k)

2. Skalierung des Blattes mit einem dynamischen Multiplikator, der an die Schriftgröße gekoppelt ist


Wozu? Für Dashboards, Handelspanels und andere Dinge, die von Objekten in Pixeln gezeichnet werden.

Der Schlüssel zur Lösung ist TERMINAL_SCREEN_DPI.
Hier gibt es keine Komplexität. Ich habe alles schon lange implementiert.
Es ist keine Zeit für Demos.
Wenn Sie Schwierigkeiten haben, den Prozess zu verstehen, googeln Sie, wie er in JS implementiert ist.
 
Nikolai Semko:
Der Schlüssel zur Lösung ist TERMINAL_SCREEN_DPI.
Hier gibt es keine Komplexität. Ich habe alles für eine lange Zeit implementiert .
Es ist keine Zeit für Demo-Beispiele.
Wenn Sie Schwierigkeiten haben, den Prozess zu verstehen, googeln Sie, wie er in JS implementiert ist.

Ja, ich habe es später bei einer Suche gefunden. Vielen Dank. Es gibt ein Beispiel hier - https://www.mql5.com/de/docs/constants/environment_state/terminalstatus

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Состояние клиентского терминала
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Состояние клиентского терминала
  • www.mql5.com
Состояние клиентского терминала - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Nikolai Semko #:
neueste Version 1.12

Hallo, sehr interessant, ist es möglich, eine Leinwand in ein Objekt zu konvertieren? Ich meine, zum Beispiel, eine Leinwand Rechteck in ein Standard-Objekt Rechteck umgewandelt, um es zu verwalten.

 
Facundo Laje # :

Hallo, sehr interessant, ist es möglich, eine Leinwand in ein Objekt zu konvertieren? Ich meine, zum Beispiel, eine Leinwand Rechteck in ein Standard-Objekt Rechteck umgewandelt, um es zu verwalten.

Wenn buchstäblich in ein rechteckiges Objekt, dann nein.
Die Leinwand ist auch ein Objekt.
Sie können ein Canvas-Objekt nur programmatisch in ein Rechteckobjekt "umwandeln", so dass sich sein Inhalt bewegt und skaliert.
Visuell kann es genau wie ein rechteckiges Objekt aussehen, mit kleinen Quadraten in den Ecken, um es zu steuern. Aber nur wenige Programmierer in dieser Gemeinschaft werden in der Lage sein, dies zu implementieren, mich eingeschlossen.

Wenn wir über die Transformation des internen Inhalts des Rechtecks sprechen. Wenn es sich um ein einfaches gefülltes oder leeres Rechteck handelt, kann das jeder Programmierer tun.