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 个对象
Nikolai Semko, 2019.10.05 22:39
的确,画布就是解决方案。
而且,Canvas 比乍看起来要简单得多。
下面是一个指标的原始示例(MQL5 & MQL4),其中有一个对象 OBJ_BITMAP_LABEL,该对象中有许多窗口。
在这篇新文章中,您将看到实现信息面板的另一种选择。
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 从私有重新扔到公有。因此,如果已经安装了该库,则需要将其覆盖。
本示例有两种操作模式(输入变量 bool resize_canvas):
这就是为什么我更喜欢在整个屏幕上使用一个画布!