帆布很酷! - 页 44

 
Nikolai Semko:

这些函数写得很糟糕,令人发指。这是一个地狱般的东西。没有正常的抗锯齿,没有正常的颜色混合和透明度处理。我们应该把它们揉成一团,扔进垃圾桶,然后写新的。
我以前在这里 写过这个问题。

在任何情况下,你肯定应该用这个函数来取代标准的PixelTransform函数。

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

我开始写我的双倍版本(其中所有的int输入参数都是双倍的),但没有完成,把它放在了架子上。尽管表面上很简单,但不是一项非常简单的任务。好吧,准确地写出来不是问题,问题是要写出很高的质量,要让算法快速。我的主要问题是完美主义。

我明白了,他们还没有完成)

我不太可能被诱惑去重写整个画布。我将不得不并排画2个单像素的,而不是暂时画1个双像素的 )

 
Andrey Khatimlianskii:

我明白了,他们没有完成它)。

我不可能被诱惑去重写整个画布。我只是要画2个并排的单像素的,而不是1个双像素的)。

实际上,你不需要重写整个画布。最主要的是要做一个圆的格式

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

并使线条正常。

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

这应该能满足你95%的需求

 

关于交易、自动交易系统和测试交易策略的论坛

如何将所有对象转换为1个对象

Nikolai Semko, 2019.10.05 22:39

事实上,Canvas就是解决方案。

而Canvas比乍看之下要容易得多。

下面是一个指标的原始例子(MQL5 & MQL4),其中有一个对象OBJ_BITMAP_LABEL,其中有许多窗口。

#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:

很好!

我真的需要这个功能,并且能够在这些迷你窗口中绘制我自己的指标。

为什么一个窗口藏在另一个窗口下面,而另一个窗口却躺在上面,你能解决吗?

另一个问题,如果在不同的图表上运行同一个指标,它是否会工作?事件不会像标准库中那样重叠?

而如果两个窗口都有相同的坐标,哪个窗口会被鼠标拖动?

是否可以用鼠标调整窗口的大小?

 
Sergey Chalyshev:

很好!

我真的需要这个功能,并且能够在这些迷你窗口中绘制我自己的指标。

为什么一个窗口藏在另一个窗口下面,而另一个窗口却躺在上面,你能解决吗?

另一个问题,如果在不同的图表上运行同一个指标,它是否会工作?事件不会像标准库中那样重叠?

而如果两个窗口都有相同的坐标,哪个窗口会被鼠标拖动?

是否可以用鼠标调整窗口的大小?

这个例子简单地实现了窗口资历。实际上,win结构数组中的索引越小,虚拟窗口层就越低。

你可以用你想要的任何方式来实现它。例如,如果我们 "抓住 "一个窗口,它就会成为屏幕上和数组中最上面的一个。

你也可以实施透明化。我在这里 向你展示了如何做到这一点。(在那里有必要对每个piskel进行处理)。

另一张图表也可以在另一张上运行。
如果坐标相同,就拖动上面的那个。

使用kanvas,你可以在你的窗口和其他MT窗口内做任何事情。
此外,你可以将一个窗口从MT5中分离出来,让它自由浮动,甚至在显示器之间。 你可以在这里 看到它。

 
Nikolai Semko:

这个例子简单地实现了窗口资历。本质上,win结构数组中的索引越小,虚拟窗口层就越低。

你可以用任何你喜欢的方式来实现它。例如,如果一个窗口被 "抓住 "了,那么它就成为屏幕上和数组中最上层的一个。

你也可以实施透明化。我在这里 向你展示了如何做到这一点。(在那里你必须处理每个piskel)。

也可以在另一个图表上运行。
如果坐标相同,就拖动上面的那个。

使用kanvas,你可以在你的窗口和其他MT窗口内做任何事情。
此外,该窗口可以与МТ5分离,并移动到显示器之间的自由浮动区。 你可以在这里 看到它。

略有不妥,可能是没有正确地提出问题。

在一个程序中组织几个窗口(脚本、指标)并不困难。

我想做一个指标,在图表上以自己的小窗口显示数据。这个窗口可以舒适地放在图表中,你可以用鼠标拖动它,用鼠标调整窗口的大小(这是可取的,但你还是可以这样做)。我们必须在图表中运行几个指标,每个指标都有自己的参数。我还没有想出如何使不同指标的事件不重叠,并且指标对鼠标事件有足够的反应。我还没有决定哪个更好,更简单,画布和物体。在标准的Dialog库中没有任何东西可以使用。

 
Sergey Chalyshev:

...还是想不出如何使不同指标的事件不重叠...

最简单的方法是在属性窗口中设置一个字符串变量,将其添加到图形对象的名称中。

 
Dmitry Fedoseev:

最简单的方法是在属性窗口中设置一个字符串变量,将其添加到图形对象的名称中。心灵在真理和成员之间纠结?

自然,这就是我所做的。问题是用鼠标拖放。如果物体具有相同的坐标,则其中一个正好在另一个下面。当你点击它们时,哪一个会有反应?

你说的是什么俱乐部,我没有报名参加任何俱乐部,也不打算参加))

p.s. 你能给我看一个例子吗?

 
Sergey Chalyshev:

自然,我也是如此。问题是用鼠标拖动和下拉。如果两个物体的坐标相同,则其中一个正好在另一个下面。当你点击它们时,哪一个会有反应?

你说的是什么俱乐部,我没有报名参加任何俱乐部,也不打算参加))

p.s. 你能给我看一个例子吗?

错误的俱乐部,对不起...我受够了这个俱乐部))。

某个对象会做出反应。也许在激活一个物体时,改变它的Z轴顺序,使它比其他所有人都高。我们应该试试。

 
Sergey Chalyshev:

自然,我也是如此。问题是用鼠标拖动和下拉。如果两个物体的坐标相同,则其中一个正好在另一个下面。当你点击它们时,哪一个会有反应?

你说的是什么俱乐部,我没有报名参加任何俱乐部,也不打算参加))

p.s. 你能给我看一个例子吗?

一般来说,在这种情况下,最后被移动的物体应该做出反应--它在上面...