MQL ile yazılmış kullanıcı arayüzleri galerisi - sayfa 78

 
Реter Konow #:
Böyle bir şey yapmak kolay değil. )

Bildiğim kadarıyla, standart Ccanvas sınıfında renk gradyanı çizmek için bir işlevsellik yok, GUI'nizde gradyanla sorunu nasıl çözdünüz?

Işık efektlerini mi kastediyorsunuz? Işık eklendi :D Açıklandığı gibi, CCanvas da yalnızca temelleri ve yapısı bakımından uyarlanmıştır, ayrıntılarında değil.

//+------------------------------------------------------------------+
//| Macro to generate color                                          |
//+------------------------------------------------------------------+
#define XRGB(r,g,b)    (0xFF000000|(uchar(r)<<16)|(uchar(g)<<8)|uchar(b))
#define ARGB(a,r,g,b)  ((uchar(a)<<24)|(uchar(r)<<16)|(uchar(g)<<8)|uchar(b))
#define TRGB(a,rgb)    ((uchar(a)<<24)|(rgb))
#define GETRGB(clr)    ((clr)&0xFFFFFF)
#define GETRGBA(clr)   uchar((clr)>>24)
#define GETRGBR(clr)   uchar((clr)>>16)
#define GETRGBG(clr)   uchar((clr)>>8)
#define GETRGBB(clr)   uchar(clr)
#define COLOR2RGB(clr) (0xFF000000|(uchar(clr)<<16)|(uchar((clr)>>8)<<8)|uchar((clr)>>16))
#define RGB2COLOR(rgb) ((uchar(rgb)<<16)|(uchar((rgb)>>8)<<8)|uchar((rgb)>>16))


//+------------------------------------------------------------------+
//| Add light to rectangular area                                    |
//+------------------------------------------------------------------+
void CCanvasExt::AddLight(int x1, int y1, int x2, int y2, bool updown=true, double intensity=.5, int isoftedge=20, color lightcolor=C'255,255,255')
   {
   if (intensity==0)
      return;
      
   int tmp;
//--- sort vertexes
   if(x2<x1)
     {
      tmp=x1;
      x1 =x2;
      x2 =tmp;
     }
   if(y2<y1)
     {
      tmp=y1;
      y1 =y2;
      y2 =tmp;
     }
//--- out of screen boundaries
   if(x2<0 || y2<0 || x1>=m_width || y1>=m_height)
      return;
//--- stay withing screen boundaries
   if(x1<0)
      x1=0;
   if(y1<0)
      y1=0;
   if(x2>=m_width)
      x2=m_width -1;
   if(y2>=m_height)
      y2=m_height-1;


//--- calculate softedge
   isoftedge=MIN(100,isoftedge);
   int softedge=isoftedge>0 ? isoftedge*(y2-y1)/100 : 0;

//--- correct height
   y2-=(y2-y1)/2;
   y2+=(softedge/2);
   y2++;
   y2=MIN(m_height-1,y2);   
   
//--- prepare 
   COLOR_RGBA rgb=_ColorLumaMult(lightcolor,ABS(intensity));
   double r=(int)GETRGBR(rgb);
   double g=(int)GETRGBG(rgb);
   double b=(int)GETRGBB(rgb);  
   
   if (intensity<0)
      {
      r=0-r;
      g=0-g;
      b=0-b;
      }
   uint pixel;     
   int istart;
   int iend;
   int i;

//--- check direction
   if (updown)
      {
   //--- add main light   
      for(;y1<y2-softedge;y1++)
         {
         istart=y1*m_width+x1;
         iend=istart+(x2-x1);
         for (i=istart;i<=iend;i++)
            {
            pixel=m_pixels[i];
            m_pixels[i]=ARGB(GETRGBA(pixel),MIN(GETRGBR(pixel)+r,0xFF),MIN(GETRGBG(pixel)+g,0xFF),MIN(GETRGBB(pixel)+b,0xFF));// m_pixels[i]+=XRGB(r,g,b);
            //m_pixels[i]|=rgb;
            }
         }
      if (softedge==0)
         return;
   
   //-- Add soft edge 
      double decr=r/softedge;
      double decg=g/softedge;
      double decb=b/softedge;
   
   //--- Loop rows separate and adjust color each row   
      for (;y1<=y2;y1++)
         {
         r-=decr; r=MAX(0,r); 
         g-=decg; g=MAX(0,g); 
         b-=decb; b=MAX(0,b); 
         
         istart=y1*m_width+x1;
         iend=istart+(x2-x1);
         for (i=istart;i<=iend;i++)
            {
            pixel=m_pixels[i];
            m_pixels[i]=ARGB(GETRGBA(pixel),MIN(GETRGBR(pixel)+r,0xFF),MIN(GETRGBG(pixel)+g,0xFF),MIN(GETRGBB(pixel)+b,0xFF));// m_pixels[i]+=XRGB(r,g,b);
            }
         }
      }   
  }   
 
Doerk Hilger #: Işık efektlerini mi kastediyorsun? Eh, ışık eklendi :D Söylendiği gibi, CCanvas da sadece temelde ve yapıda uyarlanmıştır, ancak ayrıntılarda değil.
Anladım, teşekkürler. )
 
Реter Konow #:
Anladım, teşekkürler. )

Kullanmaktan çekinmeyin :)
Not: Gördüğüm kadarıyla yukarıdan aşağı aslında işe yaramaz. Her neyse, ışık zaten genellikle yukarıdan gelir

 
Doerk Hilger #:

Kullanmaktan çekinmeyin :)
Not: updown aslında görebildiğim kadarıyla işe yaramaz. Her durumda, ışık genellikle yukarıdan gelir.

Evet, ilginç bir seçeneğiniz var, deneyeceğim :)

Işık dağılımının tam tersi şekilde çalışmasını sağladım - belirli bir kaynak renkten daha açık bir renge. Açıklamama izin verin: renk bölümleme algoritmasının kendisi doğru çalışıyor ve diziye 256 renk tonu yazıyor. Bu, fonksiyonun kabul ettiği her renk için tam aralıktır. Ancak boyama algoritması, gradyanı elemanların yüzeylerine yalnızca bir yönde yerleştirir. Uzun zamandır özellikler eklemek ve hacim ve karmaşık düzlem elemanları verecek çok yönlü gradyan yapmak istiyordum. Prensip olarak, bu zor bir görev değil. Ancak, önümüzde çok daha önemli görevler var).

 
arkadaşım, EA'nızı geriye dönük test ederken GUI'yi nasıl kullanacağınızı çözebilirseniz minnettar olurum.
 
Реter Konow #:
Bunu yapmak kolay bir şey değil. )

Bildiğim kadarıyla, standart Ccanvas sınıfında renk gradyanı çizmek için bir işlevsellik yok, GUI'nizde gradyan ile sorunu nasıl çözdünüz?
Hepsi koddaki formüllerle çözülür
Dosyalar:
 
Yu Zhang geri test ederken GUI'yi nasıl kullanacağınızı çözebilirseniz minnettar olurum.

Bundan daha kolay bir şey yok.

Açıklanan çekirdek TÜM olayları yönetir, olayın bir tik veya grafik olayı olması önemli değildir. Fare konumunu vb. bir onay işaretinde de alabilir, değişiklikleri kontrol edebilir ve ardından grafik olayı için OnEACylce () işlevini çalıştırabilirsiniz. Artık hiçbir şeyle kısıtlı değilsiniz.

 
Yarın geliştirme durumuyla ilgili ayrıntılı bir güncelleme yayınlayacağım.

Bugün 6 editörden ikisinin temellerinin atıldığını söyleyebilirim.
 

Mevcut geliştirme durumu:

1. Nesnelerin, öğelerin, pencerelerin ve parametrelerin yüzlerce özelliğini editördeki sekmelere ve tablolara entegre etmek için çok fazla çalışma yapıldı. Bunları ayırmak ve sıralamak gerekiyordu. Bu görevin yaklaşık %70'i tamamlanmıştır. Bu özelliklerin hepsine kullanıcılar çalışmalarında ihtiyaç duymayacaklar, ancak editörün daha da geliştirilmesi için onlara ihtiyacım var.

2- Kaydırma mekanizması hata ayıklandı. Artık her sekme kaydırıcının konumunu "hatırlıyor" ve geri döndüğünüzde tuval otomatik olarak son görüntüleme yerine kaydırılıyor.

3. Kaydırma ile ilgili gecikmeler düzeltildi. Örneğin, fare tekerleği ile kaydırma yaparken, etkileşimli öğeler imlece belirtilen hız eşiğinde tepki vermiyor. Tekerlek olaylarının geliş hızı saniyede 3'ten fazlaysa (olaylar arasında 300 ms),imlecin altına düşen öğeler yeniden çizilmez. Ayrıca artık kaydırma sırasında yalnızca şerit alanı ve bileşenleri çizilmektedir. Tuval alanının geri kalanı göz ardı edilmez.

4. T_FOLDER öğelerinin - tablo daraltıcıları - çalışması ayarlandı. Videoda açıkça görülebilir.

5. Eleman olgusuyla ilgili sorunlar bulundu ve düzeltildi.

6. Editörün alt penceresinin tasarımı daha iyi düşünüldü. Kullanışlı ve estetik çözümler bulundu. Ancak bu yönde yapılması gereken çok iş var.


En yakın planlar:

1. Get_property() ve Set_property() fonksiyonlarını yazın. Şablonlardan kopyalanan örneklerin düzenlenmesine izin verecekler. İlk fonksiyon, her elemandan tüm özellikleri (300'den fazla) bir kerede alacak ve bunları editör sekmelerindeki (videodakiler) düzenleme elemanlarına yerleştirecektir. İkinci fonksiyon, özel değerleri editör elemanından ana tuvaldeki (merkezdeki) düzenlenebilir örnek özelliğine gönderecektir.

2. Dört yıl önce iyi çalışan manuel öğe düzenleme işlevini geri yükleyin.


 
Bugün 21 Aralık. Editörün minimal sürümünün Aralık ayının onunda, yani 20'sinden önce hazır olmasını bekliyordum ve prensip olarak daha önce çalışan önceki minimal sürümü geri yükleseydim bu şekilde sonuçlanabilirdi, ancak editörün tam sürümünü oluşturmaya karar verdim. Bu yüzden beklediğimden çok daha fazla iş çıktı.

Daha önce bir görsel editörün 6 temel özelliğinden bahsetmiştim. Onları hatırlatmama izin verin:

1. Öğeleri/pencereleri klonlama.

Şablonları kopyalayarak ve özelliklerini değiştirerek yeni öğe örnekleri oluşturmak.

2. Elemanları/pencereleri silme.

Önceden klonlanmış örneklerin çekirdekten silinmesi.


3. Pencerelerin/elemanların özelliklerinin alınması.

Özellik editörü elemanları, düzenleme odağına giren örneklerin özellik değerlerini almalıdır.

4. Elemanların/pencerelerin özelliklerini düzenleme.

Özellikleri düzenlemenin toplamda 2 yolu vardır: (1) eleman editörleri aracılığıyla ve (2) örneklerin manuel olarak düzenlenmesi. Örneğin dalgalandırma, taşıma, x yüzeyine yazdırma vb.


5. Şablon/proje yükleme.

Daha fazla düzenleme için kaydedilmiş şablonları ve projeleri düzenleyicinin içine yüklemeye izin veren işlevsellik.

6. Şablonları/projeleri kaydetme.

Bitmiş GUI şablonlarını ve projelerini daha sonra özel programlara aktarmak veya beta sürümleri olarak kullanmak ve parçaları düzenlemek veya kopyalamak için yeniden yüklemek üzere dosyalara kaydeden işlevsellik.

Genel olarak, bunlar görsel bir editörün altı temelidir.

Yedinci temel olarak, onsuz çalışamayacağı bir grafik editör arayüzü ekleyebilirim.


Yeni yıldan önce, klonlama, silme ve görsel düzenlemeyi hem eleman editörleriyle hem de manuel modda uygulamayı umuyorum. Zaman içinde neler yapabileceğimi göreceğiz.