//--- 画布的宽度和高度(绘图发生的画布)
#define IMG_WIDTH 200
#define IMG_HEIGHT 200
//--- 在运行脚本之前,显示一个包含参数的窗口
#property script_show_inputs
//--- 提供设置颜色格式的功能
input ENUM_COLOR_FORMAT clr_format=COLOR_FORMAT_XRGB_NOALPHA;
//--- 用于渲染的数组(缓冲区)
uint ExtImg[IMG_WIDTH*IMG_HEIGHT];
//+------------------------------------------------------------------+
//| 脚本程序起始函数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 创建OBJ_BITMAP_LABEL对象以进行绘图
ObjectCreate(0,"CLOCK",OBJ_BITMAP_LABEL,0,0,0);
//--- 设置要在CLOCK对象中呈现的图形资源的名称
ObjectSetString(0,"CLOCK",OBJPROP_BMPFILE,"::IMG");
//--- 辅助变量
double a; // 箭头角度
uint nm=2700; // 分钟计数器
uint nh=2700*12; // 小时计数器
uint w,h; // 用于获取文本字符串大小的变量
int x,y; // 用于计算文本字符串锚点当前坐标的变量
//--- 以无限循环的方式旋转时钟指针,直到脚本停止
while(!IsStopped())
{
//--- 清除时钟绘图缓冲区数组
ArrayFill(ExtImg,0,IMG_WIDTH*IMG_HEIGHT,0);
//--- 设置在表盘上绘制数字的字体
TextSetFont("Arial",-200,FW_EXTRABOLD,0);
//--- 画表盘
for(int i=1;i<=12;i++)
{
//--- 在表盘上获取当前小时的大小
TextGetSize(string(i),w,h);
//--- 计算表盘上当前小时的坐标
a=-((i*300)%3600*M_PI)/1800.0;
x=IMG_WIDTH/2-int(sin(a)*80+0.5+w/2);
y=IMG_HEIGHT/2-int(cos(a)*80+0.5+h/2);
//--- 将此小时输出到ExtImg[]缓冲区中的表盘
TextOut(string(i),x,y,TA_LEFT|TA_TOP,ExtImg,IMG_WIDTH,IMG_HEIGHT,0xFFFFFFFF,clr_format);
}
//--- 设置绘制分针的字体
TextSetFont("Arial",-200,FW_EXTRABOLD,-int(nm%3600));
//--- 获取分针的大小
TextGetSize("----->",w,h);
//--- 计算表盘上分针的坐标
a=-(nm%3600*M_PI)/1800.0;
x=IMG_WIDTH/2-int(sin(a)*h/2+0.5);
y=IMG_HEIGHT/2-int(cos(a)*h/2+0.5);
//--- 将分针输出到ExtImg[]缓冲区中的表盘
TextOut("----->",x,y,TA_LEFT|TA_TOP,ExtImg,IMG_WIDTH,IMG_HEIGHT,0xFFFFFFFF,clr_format);
//--- 设置绘制时针的字体
TextSetFont("Arial",-200,FW_EXTRABOLD,-int(nh/12%3600));
TextGetSize("==>",w,h);
//--- 计算表盘上时针的坐标
a=-(nh/12%3600*M_PI)/1800.0;
x=IMG_WIDTH/2-int(sin(a)*h/2+0.5);
y=IMG_HEIGHT/2-int(cos(a)*h/2+0.5);
//--- 将时针输出到ExtImg[]缓冲区中的表盘
TextOut("==>",x,y,TA_LEFT|TA_TOP,ExtImg,IMG_WIDTH,IMG_HEIGHT,0xFFFFFFFF,clr_format);
//--- 更新图形资源
ResourceCreate("::IMG",ExtImg,IMG_WIDTH,IMG_HEIGHT,0,0,IMG_WIDTH,clr_format);
//--- 强制图表更新
ChartRedraw();
//--- increase the hour and minute counters
nm+=60;
nh+=60;
//--- 在两帧之间稍作停顿
Sleep(10);
}
//--- 脚本完成时删除CLOCK对象
ObjectDelete(0,"CLOCK");
//---
}
|