Sıfırdan bir grafik kitaplığı oluşturma - sayfa 9

 
Aliaksandr Hryshyn :

Daha:

Sağ fare ile pencerenin alanına tıklayın, bir menü belirir. Fareyi hareket ettirin ve sol tıklayın. Sonuç olarak, pencere hareket eder.

Belki. Ne anlarsın, kendimi geliştirip test ediyorum, sonuç olarak, çalışma sürecinde yanlışlıkla karşılaşana kadar bazı hatalar hakkında hiçbir şey bilmiyorum. Her şeyi tek başıma yaparım...

 

İşte örneğim, ekteki dosyada üst üste bindirilmiş üç pencere var.

Alt pencereli tek bir pencere oluşturmak, sadece motoru ek kod kullanmadan kullanmaktır. Üst düğmelere basma olayını ele almanın yanı sıra.

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);
     }
  }

En üstteki düğme tıklama olayını işleme:

 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 ;
        }
     }
  }

Birkaç düğme, ancak yalnızca bir ana pencere

Dosyalar:
 
Реter Konow :

Böyle bir bug vardı. Düzeltildi. Olayın kendisi sırayla düzeltildi, ancak kod geliştikçe kaçınılması mümkün olmayan çeşitli değişikliklerle hatalar ortaya çıkıyor.

Evet, kolay değil

Demo resmi:


 
Sadece böyle bir durumda, ilk etapta olayları ve pencere kontrollerini iyi çalışmanız gerekiyor, gerisi zaten daha basit, gerisi çok daha fazla iş olsa da.
 
Sıfırdan görsel öğelerden oluşan bir kitaplık yapmak isteyenler var :) ?
 
Aliaksandr Hryshyn :
Sadece böyle bir durumda, ilk etapta olayları ve pencere kontrollerini iyi çalışmanız gerekiyor, gerisi zaten daha basit, gerisi çok daha fazla iş olsa da.

Birikme zaten orada.

1: Windows'ta kapatma ve simge durumuna küçültme düğmeleri olmalıdır (en azından).

2: pencereler tıklandığında üst üste yeniden çizilmelidir.

3: Pencereler fare ile hareket ettirilmelidir.

4. İmleç hareket ettiğinde ( işaretli olay) Windows grafikte "keşfedilmelidir" (odaklanmalıdır).

5. Tüm pencere öğeleri, pencerenin ortak "haritasında" olmalıdır ve fareyi üzerine getirdiğinizde (sivri olay) bulunacaktır.

 

En basit unsurlar:

1. Statik, boyut olarak değişmeyen ve çökmeyen Pencere.

2. Düğme.

3. Onay kutusu.

4. Radyo düğmesi.

5. Sekme.

6. Çizgi, çerçeve, bölücü, dikdörtgen.


Orta zorluktaki unsurlar:

1. Kaydırıcılar.

2. İlerleme çubukları.

3. Giriş alanları.

4. Kaydırılabilir alanlar.

5. Basit bir listenin öğeleri.


Yüksek derecede karmaşıklık unsurları.

1. Açılır liste (çok karmaşık öğe).

2. Dinamik (gerilebilir) pencere. Çok zor.


Toplamda yaklaşık 50 çeşit kontrol vardır. Her birinin, motorun karşılık gelen işlevselliği tarafından desteklenen ortak ve benzersiz bir özellik kümesi olmalıdır. En az 100 özellik vardır, aksi takdirde elementlerin çalışması ciddi şekilde sınırlandırılacaktır.

Basit şekiller ve çizgiler çok fazla özelliğe ihtiyaç duymaz, ancak öğe ne kadar karmaşıksa o kadar fazladır.
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Все объекты, используемые в техническом анализе, имеют привязку на графиках по координатам цены и времени – трендовая линия, каналы, инструменты Фибоначчи и т.д.  Но есть ряд вспомогательных объектов, предназначенных для улучшения интерфейса, которые имеют привязку к видимой всегда части графика (основное окно графика или подокна индикаторов...
 

Saçmalık! Tabloları unuttum! Orada bir orman var...

Ve ağaç benzeri bir liste ve çeşitli şeritlerden oluşan her türlü klasör ...

 
Her etkileşimli kontrolün kendi özellikleriyle yönettiği bir parametresi vardır. Örneğin, bir düğme bool (1 veya 0) türünde bir parametredir, bir giriş alanında string (string) türünde bir parametre bulunur , bir kaydırıcı bir aralıktır (aralık) ... current_value, last_value, min, max, step, value_type ve diğerleri özellikleri. Her özellik işlevsellik tarafından desteklenir.

Her etkileşimli öğe (iyilik için), farklı olaylarda değişen 8 farklı duruma sahip olmalıdır.

Örneğin: nötr, nötr_noktalı, aktif_nötr, aktif_nokta, nötr_vurgulanmış, aktif_vurgulanmış, nötr_kilitli, aktif_kilitli.

Her durum, kendi öğe özellik değerleri kümesiyle düşünülür ve özel işlevsellik tarafından sabitlenen kendi olayları üzerinde etkili olur.
 
Реter Konow :

Saçmalık! Tabloları unuttum! Orada bir orman var...

Ve ağaç benzeri bir liste ve çeşitli şeritlerden oluşan her türlü klasör ...

Benim durumumda, "orman" ortalamadan daha karmaşık hale getirilmedi: ekran penceresi (tablonun görünür alanı), tüm hücrelerin sığması gereken tam boyutlu bir pencere, içinde hareket edecek ana pencere, satırlar ve içlerindeki hücreler için pencere ve ayrıca kaydırma (kaydırıcı, bant sınırlı). Göreceli yerleşim kısıtlamaları, özellikler tarafından belirlenir. Yalnızca kaydırıcı için , nesneyi hareket ettirme olaylarını durdurmak ve " tam boyutlu pencerenin" konumunu ayarlamak gerekir. Bunların hepsi sanal pencerelerle yapılır, görsel kısmı buna eklemeniz gerekir, görsel kısım olmadan çizgiler için pencereler ve tam boyutlu bir pencere olacaktır. Düzenlenen hücre için bir giriş alanı yapın (bu zaten kendiniz yapılır), etkileşimin geri kalanı motor tarafından uygulanır: her hücre için doğru olaylar gelir (fare olayları, yeniden çizim, hareket) .. .. Bu tür fırsatlar, çok sayıda pencere (büyük listeler, tablolar, birkaç bin pencere) olduğunda performansı artırmak için birkaç fikir daha var.