pb powerbuilder 自定义datawindow滚动条

运行效果如图:
pb powerbuilder 自定义datawindow滚动条_第1张图片


设计要点,难点介绍:

一、滚动条使用4个statictext控件组成。
pb powerbuilder 自定义datawindow滚动条_第2张图片
二、滚动控制
通过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

pb powerbuilder 自定义datawindow滚动条_第3张图片
还需要一个变量 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 powerbuilder 自定义datawindow滚动条_第4张图片

补充五:
鼠标悬停按钮白色效果。
PB是没有鼠标移出控件事件的,因此无法直接实现,鼠标移入移出,按钮变色。
pb powerbuilder 自定义datawindow滚动条_第5张图片
这里用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

你可能感兴趣的:(PB,Powerbuilder相关)