Tuval harika! - sayfa 44

 
Nikolai Semko :

bu işlevler çok kötü yazılmış. Orada şeytan başını yakalayacak. Normal yumuşatma yok, karıştırma renkleri ve şeffaflık ile normal çalışma yok. Sadece onları ezmeniz ve çöp kutusuna atmanız ve yenilerini yazmanız gerekiyor.
Bunun hakkında zaten burada yazdım.

Her durumda, standart PixelTransform işlevini kesinlikle bununla değiştirmeniz gerekir:

https://www.mql5.com/ru/forum/1111/page2553#comment_13054823

Double versiyonunu (tüm int giriş parametrelerinin double olduğu) yazmaya başladı, ancak bitirmedi, rafa koydu. Basit görünmek için çok basit bir iş değil. Daha doğrusu yazmak sorun değil, sorun çok kaliteli yazmak, yani hızlı bir algoritma var. Benim asıl sorunum Mükemmeliyetçilik.

Açıkçası, bitirmediler)

Tüm tuvali yeniden yazmak için harekete geçmem pek olası değil. Şimdilik 1 adet iki piksel yerine 2 adet tek piksellik yan yana çizmemiz gerekecek)

 
Andrey Khatimlianskii :

Açıkçası, bitirmediler)

Tüm tuvali yeniden yazmak için harekete geçmem pek olası değil. Şimdilik 1 adet iki piksel yerine 2 adet tek piksellik yan yana çizmemiz gerekecek)

Tüm tuvali yeniden yazmanıza gerçekten gerek yok. Ana şey bir daire formatı yapmaktır.

Circle( double x, double y, double r1, double r2= 0 , uint clr)  

ve çizgileri normal yapın

Polyline( const double &x[], const double &y[], const uint clr, const double size, const uint style,ENUM_LINE_END end_style)

bu, görevlerin %95'inin tamamlanmasını kapsayacaktır

 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

tüm nesneler nasıl 1 nesneye dönüştürülür

Nikolai Semko , 2019.10.05 22:39

Gerçekten de çözüm Canvas'tır.

Ve Canvas ilk bakışta göründüğünden çok daha kolay.

Burada, içinde birçok pencere bulunan bir nesne OBJ_BITMAP_LABEL olan bir göstergenin (MQL5 ve MQL4) ilkel bir örneği verilmiştir.

 #property indicator_chart_window
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164 - MQL5
                              //https://www.mql5.com/en/code/23840 - MQL4

struct win {
   int                x;
   int                y;
   int                width;
   int                height;
   uint               clr;
};
win wnd[ 30 ];
int OnInit () {
   for ( int i= 0 ; i< ArraySize (wnd); i++) {
      wnd[i].width= rand ()% 200 + 70 ;
      wnd[i].height= rand ()% 150 + 50 ;
      wnd[i].x= rand ()%(W.Width-wnd[i].width);
      wnd[i].y= rand ()%(W.Height-wnd[i].height);
      wnd[i].clr=ARGB( 255 , rand ()% 150 + 100 , rand ()% 150 + 100 , rand ()% 150 + 100 );
   }
   ShowAllWind();
   return ( INIT_SUCCEEDED );
}

//+------------------------------------------------------------------+

int OnCalculate ( const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   return (rates_total);
}

//+------------------------------------------------------------------+

void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam) {
   static bool click = false ;
   static int x_mouse= 0 , y_mouse= 0 ;
   static int focus=- 1 , xfocus= 0 , yfocus= 0 ;
   int x=( int )lparam;
   int y=( int )dparam;
   if (sparam!= "1" && click) focus=- 1 ;
   if (sparam== "1" && !click) {
      focus=- 1 ;
       for ( int i= ArraySize (wnd)- 1 ; i>= 0 ; i--) {
         if (wnd[i].x<x && wnd[i].y<y && wnd[i].x+wnd[i].width>x && wnd[i].y+ 20 >y) {
            focus=i;
            xfocus=x;
            yfocus=y;
             break ;
         }
      }
       if (focus>= 0 ) ChartSetInteger ( 0 , CHART_MOUSE_SCROLL , false );
       else ChartSetInteger ( 0 , CHART_MOUSE_SCROLL , true );
   }
   click=(sparam== "1" )? true : false ;
   if (id== CHARTEVENT_MOUSE_MOVE && focus>= 0 ) {
      wnd[focus].x+=x-xfocus;
      wnd[focus].y+=y-yfocus;
      xfocus=x;
      yfocus=y;
      ShowAllWind();
   }
   if (id== CHARTEVENT_CHART_CHANGE ) ShowAllWind();
}

//+------------------------------------------------------------------+

void ShowAllWind() {
   Canvas.Erase();
   for ( int i= 0 ; i< ArraySize (wnd); i++) {
      Canvas.FillRectangle(wnd[i].x,wnd[i].y,wnd[i].x+wnd[i].width,wnd[i].y+wnd[i].height,ARGB( 255 ,GETRGBR(wnd[i].clr)* 0.5 ,GETRGBG(wnd[i].clr)* 0.5 ,GETRGBB(wnd[i].clr)* 0.5 ));
      Canvas.FillRectangle(wnd[i].x+ 3 ,wnd[i].y+ 23 ,wnd[i].x+wnd[i].width- 3 ,wnd[i].y+wnd[i].height- 3 ,wnd[i].clr);
      Canvas.FillRectangle(wnd[i].x+ 3 ,wnd[i].y+ 3 ,wnd[i].x+wnd[i].width- 3 ,wnd[i].y+ 20 ,ARGB( 255 ,GETRGBR(wnd[i].clr)* 0.7 ,GETRGBG(wnd[i].clr)* 0.7 ,GETRGBB(wnd[i].clr)* 0.7 ));
   }
   Canvas.Update();
}
//+------------------------------------------------------------------+

 
Nikolai Semko :

Sınıf!

Gerçekten böyle bir fırsata ihtiyacım var ve bu mini pencerelerde kendi göstergelerimi çizebilmem için.

Neden bir pencere diğerinin altına gizlenmiş ve diğeri üstte duruyor, neden düzeltilebilir?

Daha fazla soru, aynı gösterge başka bir grafikte çalıştırılırsa işe yarar mı? Olaylar standart kitaplıkta olduğu gibi yankılanmayacak mı?

Ve her iki pencere de aynı koordinatlara sahipse, fare ile hangi pencere sürüklenecek?

Bir pencereyi fare ile yeniden boyutlandırmak mümkün müdür?

 
Sergey Chalyshev :

Sınıf!

Gerçekten böyle bir fırsata ihtiyacım var ve bu mini pencerelerde kendi göstergelerimi çizebilmem için.

Neden bir pencere diğerinin altına gizlenmiş ve diğeri üstte duruyor, neden düzeltilebilir?

Daha fazla soru, aynı gösterge başka bir grafikte çalıştırılırsa işe yarar mı? Olaylar standart kitaplıkta olduğu gibi yankılanmayacak mı?

Ve her iki pencere de aynı koordinatlara sahipse, fare ile hangi pencere sürüklenecek?

Bir pencereyi fare ile yeniden boyutlandırmak mümkün müdür?

Bu örnekte, bu yalnızca gerçekleştirilebilir pencere önceliğidir. Aslında, kazanma yapıları dizisindeki indeks ne kadar küçükse, pencerenin sanal katmanı o kadar düşük olur.

Her şekilde uygulanabilir. Örneğin, bir pencere "tutulduysa", o zaman ekranda ve dizide en üstte olan oldu.

Şeffaflık uygulayabilirsiniz. Burada nasıl yapılacağı gösterilmiştir . (burada her pikseli işlemek gerekir).

Ayrıca başka bir grafikte başlatabilirsiniz.
Koordinatlar aynıysa, üstteki sürüklenir.

tuval ile pencerenizde ve diğer MT pencerelerinde her şeyi yapabilirsiniz.
Ayrıca, pencereyi MT5'ten ayırabilir ve en azından monitörler arasında serbest geçişe gönderebilirsiniz. Burada görülebilir.

 
Nikolai Semko :

Bu örnekte, bu yalnızca gerçekleştirilebilir pencere önceliğidir. Aslında, kazanma yapıları dizisindeki indeks ne kadar küçükse, pencerenin sanal katmanı o kadar düşük olur.

Her şekilde uygulanabilir. Örneğin, bir pencere "tutulduysa", o zaman ekranda ve dizide en üstte olan oldu.

Şeffaflık uygulayabilirsiniz. Burada nasıl yapılacağı gösterilmiştir . (burada her pikseli işlemek gerekir).

Ayrıca başka bir grafikte başlatabilirsiniz.
Koordinatlar aynıysa, üstteki sürüklenir.

tuval ile pencerenizde ve diğer MT pencerelerinde her şeyi yapabilirsiniz.
Ayrıca, pencereyi MT5'ten ayırabilir ve en azından monitörler arasında serbest geçişe gönderebilirsiniz. Burada görülebilir.

Pek doğru değil, belki de doğru soruyu sormadım.

Birkaç pencereyi tek bir programda (komut dosyası, gösterge) düzenlemek zor değildir.

Grafik üzerinde kendi küçük penceresinde verileri gösterecek bir gösterge yapmak istiyorum. Ve böylece bu pencere grafiğe uygun bir şekilde yerleştirilebilir, fare ile sürüklenebilir, pencereyi fare ile yeniden boyutlandırabilir (bu arzu edilir, ancak onsuz da mümkündür). Her biri kendi parametreleriyle bu göstergelerden birkaçını grafikte çalıştırmanız gerekir. Şimdiye kadar, farklı göstergelerin olaylarının kesişmediğinden ve göstergenin fare olaylarına yeterince yanıt verdiğinden nasıl emin olacağımı çözemiyorum. Ve hangisinin daha iyi, daha basit, tuval veya nesneler olduğuna henüz karar vermedim. Dialog standart kitaplığında hiçbir şey olmaz.

 
Sergey Chalyshev :

...Farklı göstergelerin olaylarının nasıl örtüşmediğini hala çözemedim...

En kolay yol, özellikler penceresinde grafik nesnelerin adlarına bir dize değişkeni eklemektir.

 
Dmitry Fedoseev :

En kolay yol, özellikler penceresinde grafik nesnelerin adlarına bir dize değişkeni eklemektir. Gerçek ve kulüp üyeliği arasında mı kaldınız?

Doğal olarak öyle yapıyorum. Sorun fare ile sürüklemek. Nesneler aynı koordinatlara sahipse, biri tam olarak diğerinin altındadır. Onlara tıkladığınızda hangisi tepki verecek?

Hangi kulüplerden bahsediyorsun, hiçbir kulübe kaydolmadım ve gitmeyeceğim))

p.s. bir örnek gösterebilir misiniz?

 
Sergey Chalyshev :

Doğal olarak öyle yapıyorum. Sorun, farenin sürüklenmesiyle ilgili. Nesneler aynı koordinatlara sahipse, biri tam olarak diğerinin altındadır. Onlara tıkladığınızda hangisi tepki verecek?

Hangi kulüplerden bahsediyorsun, hiçbir kulübe kaydolmadım ve gitmeyeceğim))

p.s. bir örnek gösterebilir misiniz?

Kulüp hakkında yanlış yere yazdım, üzgünüm ... Bu kulüple bağlantı kurmam gerekiyor))

Bazı bir nesne tepki verecektir. Bir nesneyi etkinleştirirken muhtemelen bitti, Z sırasını her şeyden önce olacak şekilde değiştirin. Denemek gerek.

 
Sergey Chalyshev :

Doğal olarak öyle yapıyorum. Sorun fare ile sürüklemek. Nesneler aynı koordinatlara sahipse, biri tam olarak diğerinin altındadır. Onlara tıkladığınızda hangisi tepki verecek?

Hangi kulüplerden bahsediyorsun, hiçbir kulübe kaydolmadım ve gitmeyeceğim))

p.s. bir örnek gösterebilir misiniz?

Genel olarak, böyle bir durumda, en son taşınan nesne tepki vermelidir - en üsttedir ...

Neden: