Bibliotheken: Easy Canvas - Seite 4

 
Super. Bequem und leicht zu verstehen.
 

Ich schlage vor, den Maustastenstatus hinzuzufügen. Es hat keinen Einfluss auf die Geschwindigkeit, aber es kann nützlich sein)


struct Window
  {
   long              ChartId;     // Kennung des aktuellen Fensters
   uint              Color;       // Hintergrundfarbe des Fensters
   int               Width;       // Fensterbreite
   int               Height;      // Fensterhöhe
   int               height[];    // Höhe der Unterfenster
   int               Left_bar;    // Nummer des ganz linken Balkens im Fenster
   double            Right_bar;   // Nummer des ganz rechten Balkens im Fenster
   double            Total_bars;  // die maximale Anzahl von Balken im Fenster
   int               BarsInWind;  // Anzahl der sichtbaren Balken im Fenster
   double            Y_min;       // Der Mindestwert des Preises im Fenster
   double            Y_max;       // Der Höchstwert des Preises im Fenster
   double            dy_pix;      // Preisänderung für ein Pixel
   int               dx_pix;      // Ändern der Anzahl der Balken pro Pixel
   int               MouseX;      // Koordinate X der aktuellen Position des Mauszeigers
   int               MouseY;      // Y-Koordinate der aktuellen Position des Mauszeigers
   int               MouseStatus; // Status der Maustasten
   double            MouseBar;    // die aktuelle Balkenposition des Mauszeigers 
   double            MousePrice;  // der aktuelle Kurs des Mauszeigers
   datetime          MouseTime;   // die aktuelle Zeit des Mauszeigers
   int               MouseSubWin; // Nummer des Teilfensters, in dem sich der Mauszeiger befindet
   int               WindowsTotal;// Summe der Unterfenster, einschließlich des Hauptfensters
   int               SubWin;      // aktuelles Unterfenster
   datetime          time[];      // Array der Öffnungszeit aller sichtbaren Balken im Fenster
  };


void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseStatus=(int)sparam;
      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);
  }
 
Oleksii Chepurnyi:

Ich schlage vor, den Maustastenstatus hinzuzufügen. Es hat keinen Einfluss auf die Geschwindigkeit, aber es kann nützlich sein)

Ich kann dem nicht zustimmen, da ich darin nicht viel Sinn sehe.

Der Punkt ist, dass der Status von Maustasten und Tasten ein Ereignismodell ist, das nur dort verarbeitet werden sollte, wo das Auftreten dieses Ereignisses abgefangen wird, nämlich in OnChartEvent.
Sie werden keine Endlosschleife zur Abfrage des Auftretens eines Ereignisses außerhalb des Ereignishandlers einschränken. Welchen Sinn hat es also, diesen Status außerhalb von OnChartEvent zu platzieren, wenn die gesamte Verarbeitung dieser Klicks in OnChartEvent erfolgen sollte, dessen Status sich in lparam und sparam befindet.

Außer dem Zweck, eine neue Struktur der Mausereigniskennungen einzuführen, um die Lesbarkeit des Codes zu verbessern.

 
Nikolai Semko:

Ich kann dem nicht zustimmen, da ich darin keinen Sinn sehe.

Der Punkt ist, dass der Status von Maustasten und Tasten ein Ereignismodell ist, das nur dort behandelt werden sollte, wo das Auftreten dieses Ereignisses abgefangen wird, nämlich in OnChartEvent.
Sie werden keine Endlosschleife zur Abfrage des Auftretens eines Ereignisses außerhalb des Event-Handlers einschränken. Welchen Sinn hat es also, diesen Status außerhalb von OnChartEvent zu platzieren, wenn die gesamte Verarbeitung dieser Klicks in OnChartEvent erfolgen sollte, dessen Status sich in lparam und sparam befindet.

Außer dem Zweck, eine neue Struktur der Mausereigniskennungen einzuführen, um die Lesbarkeit des Codes zu verbessern.

Und warum dann die Mauskoordinaten speichern? ) Auch ereignisgesteuert )

Das mit der Schleife habe ich nicht verstanden...

Insbesondere brauchte ich den Status, um zu vermeiden, dass ein Teil des Objekts beim Ziehen mit der Maus gezeichnet wird.

 
Oleksii Chepurnyi:

Warum dann Mauskoordinaten speichern? ) Auch ereignisgesteuert )

Mauskoordinaten sind eine andere Sache. Die aktuellen Mauskoordinaten sind keine Ereignisinformation. Das Ereignis ist ihre Änderung.

Es kann vorkommen, dass Mauskoordinaten außerhalb von OnChartEvent benötigt werden. Zum Beispiel, hier.

Oleksii Chepurnyi:

Ich habe das mit der Schleife nicht verstanden...

Insbesondere wurde der Status benötigt, um zu vermeiden, dass ein Teil des Objekts beim Ziehen mit der Maus gezeichnet wird.

Nun, wenn man die Maus zieht, wird der Befehl zum Neuzeichnen eines Teils des Objekts von OnChartEvent in dem Moment aufgerufen, in dem sich die Mauskoordinate ändert und die Maus gedrückt wird, und OnChartEvent hat diesen Status, warum sollte man ihn in die Window-Struktur einbetten?

Würde man dasselbe nicht von OnChartEvent aus tun und gleichzeitig in der Instanz W der Window-Struktur MouseStatus vorhanden sein, müsste man eine Endlosschleife zur Abfrage dieses Parameters (MouseStatus) organisieren, um den Moment des Loslassens der Maustaste zu erwischen, was die CPU zum Stillstand bringen würde.

Diese Schleife ist nicht nur bei OnChartEvent notwendig.

Ich möchte nur sagen, dass es möglich und notwendig ist, den Status der Maustaste nur in OnChartEvent zu verwenden, wo er bereits vorhanden ist.

Wenn ich falsch liege, geben Sie mir bitte ein konkretes Beispiel, wo dieser Status nicht von OnChartEvent benötigt würde.


 
Nikolai Semko:

Wenn ich falsch liege, geben Sie bitte ein konkretes Beispiel, in dem dieser Status von etwas anderem als OnChartEvent angefordert wird.

Ich habe oben ein Beispiel geschrieben, alles funktioniert gut)

In OnChartEvent, wenn die Maus bewegt wird, ändern wir die Parameter und geben den Befehl, die Leinwand neu zu zeichnen. Ohne einen Parameter in der Struktur müssten wir sparam an ein Objekt übergeben, von dort an ein anderes Objekt und von dort an die Methode Draw().

 
Nikolai Semko:

Die Mauskoordinaten sind eine andere Sache. Die aktuellen Mauskoordinaten sind keine Ereignisinformation. Das Ereignis ist ihre Änderung.

Es kann vorkommen, dass die Mauskoordinaten außerhalb von OnChartEvent benötigt werden. Zum Beispiel, hier.

Nun, wenn Sie die Maus ziehen, wird der Befehl zum Neuzeichnen eines Teils des Objekts von OnChartEvent in dem Moment aufgerufen, in dem sich die Mauskoordinate ändert und die Maustaste gedrückt ist, und OnChartEvent hat diesen Status, warum sollte es in die Window-Struktur eingebettet werden?

Wenn Sie dasselbe nicht von OnChartEvent aus tun würden und gleichzeitig in der Instanz W der Window-Struktur MouseStatus vorhanden wäre, müssten Sie eine Endlosschleife der Abfrage dieses Parameters (MouseStatus) organisieren, um den Moment des Loslassens der Maustaste zu erwischen, was die CPU zum Stillstand bringen würde.

Diese Schleife wird nicht nur in OnChartEvent benötigt.

Ich möchte nur sagen, dass Sie den Status der Maustaste nur in OnChartEvent verwenden können und sollten, da er dort bereits vorhanden ist.

Wenn ich falsch liege, dann geben Sie mir ein konkretes Beispiel, wo dieser Status nicht von OnChartEvent benötigt würde.


Sehr seltsame Argumentation. Es gibt überhaupt keine Logik.

Sowohl Mauskoordinaten als auch gedrückte Tasten sind externe Zustände. Sie werden über Parameter an den Handler übergeben, und wenn sie in den internen Variablen des Objekts abgelegt werden (was sicherlich nützlich ist), sollten sie dort als Ganzes und nicht in Teilen vorhanden sein. Eine Bibliothek ist per Definition etwas, das nicht für den eigenen Bedarf, sondern in verallgemeinerter Form und unter Berücksichtigung der potenziellen Bedürfnisse anderer erstellt wird. Man kann nicht alle Bedürfnisse im Voraus kennen, also macht man keine künstlichen Einschränkungen wie diese.

 
Oleksii Chepurnyi:

Ich habe oben ein Beispiel geschrieben, alles funktioniert gut)

In OnChartEvent, wenn die Maus bewegt wird, ändern wir die Parameter und geben den Befehl, die Leinwand neu zu zeichnen. Ohne einen Parameter in der Struktur müssten wir sparam an ein Objekt übergeben, von dort an ein anderes Objekt und von dort an die Methode Draw().

Dies ist ein Klassiker des Genres - in allen Fensterbibliotheken werden die Zustände der Maustasten in einer einzigen Struktur mit den Cursor-Koordinaten übergeben.

weil sie alle zusammen eine Entität beschreiben und überhaupt nicht getrennt werden können.

 
Na gut. Du hast es verstanden.
 

aktualisiert auf Version 1.29

neu:

1. Hinzufügen der folgenden Defines zur Vereinfachung der Codeerstellung und zur Verbesserung der Lesbarkeit:

#define _Comment Canvas.Comm
#define _X Canvas.X
#define _Y Canvas.Y
#define _TimePos Canvas.TimePos
#define _Bar Canvas.Bar
#define _Price Canvas.Price
#define _CommXY(x,y,str) Canvas.TextPosition(x,y);\
Canvas.Comm(str);
#define _Font Canvas.CurentFont
#define _PixelSet Canvas.PixelSet
#define _MouseX W.MouseX
#define _MouseY W.MouseY
#define _MouseBar W.MouseBar
#define _Width W.Width
#define _Height W.Height
#define _Left_bar W.Left_bar
#define _Right_bar W.Right_bar
#define _BarsInWind W.BarsInWind

2. Hinzufügen des Parameters MouseStatus zur Window-Struktur, der 4 Werte annehmen kann, wie von den Workern gefordert:

  • NO_PRESSED (0)
  • LEFT_BUTTON_PRESSED (1)
  • RIGHT_BUTTON_PRESSED (2)
  • LEFT_AND_RIGHT_BUTTONS_PRESSED (3)