【第八章8.7】 窗口控件 -- 滚动条/滑尺控件
控件:
代码:
// 导入 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();
界面演示效果:
微调控件:
相关回复
-
暂无评论!