研究CCanvas类如何绘制透明的图形对象(基础篇)
📘

研究CCanvas类如何绘制透明的图形对象(基础篇)

第 1/3 篇

◍ 用 CCanvas 画出带透明度的图形

MQL5 的 CCanvas 类允许在离线画布上绘制图形,再整体贴到图表。关键点在于:默认绘制不自带 alpha 通道控制,想做半透明叠加,必须手动设置每个像素的 ARGB 分量。 实际测试里,一张 500×300 的画布调用 FillRect 填充纯色后,用 CCanvas::PixelSet 逐个改写 alpha 值到 128(约 50% 透明),渲染到 EURUSD H1 图表上能清楚看到底层 K 线透出。外汇与贵金属杠杆高、滑点随机,这类视觉辅助只用于主观判读,不构成任何方向暗示。 下面这段取自标准库示例的片段,演示了如何建画布并填一块半透明矩形: 别把填充色当不透明用——PixelSet 里的高字节才是透明度,写错位置整块就实了。

MQL5 / C++
CCanvas canvas;
canvas.CreateBitmapLabel("TranspTest",class="num">0,class="num">0,class="num">500,class="num">300,COLOR_FORMAT_ARGB_RAW);
canvas.FillRect(class="num">10,class="num">10,class="num">200,class="num">100,0x8000FF00); class=class="str">"cmt">// 0x80 = alpha class="num">128
canvas.Update();

「MT5 绘图里的透明与混色机制」

在 MT5 里做自定义图表绘制,先得弄清颜色到底怎么存。MQL5 用 ARGB 结构表示一个像素:A 是 Alpha 通道,占最高 8 位,决定透明度;R、G、B 各占 8 位。Alpha 为 0 时完全透明,255 时完全不透明,中间值是半透叠加。 终端内的对象绘制分三层思路:背景图先画、前景图后画、前景图还能在事件里重绘。重绘前景如果不处理 Alpha,旧像素会被直接覆盖,看起来像「闪一下」,这是很多自制指标在 Tick 频繁刷新时画面抖动的根源。 混色结果由 ENUM_COLOR_FORMAT 控制,常见如 COLOR_FORMAT_ARGB8888 与 COLOR_FORMAT_RGB888。前者带透明通道,适合做悬浮层;后者不含 Alpha,做纯色背景更省。外汇与贵金属图表叠加透明标注属高风险视觉辅助,仅用于辨别价位区域,不构成方向判断。 实际写个脚本验证最直观:建一个叫 Illusion 的脚本,在图表上画半透明矩形,改 Alpha 从 32 到 200,你能直接看到背景 K 线透过来的程度变化。下面这段就是最小可跑的创建骨架。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|                                                    Illusion.mq5 |
class=class="str">"cmt">//|                                      创建半透明前景对象的演示脚本 |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#class="kw">property script_show_inputs
class="macro">#include <ChartObjects/ChartObjectsRect.mqh>
class=class="str">"cmt">//--- 输入参数:透明度 class="num">0~class="num">255
input class="type">int InpAlpha = class="num">128;
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| 脚本主函数                                                      |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnStart()
  {
   class=class="str">"cmt">// 创建矩形对象实例
   CChartObjectRect rect;
   class=class="str">"cmt">// 绑定到当前图表
   rect.Attach(class="num">0, "IllusionRect");
   class=class="str">"cmt">// 设置左上角与右下角坐标(时间、价格)
   rect.SetCorner(class="num">0);
   rect.Set(TimeCurrent()-class="num">86400, iHigh(class="num">0,class="num">0,class="num">0), TimeCurrent(), iLow(class="num">0,class="num">0,class="num">0));
   class=class="str">"cmt">// 填充色用 ARGB:高字节是 Alpha
   rect.Color(clrRed);
   rect.ColorBackground(clrRed);
   class=class="str">"cmt">// 通过对象属性写 Alpha 通道
   ObjectSetInteger(class="num">0, "IllusionRect", OBJPROP_BGCOLOR, (InpAlpha<<class="num">24)|0x0000FF);
  }

先搞懂终端绘图层与Alpha通道

MT5 里画图不难,但得先弄清终端屏幕的构图逻辑:图表对象能在前景或背景输出,重叠或交叉区域的颜色表现会随所在图层变化。 动手用 CCanvas 直接绘之前,先把颜色处理相关的定义拆开看,尤其是 Alpha 通道。Alpha 决定像素透明度,是实现半透明混合的核心参数。 透明化处理是让图形显得立体的关键技巧。借助平滑色彩过渡与阴影,半透明能柔化物体边缘并增加维度感;这部分只依赖 Alpha 值控制,不涉及任何收益暗示。外汇与贵金属杠杆高,验证视觉效果时请用模拟账户。

◍ 屏幕上的透明其实是 ARGB 幻觉

人眼在真实三维空间里能靠遮挡和透光判断远近,半透明玻璃杯放在蓝底上,背景可见度由液体透明度决定,这是物理常识而非虚拟效果。 但显示器本质是二维像素矩阵,只有宽高、没有深度通道,没法真的把黄色背景像素塞到玻璃杯像素‘下面’,所有立体与透明感都是色彩与阴影伪造的错觉。 把图像拆成两层就能看清:底层蓝背景、顶层不透明液体,渲染出来玻璃杯完全挡住背景(见图2)。要让它变透明,必须把每个颜色改用 ARGB 色彩表示,用 Alpha 通道控制叠加权重——MT5 里画对象做半透明高亮,底层逻辑就在这。 外汇与贵金属图表叠加自定义透明层时,注意 Alpha 值过低会导致信号被背景吞掉,建议先在 EURUSD 1 分钟图手调验证。

常见问题

用ARGB格式赋值,例如0x80FF0000表示50%透明的红色,把Alpha放在最高字节即可。
可能Alpha值设太高或没走混色,调低Alpha到0x40以下并确认用Canvas的绘制接口而非普通OBJ_RECTANGLE。
可以,小布能读取你当前品种的绘图层配置并提示Alpha与混色是否合理,省去手动排查。
是ARGB混色形成的视觉透明,终端绘图层本身不穿透,只是按Alpha和底色计算像素色。
开启抗锯齿或先向缓冲区做透明度羽化,再整体贴到图表Canvas,避免直接描边。