aardio 文档

aardio 范例: 滚动条、滑尺控件、微调按钮

//滚动条/滑尺控件
import win.ui;
/*DSG{{*/
var winform = win.form(text="滚动条、滑尺控件、微调按钮";right=438;bottom=203;max=false;parent=...)
winform.add(
editScrollbar={cls="edit";text="1";left=46;top=89;right=119;bottom=114;db=1;dl=1;edge=1;multiline=1;readonly=1;z=4};
editSpin={cls="edit";text="1";left=43;top=137;right=98;bottom=163;align="right";db=1;dl=1;edge=1;multiline=1;z=5};
editTrackbar={cls="edit";text="0.1";left=46;top=41;right=119;bottom=66;align="center";db=1;dl=1;edge=1;readonly=1;z=3};
scrollbar={cls="scrollbar";left=141;top=88;right=375;bottom=118;db=1;dl=1;horz=1;tabstop=1;z=2};
spin={cls="spin";left=77;top=139;right=97;bottom=160;db=1;dl=1;z=6};
trackbar={cls="trackbar";left=135;top=39;right=375;bottom=69;db=1;dl=1;max=0;min=0;z=1}
)
/*}}*/

//指定滑尺(跟踪条)范围
winform.trackbar.setRange(1,50)

winform.trackbar.oncommand = function(id,event,pos){

    /**
    跟踪条的事件ID与滚动条类似,
    例如_TB_ENDTRACK 其实就是滚动条中的 _SB_ENDSCROLL(event的值都是8) 

    在调整跟踪条结束以后,都会触发_TB_ENDTRACK ,
    例如用户拖动滑块以后放开,或按方向箭,翻页箭,鼠标点击等等,

    而拖动滑块时会触发 0x5/*_TB_THUMBTRACK*/
    拖动结束会触发 0x4/*_TB_THUMBPOSITION*/

    仅_TB_THUMBTRACK,_TB_THUMBPOSITION事件中pos的值等于winform.trackbar.pos,
    其他事件中为0,

    **/

    if( event == 0x8/*_TB_ENDTRACK*/ ){ 
        //winform.editTrackbar.text = winform.trackbar.pos;
    } 

    //winform.trackbar.pos的值总是最新的,简单一点可以这样写
    var pos = winform.trackbar.pos;
    winform.editTrackbar.text = pos / 10; //显示为小数
    winform.trackbar.tooltip = pos / 10; //显示为小数,如果没这个需求,这句可删除
}

//自绘- 强行移除滑尺控件获得焦点后显示的虚线框
winform.trackbar.onnotify = function(id,code,ptr){ 
    if( code == 0xFFFFFFF4/*_NM_CUSTOMDRAW*/ ){
        var lvcd = winform.trackbar.getNotifyCustomDraw(code,ptr);
        if( lvcd.dwDrawStage == 1/*_CDDS_PREPAINT*/ ){
            lvcd.uItemState = lvcd.uItemState &  ~0x10/*_CDIS_FOCUS*/;
            lvcd.update();
        }
    }
}

winform.scrollbar.setRange(1,100)
winform.scrollbar.oncommand = function(id,event,pos){ 
    /*
    例如用户拖动滑块以后放开,或按方向箭,翻页箭,鼠标点击等等,
    在调整跟踪条结束以后,都会触发_TB_ENDTRACK ,注意这时候winform.scrollbar.pos值已经更新了,
    而回调参数pos这时候是无效的。
    */
    if( event == 0x8/*_SB_ENDSCROLL*/ ){ 
        winform.editScrollbar.text = winform.scrollbar.pos;
    } 
    else {

        if( event == 0x0/*_SB_LINEUP*/ ){
            winform.scrollbar.pos -= 1
        }
        elseif( event == 0x1/*_SB_LINEDOWN*/ ){
            winform.scrollbar.pos += 1
        }
        elseif( event ==0x5/*_SB_THUMBTRACK*/){  
            winform.scrollbar.pos = pos; //滚动条要存储新刻度
        } 

        winform.editScrollbar.text = winform.scrollbar.pos;
    }
}

/*
指定 spin 控件同步数值的文本框
spin 控件可以放在 buddy(edit控件)内部靠左侧、靠右侧(推荐做法)。

也可以放在buddy(edit控件)外部靠左侧、靠右侧,调整窗口大小时 spin 控件会自动吸附在buddy(edit控件)对应侧。
如果buddy 在外部,建议在 spin 控件构造参数中添加 align="right" 或 align="left"。
*/
winform.spin.buddy = winform.editSpin; 
winform.spin.setRange(1,100); //一定要设置数值的上下限
winform.spin.pos = 1;//设置数值
winform.spin.inc  = 10;//设置每次点击箭头的增减量(步长)

//处理spin事件
winform.spin.oncommand = function(id,event,pos){ 
    if( pos && event == 0x4/*_SB_THUMBPOSITION*/ ){
        winform.text = "spin" + winform.editSpin.text
    }
} 

//处理spin事件通知,将要改变值之前触发
winform.spin.onnotify = function(id,code,ptr){ 
    if(code==0xFFFFFD2E/*_UDN_DELTAPOS*/){
        var nmUpDown = ..raw.convert(ptr, {
            struct hdr = ::NMHDR();
            int pos; //当前位置
            int delta; //位置的增减量,单击向上箭头此值为负数
        } );  
    } 
}

//spin绑定的文本框事件 
winform.editSpin.oncommand = function(id,event){ 
    if( event = 0x200/*_EN_KILLFOCUS*/ ){
        winform.text = "spin" + winform.editSpin.text
    }
}

winform.show() 
win.loopMessage();

Markdown 格式