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

 
弗拉基米尔,我不擅长画布....。

我在画布上绘制了不同的形状,并将它们叠加在一起。如何在不混合的情况下使颜色保持 原样?

我设置了 COLOR_FORMAT_XRGB_NOALPHA,但还是发生了混合:-(((.......

不过,我有一个变种。在 CDialog 类型的对话框中附加了一张 CPicture 类型的图片。它与 CCanvas 类型的资源相连。后者是在没有绑定到窗口的情况下创建的。

 
Dennis Kirichenko:
弗拉基米尔,我不擅长画布....。 我在画布上绘制了不同的形状,并将它们叠加在一起。如何在不混合的情况下使

颜色保持 原样?

我设置了 COLOR_FORMAT_XRGB_NOALPHA,但还是发生了混合 :-(((

...

克纳瓦斯

画布上绘制的颜色(我们称之为 "顶部 "或最后的颜色)会取代之前在画布上绘制的颜色。

//+------------------------------------------------------------------+
//|canvas+xor.mq5
//|版权 © 2015, Vladimir Karputov | |
//|http://wmua.ru/slesar/ ||
//+------------------------------------------------------------------+
#property copyright "版权 © 2015 年,弗拉基米尔-卡尔普托夫"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property description "The script draws overlapping areas on canvas"
//--- 启动脚本时显示输入参数窗口
#property script_show_inputs
#include <Canvas\Canvas.mqh>
//--- 输入
input uchar alfa=150;         // alpha 通道管理颜色透明度
//--- 图表的宽度和高度可变。
int            ChartWidth=-1;
int            ChartHeight=-1;
//+------------------------------------------------------------------+
//| 脚本程序启动功能|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 图表的宽度和高度
   ChartWidth=ChartWidthInPixels();
   ChartHeight=ChartHeightInPixelsGet()-50;

//--- 创建画布 COLOR_FORMAT_XRGB_NOALPHA
   CCanvas canvas_XARGB_NORMALIZE;
   if(!canvas_XARGB_NORMALIZE.CreateBitmapLabel("canvas_XARGB_NORMALIZE",0,0,
      ChartWidth,ChartHeight,COLOR_FORMAT_ARGB_NORMALIZE))
     {
      Print("Error creating canvas: ",GetLastError());
      return;
     }
   canvas_XARGB_NORMALIZE.Erase(ColorToARGB(clrAqua,255));
//--- 创建一个矩形 #1
   canvas_XARGB_NORMALIZE.FillRectangle(ChartWidth/20,ChartHeight/20,
                                        10*ChartWidth/20,10*ChartHeight/20,
                                        ColorToARGB(clrBlue,alfa));
   canvas_XARGB_NORMALIZE.Update();
//--- 等待 3 秒钟
   Sleep(3000);
//--- 创建一个矩形 #2
   canvas_XARGB_NORMALIZE.FillRectangle(7*ChartWidth/20,7*ChartHeight/20,
                                        16*ChartWidth/20,16*ChartHeight/20,
                                        ColorToARGB(clrGreen,alfa));
   canvas_XARGB_NORMALIZE.Update();
//--- 等待 3 秒钟
   Sleep(3000);
  }
//+------------------------------------------------------------------+
//| 图表属性宽度|
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
附加的文件:
 

弗拉基米尔,非常感谢!

我刚刚忽略了 ColorToARGB() 的转换。

 
Dennis Kirichenko:

弗拉基米尔,非常感谢!

我只是忽略了 ColorToARGB() 的转换。

不客气 :) 。
 
你好,我认为这篇文章非常出色。我有一个问题,如何在屏幕上以 x1、x2、y1、y2 为坐标创建一个矩形:

x1 = 时间[1]

x2 = 时间[0]

y1 = 打开[1]

y2 = 关闭[1]
 
Jorge Fernando De Los Ríos De Los Ríos:
你好,我认为这篇文章非常出色。我有一个问题,如何在屏幕上以 x1、x2、y1、y2 为坐标创建一个矩形:

x1 = 时间[1]

x2 = 时间[0]

y1 = 打开[1]

y2 = 关闭[1]

通过类 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 的一个角。但宽度和高度都将以像素为单位设置。

 

让我们做一个更简单的练习。我想让一个圆随价格移动,但为什么它不在 Y 轴上移动呢?

代码如下

void OnStart()
  {
   int ChartWidth=ChartWidthInPixels();
   int ChartHeight=ChartHeightInPixelsGet();

   CCanvas pepe;

   int t1,t0,p1,p0;
   ChartTimePriceToXY(0,0,Time[1],Open[1],t1,p1);
   ChartTimePriceToXY(0,0,Time[0],Close[1],t0,p0);

   pepe.CreateBitmapLabel("canvas_XRGB_NOALPHA",0,0,ChartWidth,ChartHeight,COLOR_FORMAT_ARGB_RAW);
   pepe.Erase(0);
   pepe.FillCircle(t0,p0,25,ColorToARGB(clrBlue,255));
   pepe.Update();
   return(rates_total);
  } 
 
Jorge Fernando De Los Ríos De Los Ríos:

让我们做一个更简单的练习。我想让一个圆随价格移动,但为什么它不在 Y 轴上移动呢?

代码如下

这个脚本没有经过编译。其中错误百出。
 
Jorge Fernando De Los Ríos De Los Ríos:

让我们做一个更简单的练习。我想让一个圆随价格移动,但为什么它不在 Y 轴上移动呢?

代码如下

"时间[]"、"收盘价[]"- 的错误。MQL5 中没有此类变量!
 
Karputov Vladimir:
"时间[]"、"关闭[]"- 错误。MQL5 中没有此类变量!
MQL4 ;)