aardio 文档

aardio 范例: GDI+ 自绘进度条

import win.ui;
import gdip.graphics;
/*DSG{{*/
var winform = win.form(text="aardio - GDI+ 自绘进度条";right=602;bottom=188;border="none")
winform.add(
plus={cls="plus";text="100%";left=46;top=76;right=550;bottom=116;db=1;dl=1;dr=1;dt=1;font=LOGFONT(h=-16);notify=1;z=1}
)
/*}}*/

// 自绘动画状态
winform.plus.lightPos = -0.5; // 流光位置控制
winform.plus.progress = 0; // 当前进度 0-100

// 核心自绘逻辑
winform.plus.onDrawContent = function(graphics,rc,txtColor,rcContent,foregroundColor,font){
    var progress = owner.progress; 
    var lightPos = owner.lightPos;

    var x,y,w,h = rc.xywh();
    var barW = (progress / 100) * w;
    var radius = h / 2; // 圆角半径

    // 1. 绘制背景槽 (深色半透明)
    var pathBg = gdip.path();
    pathBg.addRoundRect(rc, radius);
    var brushBg = gdip.solidBrush(0x40000000);
    graphics.fillPath(brushBg, pathBg);
    brushBg.delete();

    if(barW > 5){
        // 2. 绘制进度条主体渐变
        var rcBar = ::RECTF(x, y, barW, h);
        var pathBar = gdip.path();
        pathBar.addRoundRect(rcBar, radius);

        // 创建线性渐变:青色 -> 紫色
        var brushBar = gdip.lineBrush(rcBar, 0xFF00f2fe, 0xFF7117ea, 0);
        graphics.fillPath(brushBar, pathBar);


        // 3. 绘制霓虹外发光 (通过多层半透明描边模拟)
        for(i=1; 5){  
            var penGlow = gdip.pen(gdi.ARGB(113, 23, 234,20 - i*3/*Alpha*/), i * 2);
            graphics.drawPath(penGlow, pathBar);
            penGlow.delete();
        }

        // 4. 绘制流光效果 (Sweep Light)
        graphics.setClipPath(pathBar); // 只在进度条内部绘制
        var lightX = x + (lightPos * barW * 2);
        var rcLight = ::RECTF(lightX, y, barW * 0.4, h);
        var brushLight = gdip.lineBrush(rcLight, 0x00FFFFFF, 0x90FFFFFF, 0);
        brushLight.gammaCorrection = true;
        graphics.fillRectangle(brushLight, rcLight);
        brushLight.delete();
        graphics.resetClip();

        brushBar.delete();
        pathBar.delete();
    }

    // 释放资源  
    pathBg.delete();
}

winform.plus.onDrawString = function(graphics,text,font,rectf,strformat,brush){

    var strPercent = math.floor(owner.progress) + "%";

    // 文字阴影
    var brushShadow = gdip.solidBrush(0x80000000); 
    graphics.drawString(strPercent, font,::RECTF(rectf).offset(2,2), strformat, brushShadow);

    // 文字主体
    var brushText = gdip.solidBrush(0xFFFFFFFF);
    graphics.drawString(strPercent, font, rectf, strformat, brushText);

    brushShadow.delete();
    brushText.delete();
}

// 动画逻辑
winform.plus.onAnimation = function(state,beginning,change,timestamp,duration){

    // 流光移动逻辑
    winform.plus.lightPos = winform.plus.lightPos + 0.02;
    if(winform.plus.lightPos > 1.5) winform.plus.lightPos = -0.5;

    // 进度增加逻辑
    winform.plus.progress =  winform.plus.progress + 0.3;
    if( winform.plus.progress > 100)  {
        winform.close(true/*异步*/);
        return;// 返回 null 停止动画
    }

    return state;
}

// 启动动画 (每 20 毫秒刷新一次)
winform.plus.startAnimation(15);

//设为分层透明窗口
import win.ui.layered;
win.ui.layered(winform)

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