Tuval harika! - sayfa 84

 
Martin Moreno #:
Canvas sınıfı ile bir kullanıcı arayüzü oluşturmak istiyorum. Tek sorunum gösterge panelini grafik üzerinde nasıl hareketli hale getireceğimi bilmiyorum.
Çok aradım ama herhangi bir örnek bulamadım. Bir ipucu verebilirseniz sevinirim.


bu makale ile başlayabilirsiniz: https: //www.mql5.com/en/articles/12751

Improve Your Trading Charts With Interactive GUI's in MQL5 (Part I): Movable GUI (I)
Improve Your Trading Charts With Interactive GUI's in MQL5 (Part I): Movable GUI (I)
  • www.mql5.com
Unleash the power of dynamic data representation in your trading strategies or utilities with our comprehensive guide on creating movable GUI in MQL5. Dive into the core concept of chart events and learn how to design and implement simple and multiple movable GUI on the same chart. This article also explores the process of adding elements to your GUI, enhancing their functionality and aesthetic appeal.
 
Samuel Manoel De Souza #:

bu makale ile başlayabilirsiniz: https: //www.mql5.com/en/articles/12751

Harika... Çok teşekkürler!

 
Martin Moreno #:
Canvas sınıfı ile bir kullanıcı arayüzü oluşturmak istiyorum. Tek sorunum gösterge panelini grafik üzerinde nasıl hareketli hale getireceğimi bilmiyorum.
Çok aradım ama herhangi bir örnek bulamadım. Bir ipucu verebilirseniz sevinirim.


Size zaten 4 yıl önce bir örnek vermiştim :))

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi üzerine forum

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

Nikolai Semko, 2019.10.05 22:39

Gerçekten de çözüm Canvas.

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

İşte birçok pencerenin bulunduğu bir OBJ_BITMAP_LABEL nesnesine sahip bir göstergenin (MQL5 & MQL4) ilkel bir örneği.

#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();
}
//+------------------------------------------------------------------+

Bu yeni makalede, Bilgi panellerini uygulamak için başka bir seçenek.

https://www.mql5.com/ru/articles/13179

Dosyalar:
 
Nikolai Semko #:
Burada, örneğin, bunu açıkça gösteren bir komut dosyası çizdim. Sağda bu hızlı algoritma, solda ise benimki (yaklaşık 4-10 kat daha yavaş).
.
Nikolai Semko, merhaba. Bu örnekte https://www.mql5.com/ru/forum/227736/page66#comment_20456641 Bmp yeniden boyutlandırmayı (küçültmeyi) gösterdiniz.

Bmp resmini küçültebiliyorum, ancak tuval aynı boyutta kalıyor. Aynı nedenden dolayı resmi büyütemiyorum, orijinal boyutuna göre, yani tuvalin boyutuna göre kırpılıyor.

Dizileri tam olarak anlamıyorum, bu yüzden bana açıklayabilir misiniz veya daha iyisi bana kodlu bir örnek gösterebilir misiniz?

1. Görüntü büyütme

2. Küçülttüğümüz veya büyüttüğümüz resmin boyutuna eşit bir tuval.

Teşekkür ederim.

 
Vitaliy Kuznetsov #:
Nikolai Semko, merhaba. Bu örnekte https://www.mql5.com/ru/forum/227736/page66#comment_20456641 Bmp yeniden boyutlandırmayı (küçültmeyi) gösterdiniz.

Bmp resmini küçültebiliyorum, ancak tuval aynı boyutta kalıyor. Aynı nedenden dolayı resmi büyütemiyorum, orijinal boyutuna, yani tuvalin boyutuna göre kırpılıyor.

Dizileri tam olarak anlamıyorum, bu yüzden bana açıklayabilir misiniz veya daha iyisi bana kodlu bir örnek gösterebilir misiniz?

1. Görüntü büyütme

2. Küçülttüğümüz veya büyüttüğümüz resmin boyutuna eşit bir tuval.

Teşekkür ederim.

Merhaba,
CCanvas'ta bir Resize() işlevi vardır.
 
Vitaliy Kuznetsov #:

Güzel ve kullanışlı. Sadece ilgi için, bu MT4'te kullanılabilir mi?

Ne yazık ki, MQL4'te bir kaynağı dizi olarak ekleme olanağı yoktur. Ancak diğer her şey çalışıyor.
Elbette, sert tefler aracılığıyla uygulanabilir. Örneğin, bir BMP dosyasına bir PNG görüntüsü ekleyin, yani png'nin başına bir BMP başlığı ekleyin ve png'nin kendisini bir bmp görüntüsü olarak geçirin (yani, böyle bir BMP'yi açarsanız, farklı şeffaflıktaki renkli piksellerden oluşan bir gürültü olacaktır). Ve sonra bu "bmp dosyasını" MQL4'te bir kaynak olarak ekleyin. Bu piyasa için gerekli olabilir, böylece ex4 zaten daha yoğun bir png formatında bir görüntü içerir.
Referans için: png, kalite kaybı olmadan aynı BMP görüntüsünden yaklaşık 10 kat daha küçüktür, ayrıca tam şeffaflığı destekler.
Ex5(ex4) dosyasındaki gerçek bmp kaynağı sıkıştırılmış bir biçimde saklanır, ancak büyüklük sırasına göre daha az değildir. Tam olarak kontrol etmek gerekir.
 

Herkese iyi günler. Ben de bu kodla ilgileniyorum. Ancak Resize() kullanırken çalışmıyor. Belki de farklı bir sırayla yapılmalıdır.

 
Vladimir Nikolaychuk #:

Herkese iyi günler. Ben de bu kodla ilgileniyorum. Ancak Resize() kullanırken çalışmıyor. Belki de farklı bir sırayla yapılmalıdır.

Tamam, size daha sonra bir örnek vereceğim.
Ancak ben tüm grafik için tek bir tuval ile çalışmayı tercih ediyorum. Zamanın %95'inde bu doğrudur.
 
Nikolai Semko #:
Tamam, biraz sonra size bir örnek vereceğim.
Ancak ben tüm grafik için tek bir tuval ile çalışmayı tercih ediyorum. Bu, zamanın %95'inde doğrudur.

Bir kod örneği için çok minnettar olurum. Şimdiden teşekkürler...

 
Nikolai Semko #:
Tamam, biraz sonra size bir örnek vereceğim.
Ancak ben tüm grafik için tek bir tuval ile çalışmayı tercih ediyorum. Bu, zamanın %95'inde doğrudur.

İşte png.mql kütüphanesine dayanan bir örnek, fareyi hareket ettirirken tuvalin konumunu değiştirir ve boyutunu değiştirir. Fare işaretçisi yatay olarak ortadaysa, görüntünün orijinal boyutuna karşılık gelir, sola doğru ise - uzaklaştırma, sağa doğru ise - yakınlaştırma.
Sadece png.mql'deki C ve_C değişkenlerini private'dan public'e yeniden atmak zorunda kaldım. Bu yüzden bu kütüphane zaten yüklüyse üzerine yazmanız gerekir.
Bu örneğin iki çalışma modu vardır (giriş değişkeni bool resize_canvas):

  • görüntü her yeniden boyutlandırıldığında Canvas yeniden boyutlandırması ile
  • Görüntü her yeniden boyutlandırıldığında Canvas'ı yeniden boyutlandırmadan. Tuvalin başlangıç boyutu, çalışma mantığına göre mümkün olan maksimum görüntü boyutuna eşit olarak ayarlanır.
Ne yazık ki, MQL5'teki ilk modda, yalnızca bir şekilde iyileştirilebilen eski bir görüntü yanıp sönme hatası var - tuval boyutunu değiştirmemek. CCanvas.Resize() fonksiyonunu değiştirmeye yönelik tüm girişimlerim hiçbir sonuç vermedi. Her şey aynı şekilde yanıp sönüyor. Belki birisi bunu yapabilir :)))
Bu yüzden tüm ekran için tek bir tuval kullanmayı tercih ediyorum!

#define  MAX_ZOOM 2
#include <Canvas\png.mqh> //https://www.mql5.com/en/code/45439
CPng img("cubes.png"); // Get PNG from a file, create a canvas and display it on the screen at coordinates (X=500, Y=100)

input bool resize_canvas = false;
int chart_width,chart_height;


//+------------------------------------------------------------------+
int OnInit() {
   img.Resize(resize_canvas?10:img.width*MAX_ZOOM); // формируем массив _bmp[] максимального размера в режиме без изменения размера canvas
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
   chart_width = (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
   chart_height = (int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);
   img._CreateCanvas(chart_width/3, chart_height/3);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
}
//+------------------------------------------------------------------+
void OnTick() {
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) {
   if (id == CHARTEVENT_MOUSE_MOVE) {
      double new_width = img.width*(MAX_ZOOM*(double)lparam/chart_width);
      img.Resize(new_width);
      if (resize_canvas) { // режим с изменением размера canvas  Моргает!!!
         img._C.Resize(img._width,img._height);
         ArrayCopy(img._C.m_pixels,img._bmp);
      } else {  // режим без изменения размера canvas         не Мограет!!!
         img._C.Erase(0x00FFFFFF);
         for(int i =0; i++<img._height;) ArrayCopy(img._C.m_pixels,img._bmp,int(i*img.width*MAX_ZOOM),i*img._width,img._width);
      }
      img._C.Update();
      img._MoveCanvas(int(lparam)/5, int(dparam)/5);
   }
}



PNG
PNG
  • www.mql5.com
Forget about BMP files like a bad dream. Thanks to this library, you can now use the PNG format, which has a number of advantages, such as being more compact without losing image quality and maintaining transparency.
Dosyalar:
Neden: