研究 CCanvas 类。抗锯齿和阴影·综合运用
(3/3)· 从坐标分数着色到高斯模糊类封装,补齐动态绘图的最后一块拼图
「把缓冲像素搬进画布阴影层」
这段逻辑做一件事:把算好的 RGBA 分量按目标坐标写回画布,再让阴影层刷新。先是用三行把边界行(Y 处于 radius-1 那一行)的 r/g/b 数据从下一行偏移位置复制过来,等于给阴影底部做了一层硬切边。 随后两个循环负责封装与落盘。第一个循环把 a1/r1/g1/b1 四个数组按 ARGB 宏拼成 clr_temp,写进 res_data[i];第二个按 res_width、res_height 遍历,只处理 Y 从 radius 到 res_height-radius 的区间,用 CanvasShadow.PixelSet 把像素点直接打到画布上。 最后三行是实打实的刷新与停顿:CanvasShadow.Update() 和 CanvasDraw.Update() 各调一次,把离屏缓冲推到屏幕;Sleep(21000) 让线程挂起 21 秒,相当于每轮阴影重绘后强制歇 21 秒——在 MT5 指标里跑这段,你能直接看到阴影每 21 秒才动一次,调小这个值帧率就上去了,但 CPU 占用会跟着涨。外汇与贵金属图表叠加自绘层本身不影响报价,但高频 Update 在低端机可能卡顿,属低风险技术副作用。
r_data[XY]=r_data[(Y+class="num">1)*res_width-radius-class="num">1]; g_data[XY]=g_data[(Y+class="num">1)*res_width-radius-class="num">1]; b_data[XY]=b_data[(Y+class="num">1)*res_width-radius-class="num">1]; } class=class="str">"cmt">//--- for(class="type">int i=class="num">0;i<size;i++) { clr_temp=ARGB(a1_data[i],r1_data[i],g1_data[i],b1_data[i]); res_data[i]=clr_temp; } for(class="type">uint X=class="num">0;X<res_width;X++) { for(class="type">uint Y=radius;Y<res_height-radius;Y++) { XY=Y*res_width+X; CanvasShadow.PixelSet(X,Y,res_data[XY]); } } CanvasShadow.Update(); CanvasDraw.Update(); Sleep(class="num">21000);
画布分层与高斯模糊阴影的实现思路
CGauss 类在 MT5 自定义指标或脚本里负责把带阴影的图形画到画布上。它支持垂直线、水平线、任意线、折线、多边形、矩形、圆,以及对应的实心填充版本和文本阴影,共 14 种基本图元类型,覆盖大多数界面标注需求。 底层实现依赖 ALGLIB 数值分析库计算阴影颜色,目前只内置一种阴影方向:右下方偏移。类的一般做法是开两块画布,尺寸都等于图表大小,底层专门画阴影,上层作为工作层画正常图形说明。 底层画布在创建时按阴影位移量在水平和垂直方向整体平移,这样上层图元坐标无需额外换算就能直接映射到阴影层。绘制算法按模糊半径循环在底层画多次,每次颜色用高斯权重从设定阴影色渐变到全透明,层数越多边缘越软。 想验证这套机制,直接跑 Blur.mq5 脚本看视频 2 的演示即可,外汇与贵金属图表叠加多层阴影时注意显卡负载偏高属正常现象,此类自定义绘制不改变行情本身、交易仍属高风险。
◍ 一点提醒
CCanvas 里的抗锯齿、模糊与阴影算法已经跑通,ALGLIB 数值库介入了色调与模糊核的计算,CGauss 类则封装了高斯基本阴影的绘制例程。附带的 blur.mq5、shadowtwolayers.mq5 等文件里,shadowtwolayers.mq5 体积 13.28 KB,是其中最大的可直接编译样本。 评论区有用户反馈:用 Canvas 画 150 点大字体、7 行多行日志标签,优化后仍需 101 秒,比一分钟略长,说明大批量文本描边在 MT5 端仍有算力瓶颈。 外汇与贵金属图表美化属于界面层辅助,不改入场逻辑;这类自定义绘制在实盘高波动时可能增加终端负载,倾向只在闲时或模拟端验证。