【第八章8.7】 窗口控件 -- 滚动条/滑尺控件

贴主:admin 发贴:2024-07-31 08:48 浏量:29

控件: 

 代码:

 // 导入 win.ui 库,用于创建图形界面
import win.ui;  
/*DSG{{*/
// 创建一个名为 winform 的窗口对象,并设置其属性
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=101;top=134;right=128;bottom=162;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*/ ){  
            // 当事件为滚动结束(_SB_ENDSCROLL)时,将滚动条的当前位置设置到编辑框 winform.editScrollbar 中
            winform.editScrollbar.text = winform.scrollbar.pos;  
        }  
        else {  
            // 处理其他滚动相关的事件
            if( event == 0x0/*_SB_LINEUP*/ ){  
                // 当事件为向上滚动(_SB_LINEUP)时,滚动条的位置减 1
                winform.scrollbar.pos -= 1  
            }
            elseif( event == 0x1/*_SB_LINEDOWN*/ ){  
                // 当事件为向下滚动(_SB_LINEDOWN)时,滚动条的位置加 1
                winform.scrollbar.pos += 1  
            }
            elseif( event ==0x5/*_SB_THUMBTRACK*/){  
                // 当事件为拖动滚动条滑块(_SB_THUMBTRACK)时,将滚动条的位置设置为新的位置 pos
                winform.scrollbar.pos = pos; // 滚动条要存储新刻度  
            }  
            // 将滚动条的当前位置设置到编辑框 winform.editScrollbar 中
            winform.editScrollbar.text = winform.scrollbar.pos;  
        }
}

/*
指定微调按钮控件同步数值的文本框
微调按钮控件可以放在伙伴(编辑控件)内部靠左侧、靠右侧(推荐做法)。

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

// 处理微调按钮的命令事件
winform.spin.oncommand = function(id,event,pos){  
    // 当 pos 不为空且事件为 0x4(_SB_THUMBPOSITION)时
    if( pos && event == 0x4/*_SB_THUMBPOSITION*/ ){  
        // 设置窗口的文本为 "spin" 加上与微调按钮绑定的文本框 winform.editSpin 的文本
        winform.text = "spin" + winform.editSpin.text  
    }
}  

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

// 处理与微调按钮绑定的文本框的命令事件
// 当事件为失去焦点(_EN_KILLFOCUS)时
if( event = 0x200/*_EN_KILLFOCUS*/ ){  
    // 设置窗口的文本为 "spin" 加上文本框 winform.editSpin 的文本
    winform.text = "spin" + winform.editSpin.text  
}

// 显示窗口
winform.show()  
// 启动界面线程消息循环
win.loopMessage();

界面演示效果:

微调控件:

相关回复


    暂无评论!

发表回复