文章 "研究CCanvas类如何绘制透明的图形对象" - 页 4

 
Artyom Trishkin:
MQL4 ;)

我不欢迎 MQL4。所有示例都只使用 MQL5。

//+------------------------------------------------------------------+
//|测试。mq5
//|版权 © 2016, 弗拉基米尔-卡尔普托夫 ||
//|http://wmua.ru/slesar/ ||
//+------------------------------------------------------------------+
#property copyright "版权归弗拉基米尔-卡尔普托夫 2016 所有
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Canvas\Canvas.mqh>
CCanvas     m_canvas;           // 画布对象
//+------------------------------------------------------------------+
//| 脚本程序启动功能|
//+------------------------------------------------------------------+
void OnStart()
  {
   datetime arr_time[];
   double   arr_open[];
   double   arr_close[];
   if(CopyTime(Symbol(),Period(),0,2,arr_time)==-1)
      return;
   if(CopyClose(Symbol(),Period(),0,2,arr_close)==-1)
      return;
   if(CopyOpen(Symbol(),Period(),0,2,arr_open)==-1)
      return;
   int x1,y1,x2,y2;
   if(!ChartTimePriceToXY(0,0,arr_time[0],arr_open[0],x1,y1))
      Print("Error ",GetLastError());
   if(!ChartTimePriceToXY(0,0,arr_time[1],arr_close[0],x2,y2))
      Print("Error ",GetLastError());
//x1 = Time[1];
//y1 = Open[1];
//x2 = Time[0];
//y2 = Close[1];
   Print("arr_time[0]=",arr_time[0],", arr_open[0]=",arr_open[0]);
   m_canvas.CreateBitmapLabel("COLOR_FORMAT_ARGB_NORMALIZE",x1,y1,MathAbs(x2-x1),MathAbs(y2-y1),COLOR_FORMAT_ARGB_NORMALIZE);
   m_canvas.Erase(ColorToARGB(clrBlue,200));
   m_canvas.Update();
   Sleep(10000);
   m_canvas.Destroy();
  }
//+------------------------------------------------------------------+
//| 获取图表宽度(以像素为单位)|
//+------------------------------------------------------------------+
int ChartWidthInPixels(const long chart_ID=0)
  {
//--- 准备变量以获取属性值
   long result=-1;
//-- 重置错误值
   ResetLastError();
//--- 接收属性值
   if(!ChartGetInteger(chart_ID,CHART_WIDTH_IN_PIXELS,0,result))
     {
      //--- 在专家日志中显示错误信息
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- 返回图表属性的值
   return((int)result);
  }
//+------------------------------------------------------------------+
//| 获取图表的高度(单位:像素
//+------------------------------------------------------------------+
int ChartHeightInPixelsGet(const long chart_ID=0,const int sub_window=0)
  {
//--- 准备变量以获取属性值
   long result=-1;
//-- 重置错误值
   ResetLastError();
//--- 接收属性值
   if(!ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,result))
     {
      //--- 在专家日志中显示错误信息
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- 返回图表属性的值
   return((int)result);
  }
//+------------------------------------------------------------------+

以及脚本的结果:

结果

 

弗拉基米尔,有一个问题想请教您这位专家。

有一个画布形式的面板。然后在图表上绘制趋势线。如何将它们隐藏在画布后面?

MetaTrader 交易平台截图

RTS Splice,上半年,2016.10.16

JSC &#39;&#39;Otkritie Broker&#39;&#39;, MetaTrader 5, 演示版

RTS Splice,上半年,2016.10.16,JSC"'Otkritie Broker'",MetaTrader 5,模拟


 
Dennis Kirichenko:

弗拉基米尔,有一个问题想请教您这位专家。

有一个画布形式的面板。然后在图表上绘制趋势线。如何将它们隐藏在画布后面?


例如,破坏面板并重新绘制它们....。
 
好的,谢谢。到目前为止,我想出了一个办法,就是把对象放在后台....。
[删除]  
Vladimir Karputov:
感谢您的文章。遗憾的是,里面所有的文档链接都坏了。
 
Alexey Kozitsyn:
感谢您的文章。不幸的是,其中的所有文档链接都已损坏。

感谢您的留言--帮助已重建,因此出现了错误。我们将更正链接。

 
Vladimir Karputov:

通过类 CCanvas?

请使用 CCanvas.CreateBitmap

创建绑定到图表对象的图形资源。

1.在当前图表的主窗口中创建图形资源。

bool CreateBitmap(
const string name// name
const datetimetime// 时间
const doubleprice// 价格
constintwidth// width
const int height// height
ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA// 格式
);

这样,您就可以绑定 Canvas 的一个角。但宽度和高度都将以像素为单位设置。


这里可以用俄语写吗?

因为你给了一个人指示 ,但实际上你却奉行双重标准。

 
Alexey Kozitsyn:
感谢您的文章。遗憾的是,文中所有的文档链接都已损坏。
链接已更正。感谢您的留言。
 
Alexey Petrov:
链接已更正。感谢您的留言。

错误仍然存在。

导言段:

...

在开始直接使用CCanvas 类绘制之前,您需要学习一些与颜色处理相关的定义。例如,什么是透明度,什么是 alpha 通道。

...


项目 "5.1 创建脚本 "Illusion.mq5""

...

绘制一个涂色的圆。圆将画在我们填充画布的颜色上(canvas_XRGB_NOALPHA.Erase(ColorToARGB(colr,alpha));)。

canvas_XRGB_NOALPHA.CreateBitmapLabel - 在这里,我们创建了一个绑定到图表对象的图形资源。

具有透明度 alpha 的 ARGB 格式颜色填充整个画布

输出文本- 此画布的图像处理类型。以 ARGB 格式填充文本颜色,alpha 通道等于 255,即输出文本的颜色。

如果我们希望绘制的所有内容都显示在屏幕 上,就需要刷新屏幕

由于我们创建的图形资源绑定到了图表对象(CreateBitmapLabel 方法),因此我们将使用Destroy() 方法删除该资源。

...

 

各位好,请问如何使信息面板 上的交易图标不叠加在上面。

它似乎在前景,所有东西都画在它后面,但交易却叠加在上面。

void CreateEdit(long             chart_id,         // 图表 ID
                int              sub_window,       // 窗口(子窗口)编号
                string           name,             // 对象名称
                color            font_color,       // 字体颜色
                int              x_size,           // 宽度
                int              y_size,           // 高度
                int              x_distance,       // X 轴坐标
                int              y_distance,       // Y 轴坐标
                long             z_order,          // 优先权
                color            background_color) // 背景颜色 
  {
// 如果对象创建成功,那么
   if(ObjectCreate(chart_id,name,OBJ_RECTANGLE_LABEL,sub_window,0,0))
     {
      // ...设置其属性
      ObjectSetInteger(chart_id,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);  // 设置图形的角度
      ObjectSetInteger(chart_id,name,OBJPROP_COLOR,font_color);         // 字体颜色
      ObjectSetInteger(chart_id,name,OBJPROP_BGCOLOR,background_color); // 背景颜色
      ObjectSetInteger(chart_id,name,OBJPROP_XSIZE,x_size);             // 宽度
      ObjectSetInteger(chart_id,name,OBJPROP_YSIZE,y_size);             // 高度
      ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,x_distance);     // 设置 X 坐标
      ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,y_distance);     // 设置 Y 坐标
      ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,false);         如果为 FALSE,则 // 无法选择对象
      ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,z_order);           // 对象优先级
      ObjectSetInteger(chart_id,name,OBJPROP_READONLY,true);            // 只读
      ObjectSetInteger(chart_id,name,OBJPROP_ALIGN,ALIGN_LEFT);         // 左对齐
      //--- 在前景(false)或背景(true)中显示 
    ObjectSetInteger(chart_id,name,OBJPROP_BACK,false); 
      ObjectSetString(chart_id,name,OBJPROP_TOOLTIP,"\n");              // no tooltip if "\n".
     }
  }