aardio 文档

aardio 范例: 桌面圆形时钟

import win.ui;
/*DSG{{*/
var winform = win.form(text="桌面圆形时钟";right=284;bottom=251)
winform.add(
clockFace={cls="plus";left=7;top=10;right=277;bottom=240;db=1;dl=1;dr=1;dt=1;font=LOGFONT(name='Arial Narrow');forecolor=0xE9FFE9;z=1}
)
/*}}*/

// 自定义绘制时钟
winform.clockFace.onDrawContent = function(graphics,rc,txtColor,rcContent,foregroundColor,font){

    // 获取控件窗口当前 DPI 缩放后的 1 像素宽高,用于调整刻度线宽度等
    var dpiX, dpiY = owner.dpiScale(1, 1);

    var centerX = rc.width() / 2;
    var centerY = rc.height() / 2;
    var radius = math.min(centerX, centerY);

    // 绘制圆形背景
    var brush = gdip.solidBrush(foregroundColor);
    graphics.fillEllipse(brush, ::RECT2(centerX - radius, centerY - radius, radius * 2, radius * 2));
    brush.delete(); // 释放画刷资源

    radius = radius - 10 * dpiX; // 钟盘半径,留出一些边距

    // 获取当前时间
    var now = time();
    var hour = now.hour % 12; // 转换为12小时制
    var minute = now.minute;
    var second = now.second;
    var milliseconds = now.milliseconds; 

    // 绘制时钟刻度 (分钟刻度)
    var hourMarkInnerOffset = 35; // 小时刻度内侧
    var hourMarkOuterOffset = 10; // 小时刻度外侧
    var minuteMarkInnerOffset = 25; // 分钟刻度内侧
    var minuteMarkOuterOffset = 10; // 分钟刻度外侧

    var hourMarkWidth = 4; // 小时刻度线宽度
    var minuteMarkWidth = 1; // 分钟刻度线宽度

    for(i = 0; 59; 1) { // 循环60次,绘制60个刻度
        var angle = i * 6 * math.pi / 180; // 每分钟6度

        var currentInnerOffset = minuteMarkInnerOffset;
        var currentOuterOffset = minuteMarkOuterOffset;
        var currentMarkWidth = minuteMarkWidth;

        if (i % 5 == 0) { // 每5个刻度(即小时刻度)
            currentInnerOffset = hourMarkInnerOffset;
            currentOuterOffset = hourMarkOuterOffset;
            currentMarkWidth = hourMarkWidth;
        }

        var pen = gdip.pen(0xFF000000, currentMarkWidth); // 黑色画笔
        var x1 = centerX + (radius - currentInnerOffset) * math.cos(angle - math.pi/2);
        var y1 = centerY + (radius - currentInnerOffset) * math.sin(angle - math.pi/2);

        var x2 = centerX + (radius - currentOuterOffset) * math.cos(angle - math.pi/2);
        var y2 = centerY + (radius - currentOuterOffset) * math.sin(angle - math.pi/2);
        graphics.drawLine(pen, x1, y1, x2, y2);
        pen.delete(); // 释放画笔资源
    }

    // 绘制小时数字
    var numberBrush = gdip.solidBrush(0xFF000000); // 数字颜色 (黑色)
    var strformat = gdip.stringformat();
    strformat.align = 1; // 水平居中
    strformat.lineAlign = 1; // 垂直居中

    var numberRadius = radius - 65; // 数字距离圆心的距离 (调整以适应字体大小)

    for(h = 1; 12; 1) { // 循环12次,绘制1-12的数字
        var displayHour = h;
        // 计算数字的角度,12点在顶部 (-math.pi/2)
        var hourAngle = (h % 12) * 30 * math.pi / 180 - math.pi/2;

        var textX = centerX + numberRadius * math.cos(hourAngle);
        var textY = centerY + numberRadius * math.sin(hourAngle);

        // 为数字创建一个小的矩形区域,用于drawString的布局
        var textRectWidth = 60; // 预估数字文本的宽度
        var textRectHeight = 60; // 预估数字文本的高度
        var textRect = ::RECTF(textX - textRectWidth/2, textY - textRectHeight/2, textRectWidth, textRectHeight);

        graphics.drawString(tostring(displayHour), font, textRect, strformat, numberBrush);
    }

    // 释放画刷和字符串格式资源
    numberBrush.delete();
    strformat.delete();

    // 绘制时针
    // 时针角度:(小时 + 分钟/60) * 30度
    var hourAngle = (hour + minute/60) * 30 * math.pi / 180;
    var hourPen = gdip.pen(0xFF000000, 6); // 黑色,6像素宽
    var hourX = centerX + (radius * 0.5) * math.cos(hourAngle - math.pi/2);
    var hourY = centerY + (radius * 0.5) * math.sin(hourAngle - math.pi/2);
    graphics.drawLine(hourPen, centerX, centerY, hourX, hourY);
    hourPen.delete(); // 释放画笔资源

    // 绘制分针
    // 分针角度:(分钟 + 秒/60) * 6度
    var minuteAngle = (minute + (second + milliseconds/1000) / 60) * 6 * math.pi / 180;
    var minutePen = gdip.pen(0xFF000000, 4); // 黑色,4像素宽
    var minuteX = centerX + (radius * 0.65) * math.cos(minuteAngle - math.pi/2);
    var minuteY = centerY + (radius * 0.65) * math.sin(minuteAngle - math.pi/2);
    graphics.drawLine(minutePen, centerX, centerY, minuteX, minuteY);
    minutePen.delete(); // 释放画笔资源

    // 绘制秒针
    var secondAngle = (second + milliseconds/1000) * 6 * math.pi / 180;
    var secondPen = gdip.pen(0xFFFF0000, 2); // 红色,2像素宽
    var secondX = centerX + (radius * 0.7) * math.cos(secondAngle - math.pi/2);
    var secondY = centerY + (radius * 0.7) * math.sin(secondAngle - math.pi/2);
    graphics.drawLine(secondPen, centerX, centerY, secondX, secondY);
    secondPen.delete(); // 释放画笔资源

    // 绘制中心点
    var centerBrush = gdip.solidBrush(0xFF000000); // 黑色画刷
    graphics.fillEllipse(centerBrush, centerX - 5, centerY - 5, 10, 10);
    centerBrush.delete(); // 释放画刷资源

    return true; // 阻止继续绘制前景色或前景图像,因为我们已经完全自定义了绘制内容
}

// 设置定时器更新时钟,间隔越小则移动越平滑占用 CPU 也越大。
winform.setInterval(250, function(){
    winform.clockFace.redraw(); // 重绘时钟
});

//使窗口背景透明
import win.ui.layered;
win.ui.layered(winform);

//允许拖动窗体
winform.onMouseDown  = function(wParam,lParam){
    winform.hitCaption()    
}

//右键菜单
import win.ui.menu;
winform.wndproc = {
    [0x204/*_WM_RBUTTONDOWN*/] = function(hwnd,message,wParam,lParam){ 
        var menu = win.ui.popmenu(winform);
        menu.add("退出",function(){
            winform.close();
        });
        menu.popup();
    }
}

winform.show();
win.loopMessage();
Markdown 格式