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.
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.
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.
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ş). .
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.
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.
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.
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)inputbool resize_canvas = false;
int chart_width,chart_height;
//+------------------------------------------------------------------+intOnInit() {
img.Resize(resize_canvas?10:img.width*MAX_ZOOM); // формируем массив _bmp[] максимального размера в режиме без изменения размера canvasChartSetInteger(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);
}
//+------------------------------------------------------------------+voidOnDeinit(constint reason) {
}
//+------------------------------------------------------------------+voidOnTick() {
}
//+------------------------------------------------------------------+voidOnChartEvent(constint id,
constlong &lparam,
constdouble &dparam,
conststring &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);
}
}
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.
bu makale ile başlayabilirsiniz: https: //www.mql5.com/en/articles/12751
bu makale ile başlayabilirsiniz: https: //www.mql5.com/en/articles/12751
Harika... Çok teşekkürler!
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.
Bu yeni makalede, Bilgi panellerini uygulamak için başka bir seçenek.
https://www.mql5.com/ru/articles/13179

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ş).
.
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.
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.
Güzel ve kullanışlı. Sadece ilgi için, bu MT4'te kullanılabilir mi?
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.
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, biraz sonra size bir örnek vereceğim.
Bir kod örneği için çok minnettar olurum. Şimdiden teşekkürler...
Tamam, biraz sonra size bir örnek vereceğim.
İş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):
Bu yüzden tüm ekran için tek bir tuval kullanmayı tercih ediyorum!