 |
首先进入vfp5/工具/选项/控件/ACTIVEX,加入MicroSoft Forms 2.0 Scrollbar 控件,并将它设置为默认值。按确定退出。
下面的演示是在一个表单上加入两个scrollbar,并 加入一些按钮控件,其中一些故意设置在表单可视区外,当点选scrollbar时,改动这些控件的top、left等属性来移动这些控件,逐步使它们进入可视区,使之看上去如表单在滚动自己。
新建一表单,属性采用预定义。点选表单控件工具栏/activex,此时在工具栏上应有一个提示为'Microsoft form 2.0 scrollbar'的快捷按钮,点选它至表单上,两次形成两个scrollbar控件。
属性设置:
scroll1 :orientation='2' name='scrollhoriz' largechange=100 smallchange=50
scroll2: orientation='1' name='scrollvertical' largechange=100 smallchange=50
largechange当用户直接拖动滑块时的滑动距离(根据实际需要调整,也可在表单的init事件中设置)
smallchange当用户点键头或点空白处的滑动距离(根据实际需要调整)
orientation为scrollbar是否为水平
将表单最大化,放几个按钮在表单的右边和下方。另加
几个按钮在表单运行时可见区域内,再将表单的windowstate设为普遍。(见附件scroll1)
定义表单的resize方法:
this.scrollhoriz.left=0
this.scrollhoriz.top=this.height-15
this.scrollhoriz.width=this.width-15
this.scrollvertical.top=0
this.scrollvertical.left=this.width-15
this.scrollvertical.height=this.height-15
this.refresh
现在,为表单添加一个新的scroll方法(不能使用scroll命令)
***form.scroll
LPARA lMoveStepX,lMoveStepY,nMoveStepLen
***lmovestepX、lmovestepy分别为当前是移动水平滚动条还是移动垂直滚动条的逻辑值,为真时移动
***nMoveSteplen表示移动的长度
IF ALLT(TYPE('lMoveStepx'))+ALLT(TYPE('lMoveStepY'))+ALLT(TYPE('nMoveStepLen'))#'LLN' THEN
MESSAGEBOX('参数类型出错!')
RETURN .F.
ENDIF
FOR T=1 TO THIS.CONTROLCOUNT
IF THIS.Controls[t].baseclass<>'Olecontrol' OR THIS.Controls[t].oleClass<>'Forms.scrollbar.1' THEN
IF lMoveStepX THEN &&竖移
THIS.Controls[t].top=this.Controls[t].top+nMoveStepLen
ENDIF
IF lMoveStepY THEN &&横移
THIS.Controls[t].left=this.Controls[t].left+nMoveSteplen
ENDIF
ENDIF
ENDFOR
RETURN .T.
现在为表单增添两个属性,scrollHvalue、scrollvvalue分别表示上一次移动后的滚动条value值,用来判别当前的移动方向.
scroolbar有两个事件,change event和scroll event,发别在用户单击键头(空白区)和滑动块时激发。
***ScrollHoriz Change Event***
IF THIS.OBJECT.VALUE THISFORM.SCROLL(.F.,.T.,THIS.Smallchange) &&移动
ENDIF
IF THIS.OBJECT.VALUE>THISFORM.scrollhValue then
THISFORM.SCROLL(.F.,.T.,THIS.Smallchange*-1) &&反向移动
ENDIF
THISFORM.scrollhValue=THIS.OBJECT.VALUE
***ScrollHoriz.Scroll Events***
IF THIS.OBJECT.VALUE THISFORM.SCROLL(.F.,.T.,THIS.largechange) &&移动
ENDIF
IF THIS.OBJECT.VALUE>THISFORM.scrollhValue then
THISFORM.SCROLL(.F.,.T.,THIS.largechange*-1) &&反向移动
ENDIF
THISFORM.scrollhValue=THIS.OBJECT.VALUE
按照以上两个事件定义scrollvertical的同样事件,将所有的'scrollhvalue'变为'scrollvvalue'、.f.,.t.交换即可.
请注意scroll.object.value属性,它表示当前滚动块的位置值。以上程序尚需根据实际应用调整各项参数。
运行时的效果分别见附件图scroll2、scroll3。
此问题由青熙回答。
附加关键字:编程, 源程序, programming, source code, FoxPro/Visual FoxPro, Foxbase, dBase, xbase, FoxPro, VFP, Visual FoxPro, 数据控件, data control。
|