Erstellen einer Grafikbibliothek von Grund auf - Seite 9

 
Aliaksandr Hryshyn:

Mehr:

Klicken Sie mit der rechten Maustaste auf die Fensterbereiche, es erscheint ein Menü. Verschieben Sie die Maus und klicken Sie mit der linken Maustaste. Dadurch wird das Fenster verschoben.

Das ist möglich. Zu Ihrer Information: Ich entwickle und teste selbst, so dass ich von manchen Fehlern erst dann erfahre, wenn ich sie zufällig entdecke. Ich mache alles selbst...

 

In der beigefügten Datei gibt es drei Fenster, die sich überlappen.

Die Erstellung eines Fensters mit Unterfenstern erfolgt auf diese Weise, indem einfach die Engine ohne zusätzlichen Code verwendet wird. Mit Ausnahme der Behandlung des Ereignisses des Anklickens der oberen Schaltflächen.

cStrategy_viewer::cStrategy_viewer()
  {
   int width_type=126;
   int height_type=30;
   int width_object=170;
   int height_object=22;

   my_handler.md=GetPointer(this);
   int obj_types_count=(ER_NODE_TYPE_COUNT-1);
//Основное окно
   _main_window=new cV_object_rectangle();
   _main_window.Set_property_info(vop_position_x,10);
   _main_window.Set_property_info(vop_position_y,50);
   _main_window.Set_property_info(vop_size_x,width_type*obj_types_count);
   _main_window.Set_property_info(vop_size_y,700);
   _main_window.Set_property_info(vop_is_zorder_top_on_click,true);
   _main_window.Create(cV_object_base::global_parent_object);
//Заголовок
   cV_object_rectangle *caption=new cV_object_rectangle();
   caption.Set_property_info(vop_position_x,-1);
   caption.Set_property_info(vop_position_y,-1);
   caption.Set_property_info(vop_size_x,_main_window.Get_property(vop_size_x).data_long);
   caption.Set_property_info(vop_size_y,20);
   caption.Create(_main_window);
//Текст заголовка.Будет отображаться полное имя файла стратегии
   _caption_text=new cV_object_label();
   _caption_text.Set_property_info(vop_position_x,-1);
   _caption_text.Set_property_info(vop_position_y,-1);
   _caption_text.Set_property_info(vop_size_x,caption.Get_property(vop_size_x).data_long);
   _caption_text.Set_property_info(vop_text,"Стратегия ....");
   _caption_text.Set_property_info(vop_text_anchor,TA_CENTER);
   _caption_text.Set_property_info(vop_font_size,20);
   _caption_text.Set_property_info(vop_is_movable,true);
   _caption_text.Set_property_info(vop_moving_parent_index,2);
   _caption_text.Set_property_info(vop_is_position_fixing_parent_x,true);
   _caption_text.Set_property_info(vop_is_position_fixing_parent_y,true);
   _caption_text.Set_property_info(vop_position_fixing_parent_index_x,2);
   _caption_text.Set_property_info(vop_position_fixing_parent_index_y,2);
   _caption_text.Create(caption);
//Контейнер для типов объектов
   _object_types=new cV_object_base();
   _object_types.Set_property_info(vop_position_x,0);
   _object_types.Set_property_info(vop_position_y,20);
   _object_types.Set_property_info(vop_size_x,obj_types_count*width_type);
   _object_types.Set_property_info(vop_size_y,height_type);
   _object_types.Create(_main_window);
//Типы объектов
   cV_object_rectangle *obje_type;
   cV_object_label *obje_type_text;
   for(int i1=0; i1<obj_types_count; i1++)
     {
      obje_type=new cV_object_rectangle();
      obje_type.Set_property_info(vop_position_x,i1*width_type);
      obje_type.Set_property_info(vop_position_y,0);
      obje_type.Set_property_info(vop_size_x,width_type);
      obje_type.Set_property_info(vop_size_y,height_type);
      obje_type.Set_property_info(vop_border_line_width,3);
      obje_type.Set_property_info(vop_color_borders_mouse_moving,clrLightBlue);
      obje_type.Set_property_info(vop_color_borders_selected,clrYellow);
      obje_type.Set_property_info(vop_is_change_color_borders_on_mouse_move,true);
      obje_type.Set_property_info(vop_is_change_color_borders_on_select,true);
      obje_type.Set_property_info(vop_is_selected,false);
      obje_type.Set_property_info(vop_is_my_event_MOUSE_DOWN_UP_CLICK_LEFT,true);
      color clr=0;
      switch(eNode_type(i1+1))
        {
         case nt_function:
           {
            clr=clrDimGray;
            break;
           }
         case nt_indicator_data:
           {
            clr=clrNavy;
            break;
           }
         case nt_indicator:
           {
            clr=clrMaroon;
            break;
           }
         case nt_if:
           {
            clr=clrBlack;
            break;
           }
         case nt_const:
           {
            clr=clrGreen;
            break;
           }
         case nt_buffer:
           {
            clr=clrBlue;
            break;
           }
         case nt_node_top:
           {
            clr=clrIndigo;
            break;
           }
        }
      obje_type.Set_property_info(vop_color_borders,clr);
      obje_type.Set_property_info(vop_color_back,clr);
      obje_type.Create(_object_types);
      obje_type.Add_event_handler(GetPointer(my_handler));
      obje_type_text=new cV_object_label();
      obje_type_text.Set_property_info(vop_text,StringSubstr(EnumToString(eNode_type(i1+1)),3));
      obje_type_text.Set_property_info(vop_color_back,clrWhite);
      obje_type_text.Set_property_info(vop_size_x,width_type-1);
      obje_type_text.Set_property_info(vop_position_x,-3);
      obje_type_text.Set_property_info(vop_position_y,5-3);
      obje_type_text.Set_property_info(vop_text_anchor,TA_CENTER);
      obje_type_text.Set_property_info(vop_font_size,18);
      obje_type_text.Create(obje_type);
     }
   _object_types.Get_child(0).Set_property(vop_is_selected,true);
//Окно отображения объектов
   cV_object_rectangle *objects_viever=new cV_object_rectangle();
   objects_viever.Set_property_info(vop_position_x,0);
   objects_viever.Set_property_info(vop_position_y,height_type+_object_types.Get_property(vop_position_y).data_long);
   objects_viever.Set_property_info(vop_size_x,width_object);
   objects_viever.Set_property_info(vop_size_y,30*height_object);
   objects_viever.Create(_main_window);
//Контейнер объектов
   int functions_count=cRules::Get_object_count(nt_function);
   _objects=new cV_object_base();
   _objects.Set_property_info(vop_position_x,0);
   _objects.Set_property_info(vop_position_y,0);
   _objects.Set_property_info(vop_size_x,width_object);
   _objects.Set_property_info(vop_size_y,functions_count*height_object);
   _objects.Set_property_info(vop_color_back,clrOlive);
//_objects.Set_property_info(vop_is_position_fixing_parent_x,true);
//_objects.Set_property_info(vop_is_position_fixing_parent_y,true);
   _objects.Create(objects_viever);
//Объекты
   for(int i1=0; i1<functions_count; i1++)
     {
      cV_object_label *object=new cV_object_label();
      object.Set_property_info(vop_size_x,width_object-2);
      object.Set_property_info(vop_position_x,1);
      object.Set_property_info(vop_position_y,i1*height_object);
      object.Set_property_info(vop_color_back,clrWhite);
      object.Set_property_info(vop_text,cRules::Get_object_name(nt_function,i1));
      object.Set_property_info(vop_text_anchor,TA_LEFT);
      object.Set_property_info(vop_font_size,height_object-2);
      object.Create(_objects);
     }
  }

Behandlung des Ereignisses des Anklickens der oberen Schaltflächen:

void cStrategy_viewer::cMy_handler::On_event(sEvent &event)
  {
   cV_object_base *obj=GetPointer(event.object);
   switch(event.id)
     {
      case CHARTEVENT_CLICK_:
        {
         if(obj.Get_parent()==GetPointer(md._object_types))
           {
            obj.Set_property(vop_is_selected,true);
           }
         break;
        }
     }
  }

Es gibt mehrere Schaltflächen und nur ein übergeordnetes Fenster

Dateien:
 
Реter Konow:

Es gab einen solchen Fehler. Es wurde korrigiert. Das Ereignis selbst wird zwar behoben, aber bei verschiedenen Änderungen treten Fehler auf, die bei der Codeentwicklung nicht vermieden werden können.

Ja, es ist kompliziert.

Ein Bild von der Demo:


 
Es ist nur so, dass man in einem Geschäft wie diesem als erstes die Ereignisse und die Fenstersteuerungen ausarbeiten muss, und der Rest ist einfacher, auch wenn es an anderer Stelle noch viel mehr zu tun gibt.
 
Jeder, der daran interessiert ist, eine visuelle Elementbibliothek von Grund auf zu erstellen :) ?
 
Aliaksandr Hryshyn:
Es ist nur so, dass wir in diesem Fall erst einmal die Ereignisse und Fenstersteuerungen ausarbeiten müssen, der Rest ist einfacher, aber es gibt viel mehr Arbeit zu tun.

Die Grundlagen dafür sind bereits vorhanden.

1: Fenster sollten (zumindest) Schaltflächen zum Schließen und Ausklappen haben.

2: Die Fenster sollten übereinander gezeichnet werden, wenn sie angeklickt werden.

3: Die Fenster sollten sich mit der Maus bewegen.

4: Fenster sollten auf dem Diagramm "erkannt" (in den Fokus gebracht) werden, wenn sich der Cursor bewegt (Pointed Event).

5. Alle Fensterelemente müssen sich auf einer gemeinsamen "Landkarte" des Fensters befinden und erkannt werden, wenn die Maus mit dem Mauszeiger bewegt wird (event pointed).

 

Die einfachsten Elemente:

1. Ein statisches, in den Dimensionen unveränderliches und unauslöschliches Fenster.

2. Schaltfläche.

3. das Kontrollkästchen.

4. Optionsfeld.

5. Tab.

6. Linie, Rahmen, Teiler, Rechteck.


Elemente von mittlerer Komplexität:

1. Schieberegler.

2. Fortschrittsbalken.

3. Eingabefelder.

4. Bildlaufende Felder.

5. Einfache Listenelemente.


Hochkomplexe Gegenstände.

1. Eine Dropdown-Liste (ein sehr komplexes Element).

2. Ein dynamisches (dehnbares) Fenster. Superkomplex.


Es gibt etwa 50 Arten von Kontrollen. Jede sollte einen gemeinsamen und eindeutigen Satz von Eigenschaften haben, die von der entsprechenden Motorfunktionalität unterstützt werden. Eigenschaften mindestens 100, sonst wird die Arbeit der Elemente stark eingeschränkt.

Einfache Formen und Linien benötigen nicht viele Eigenschaften, aber je komplexer ein Element ist, desto mehr.
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Все объекты, используемые в техническом анализе, имеют привязку на графиках по координатам цены и времени – трендовая линия, каналы, инструменты Фибоначчи и т.д.  Но есть ряд вспомогательных объектов, предназначенных для улучшения интерфейса, которые имеют привязку к видимой всегда части графика (основное окно графика или подокна индикаторов...
 

Mist, ich habe die Tische vergessen! Es ist ein Dschungel da draußen... ))))

Und eine Baumliste, und alle Arten von Einklappern...

 
Jedes interaktive Steuerelement hat einen kontrollierten Parameter mit eigenen Eigenschaften. Zum Beispiel hat eine Schaltfläche einen Parameter vom Typ bool (1 oder 0), ein Eingabefeld einen Parameter vom Typ string, ein Schieberegler einen Parameter vom Typ range... Ein Eingabefeld mit Schaltflächen hat einen Parameter mit den Eigenschaften current_value, last_value, min, max, step, value_type und anderen. Jede Eigenschaft wird durch die Funktionalität unterstützt.

Jedes interaktive Element sollte (idealerweise) 8 verschiedene Zustände haben, die sich bei verschiedenen Ereignissen ändern.

Zum Beispiel: neutral, neutral_pointed, aktiviert_neutral, aktiviert_pointed, neutral_highlighted, aktiviert_highlighted, neutral_locked, aktiviert_locked.

Jeder Zustand wird mit einem eigenen Satz von Element-Eigenschaftswerten entworfen und tritt bei seinen eigenen Ereignissen in Kraft, die durch spezielle Funktionen festgelegt werden.
 
Реter Konow:

Mist, ich habe die Tische vergessen! Es ist ein Dschungel da draußen... ))))

Und eine baumartige Liste und alle Arten von Kollabierern...

In meinem Fall ist der "Dschungel" nicht komplizierter als der Durchschnitt: ein Anzeigefenster (der sichtbare Bereich der Tabelle), ein Fenster in voller Größe, in das alle Zellen passen müssen, es wird in das Hauptfenster geschoben, Fenster für Zeilen und Zellen darin, plus Bildlauf (ein Schieberegler, der von einem Balken begrenzt wird). Die Beschränkungen für die relative Positionierung werden durch die Eigenschaften bestimmt. Nur für den Schieberegler ist es notwendig, Objektbewegungsereignisse abzufangen und bereits die Position des"full size window" zu korrigieren.Dies alles geschieht durch virtuelle Fenster, wir müssen den visuellen Teil damit verbinden, ohne visuellen Teil gibt es Fenster für Linien und Fenster in voller Größe. Und für eine bearbeitbare Zelle, machen Sie ein Eingabefeld (dies ist eine benutzerdefinierte), alle anderen Dinge werden von der Engine behandelt werden - es wird richtige Ereignisse für jede Zelle (Maus-Ereignisse, Neuzeichnen, Verschieben) ..... Dies sind die Möglichkeiten, aber es gibt auch einige Ideen, um die Leistung zu erhöhen, wenn es zu viele Fenster gibt (große Listen, Tabellen, mehrere tausend Fenster).