Bibliotheken: Die Bibliothek EasyAndFastGUI zum Erstellen von grafischen Interfaces - Seite 14

 

Hallo.

//+------------------------------------------------------------------+
//| Erstellen einer Leinwand zum Zeichnen eines Elements |
//+------------------------------------------------------------------+
bool CElement::CreateCanvas(const string name,const int x,const int y,
                            const int x_size,const int y_size,ENUM_COLOR_FORMAT clr_format=COLOR_FORMAT_ARGB_NORMALIZE)
  {
//--- Größenanpassung
   int xsize =(x_size<1)? 50 : x_size;
   int ysize =(y_size<1)? 20 : y_size;
//--- Letzten Fehler zurücksetzen
   ::ResetLastError();
//--- Erstellen eines Objekts
   if(!m_canvas.CreateBitmapLabel(m_chart_id,m_subwin,name,x,y,xsize,ysize,clr_format))
     {
      ::Print(__FUNCTION__," > Es konnte keine Leinwand zum Zeichnen des Elements erstellt werden (""+m_class_name+"): ",::GetLastError());
      return(false);
     }
//--- Letzten Fehler zurücksetzen
   ::ResetLastError();
//--- Abrufen eines Zeigers auf die Basisklasse
   if(!m_canvas.Attach(m_chart_id,name,clr_format))
     {
      ::Print(__FUNCTION__," > Eine Zeichenfläche konnte nicht an das Diagramm angehängt werden: ",::GetLastError());
      return(false);
     }
//--- Eigenschaften
   ::ObjectSetString(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_TOOLTIP,"\n");
   ::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_CORNER,m_corner);
   ::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_SELECTABLE,false);
//--- Alle Elemente außer dem Formular haben eine höhere Priorität als das Hauptelement
   Z_Order((dynamic_cast<CWindow*>(&this)!=NULL)? 0 : m_main.Z_Order()+1);
//--- Koordinaten
   m_canvas.X(x);
   m_canvas.Y(y);
//--- Abmessungen
   m_canvas.XSize(x_size);
   m_canvas.YSize(y_size);
//--- Einzüge vom Endpunkt aus
   m_canvas.XGap(CalculateXGap(x));
   m_canvas.YGap(CalculateYGap(y));
   return(true);
  }

CreateBitmapLabel - eine grafische Ressource erstellen

Attach - die gleiche Ressource lesen und wieder in die gleiche Ressource schreiben.

Oder verstehe ich etwas falsch?

 

Hallo nochmal :)

class CMouse
  {

...............

   //--- (1) Gibt die Fensternummer zurück, in der sich der Cursor befindet, (2) die der X-Koordinate entsprechende Zeit, 
   // (3) Niveau (Preis) entsprechend der Y-Koordinate
   int               SubWindowNumber(void) const { return(m_subwin);                        }
   datetime          Time(void)            const { return(m_time);                          }
   double            Level(void)           const { return(m_level);                         }

Wird Time and Level überhaupt irgendwo verwendet? Ich konnte es nirgends finden...

Wofür wird SubWindowNumber verwendet?

Mein Punkt ist, dass ChartXYToTimePrice eine ziemlich kostspielige Operation ist, die bei jeder Mausbewegung ausgeführt werden muss...

 
Oleksii Chepurnyi:

Das steht alles in den Kommentaren. Da gibt es nichts hinzuzufügen.

 
Anatoli Kazharski:

Das steht alles in den Kommentaren. Es gibt nichts hinzuzufügen.

Wenn Sie Kommentare im Code meinen, ist dort alles klar, aber darum geht es bei den Fragen nicht :)

 
Oleksii Chepurnyi:

...

Mein Punkt ist, dass ChartXYToTimePrice eine ziemlich kostspielige Operation ist, die bei jeder Mausbewegung ausgeführt werden muss...

Um die relative Koordinate zu erhalten, wenn die GUI nicht im Hauptfenster ist.

 
Anatoli Kazharski:

Um relative Koordinaten zu erhalten, wenn die GUI nicht im Hauptfenster ist.

Also vielleicht nur berechnen, wenn GUI nicht im Hauptfenster ist? :)


Ich bin mehr daran interessiert, warum Attach? Soweit ich das verstehe, wiederholt es die Aktionen von CreateBitmapLabel

 
Oleksii Chepurnyi:
Also vielleicht nur berechnen, wenn die GUI nicht im Hauptfenster ist? :)

Es gibt auch Varianten, bei denen sich das Hauptfenster der GUI im Unterfenster des Diagramms befindet und die Dialoge im Hauptfenster.

Mich interessiert eher, warum Attach? Soweit ich das verstehe, wiederholt es die Aktionen von CreateBitmapLabel

Es gibt einen Code der Methode CCanvas::Attach():

//+------------------------------------------------------------------+
Neues Objekt mit Bitmap-Ressource anhängen //|
//+------------------------------------------------------------------+
bool CCanvas::Attach(const long chart_id,const string objname,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA)
  {
   if(OBJ_BITMAP_LABEL==ObjectGetInteger(chart_id,objname,OBJPROP_TYPE))
     {
      string rcname=ObjectGetString(chart_id,objname,OBJPROP_BMPFILE);
      rcname=StringSubstr(rcname,StringFind(rcname,"::"));
      if(ResourceReadImage(rcname,m_pixels,m_width,m_height))
        {
         m_chart_id=chart_id;
         m_objname=objname;
         m_rcname=rcname;
         m_format=clrfmt;
         m_objtype=OBJ_BITMAP_LABEL;
         //--- Erfolg
         return(true);
        }
     }
//--- fehlgeschlagen
   return(false);
  }
 
Anatoli Kazharski:


Das ist der Code der Methode CCanvas::Attach():

Ja, und über CreateBitmapLabel. Ich habe sie mir angeschaut. Und soweit ich das verstanden habe, erstellt CreateBitmapLabel eine leere Ressource, und Attach liest die Ressource (irgendeine) und schreibt sie in m_pixels. Und wie ich oben geschrieben habe, erstellen wir eine Ressource (CreateBitmapLabel) mit dem Namen name, lesen dann dieselbe Ressource (Attach) und schreiben das Gelesene wiederum in dieselbe m_pixels

Oder verstehe ich etwas falsch?

PS Experimentell ohne Attach funktioniert alles :)

 
Oleksii Chepurnyi:

...

PS Experimentell ohne Attach funktioniert alles :)

Echt jetzt? Es hat sich also wieder etwas geändert. Irgendwas hat vorher sicher nicht funktioniert.

Und nach dem Löschen der GUI aus dem Diagramm werden die Objekte gelöscht?

 
Anatoli Kazharski:

Wirklich? Es hat also eine weitere Änderung gegeben. Irgendetwas hat vorher definitiv nicht funktioniert.

Und nachdem ich die GUI aus dem Diagramm entfernt habe, sind die Objekte gelöscht?

Alles scheint sauber zu sein :)

Dateien:
35.png  11 kb
36.png  6 kb