运行效果如图:
设计要点,难点介绍:
一、滚动条使用4个statictext控件组成。
二、滚动控制
通过dw的maxPOS ,滑块与滑槽相对的移动,来换算滚动的pos值
long ll_pos
long ll_maxpos
ll_maxpos = long(idw_parent.Describe("DataWindow.HorizontalScrollMaximum"))
ll_pos = ll_maxpos * ( il_vpos - il_minpos ) / ( il_maxpos - il_minpos )
idw_parent.Object.DataWindow.HorizontalScrollPosition = ll_pos
三、滑块的控制,需要用到3个事件
pbm_lbuttondown
pbm_lbuttonup
pbm_mousemove
还需要一个变量 ib_clicked,来保存鼠标左键状态
鼠标左键按下,ib_clicked=true
鼠标左键弹起,ib_clicked=false
pbm_mousemove事件:
ib_clicked=true时,通过xpos/ypos移动的相对距离,来控制dw的滚动。
long ll_x
if ib_clicked = true then
ll_x = st_slider.x
ll_x += xpos - il_stpos
if ll_x < il_minpos then
st_slider.x = il_minpos
elseif ll_x > il_maxpos then
st_slider.x = il_maxpos
else
st_slider.x = ll_x
end if
il_vpos = st_slider.x
post event ue_vscroll()
end if
补充四:
滚动条显示和隐藏的自动判断,比如当前dw只有一页内容需要隐藏滚动条。
1、首先在之前创建的自定义对象中创建一个事件,用来判断是否需要显示滚动条,
//水平方向的判断
if long(idw_parent.Describe("DataWindow.VerticalScrollMaximum")) > 0 then
visible = true
else
visible = false
end if
2、然后在DW的自定义事件 pbm_hscroll 和pbm_vscroll 中触发它,这样新增/删除行、拉取数据、过滤数据,都会触发这个事件,这样就实现了自动显示和隐藏滚动条的效果。
补充五:
鼠标悬停按钮白色效果。
PB是没有鼠标移出控件事件的,因此无法直接实现,鼠标移入移出,按钮变色。
这里用MFC函数来实现
1、外部函数声明
function ulong SetCapture (ulong hwnd) library "user32.dll"
function boolean ReleaseCapture () library "user32.dll"
2、声明实例变量 boolean ib_MouseCaptured = false
pbm_mousemove 事件:
if not ib_MouseCaptured then
SetCapture(handle(this))
textcolor = color_slider_selected
ib_MouseCaptured = TRUE
else
textcolor = color_slider_bg
ib_MouseCaptured = false
ReleaseCapture()
end if