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.
#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.
この記事から始めることができます: https://www.mql5.com/en/articles/12751
https://www.mql5.com/en/articles/12751。
ありがとうございます!
すでに4年前に例を挙げています :))
取引、自動取引システム、取引戦略のテストに関するフォーラム
すべてのオブジェクトを1つのオブジェクトに変換する方法
ニコライ・セムコ, 2019.10.05 22:39
確かに、Canvasは解決策です。
そして、Canvasは一見したところよりもずっと簡単です。
ここに、1つのオブジェクトOBJ_BITMAP_LABELを持つインジケータ(MQL5とMQL4)の原始的な例を示します。
この新しい記事には、インフォメーション・パネルを実装するための別のオプションがあります。
https://www.mql5.com/ru/articles/13179
例えば、それを明確に示すスクリプトをスケッチしてみた。右側がこの高速アルゴリズムで、左側が私のアルゴリズム(約4~10倍遅い)である。 。
私はBmp画像を縮小することができますが、キャンバスは同じサイズのままです。同じ理由で画像を拡大することもできず、元のサイズ、つまりキャンバスのサイズでトリミングされます。
私は配列を完全に理解しているわけではないので、説明してもらえますか:
1.画像の拡大
2.画像を縮小または拡大した場合、そのサイズと同じキャンバス。
ありがとうございました。
Nikolai Semko さん、こんにちは。この例(https://www.mql5.com/ru/forum/227736/page66#comment_20456641)では、Bmpのリサイズ(縮小)を実演していますね。
Bmp画像を縮小することはできますが、キャンバスは同じサイズのままです。同じ理由で画像を拡大することもできず、元のサイズ、つまりキャンバスのサイズでトリミングされてしまいます。
私は配列を完全に理解しているわけではないので、説明してもらえますか:
1.画像の拡大
2.画像を縮小または拡大した場合、そのサイズと同じキャンバス。
ありがとうございました。
クールで便利です。ちょっと興味があるのですが、これはMT4で使えますか?
皆さん、こんにちは。私もこのコードに興味があります。しかし、Resize()を使ってもうまくいきません。多分、別の順序で行うべきです。
皆さん、こんにちは。私もこのコードに興味があります。しかし、Resize()を使ってもうまくいきません。多分、別の順序で行うべきです。
では、もう少し後で例を挙げよう。
コード例を教えていただけるとありがたいです。よろしくお願いします。
では、もう少し後で例を挙げよう。
これはpng.mql ライブラリに基づく例で、マウスを動かすとキャンバスの位置が変わり、サイズも変わる。マウス・ポインタが水平方向の中央にある場合は、画像の元のサイズに対応し、左にある場合はズーム・アウト、右にある場合はズーム・インする。
ただ、png.mqlの変数Cと_Cをprivateからpublicに投げ直す必要があった。そのため、このライブラリがすでにインストールされている場合は上書きする必要がある。
この例には2つの動作モードがある(入力変数bool resize_canvas):
だから、画面全体には1つのキャンバスを使いたいのだ!