发信人: yuce()
整理人: hunter__fox(2002-03-16 22:47:21), 站内信件
|
EMAIL:[email protected]
VFP下编程实现表单区域动态分割
(由于没法上传JPG图片,可来email要全文)
我们常见许多程序的界面为画面可自由地左右上下分割,如著名的Acdsee,Win dows中的资源管理器等。这种方法的好处不言而喻。能否在VFP中实现呢?当然行 ,以下是笔者的实现方法,算法并非完美,以期与同行高手探讨,以得最佳方法 。
程序的实现比较简单,主要是对左右分割条ShpSplitterS ,及上下分割条ShpSp litterH的MouseDown/MouseUp事件编程就行了(图中已对程序中用到的对象名作了 说明)。 该方法已在WIN9X,VFP6.0中运行通过。(限于版面,程序可EMAIL联系 。)
其中ShpSpiltterS 的属性设置如下(ShpSpiltterH的MousePointer=7,其余同) :
Thisform.ShpSpiltters
With
.BackStyle=0 &&透明
.BorderStyle=0 &&透明
.BorderColor=RGB(128,128,128 )
.FillColor=RGB(128,128,128)
.FillStyle=1 && 透明
.MousePointer=9 && 东西方向尺寸调整
endwith
一、ShpiltterS的MouseDown 事件程序如下:
LPARAMETERS nButton, nShift, nXCoord, nYCoord
LOCAL LCWINDOWNAME, LNSCALEMODE, LNMINCOL, LNMAXCOL, LNMCOL1, LNMCOL2, LNCOLUMNS, LNLEFT, LNOLDLEFT
LOCAL OLEFTPANE, ORIGHTPANE,llvisible1,llvisible2
THISFORM.LMOUSEDOWN = .T. && LMOUSEDOWN,NMOUSEBUTTON,NSHIFT为自设 的表属性。
THISFORM.NMOUSEBUTTON = IIF(TYPE("nButton")=="N", NBUTTON, 0)
THISFORM.NSHIFT = NSHIFT
IF NBUTTON<>1
RETURN
ENDIF
LCWINDOWNAME = THISFORM.NAME
LNSCALEMODE = THISFORM.SCALEMODE
LNMCOL1 = MCOL(LCWINDOWNAME, LNSCALEMODE) && 当前光标所在列
IF TYPE("lnMCol1")<>"N" .OR. LNMCOL1<=0
RETURN
ENDIF
OLEFTPANE = THISFORM.Txt3Dleft && 左边平台
ORIGHTPANE = THISFORM.Txt3Dright && 右边平台
LLVISIBLE1 = OLEFTPANE.VISIBLE
LLVISIBLE2 = ORIGHTPANE.VISIBLE
OLEFTPANE.VISIBLE = .T.
ORIGHTPANE.VISIBLE = .T.
LNLEFT = THIS.LEFT && 当前左边距
LNOLDLEFT = ORIGHTPANE.LEFT && 老的左边距=右平台的左边距
LNMINCOL = OLEFTPANE.LEFT+(THIS.WIDTH-1)+20 && 最小的列=左平台的左边 距+分割列条宽度+20
LNMAXCOL = ORIGHTPANE.LEFT+ORIGHTPANE.WIDTH-20 && 最大的列=右平台的左 边距+右平台宽度-20
LNMCOL2 = LNMCOL1
THIS.FILLSTYLE = 0 && 填充为实线
THIS.ZORDER(0) && 移动时本对象在所有表单对象的前端 (1)-后端
DO WHILE MDOWN() && 当MOUSE按下时
DOEVENTS
*THISFORM.DRAW && 重画表单
LNMCOL2 = MCOL(LCWINDOWNAME, LNSCALEMODE)
IF TYPE("lnMCol2")<>"N" .OR. LNMCOL2=0
LOOP
ENDIF
IF LNMCOL2<=LNMINCOL && 小于=最小左边
LNMCOL2 = MCOL("", 3) && 返回-1,已经出窗口边,以象素方式
IF LNMCOL2<=0
LOOP
ENDIF
LNMCOL2 = IIF(LNMCOL2>=THISFORM.LEFT+THISFORM.WIDTH-30, LNMAXCOL, LNMINCOL)
ENDIF
LNMCOL2 = MIN(MAX(LNMCOL2, LNMINCOL), LNMAXCOL) &&
IF LNMCOL2=LNMCOL1 .OR. LNMCOL2<0
LOOP
ENDIF
THIS.LEFT = LNLEFT+(LNMCOL2-LNMCOL1)
ENDDO
THIS.FILLSTYLE = 1
OLEFTPANE.VISIBLE = LLVISIBLE1
ORIGHTPANE.VISIBLE = LLVISIBLE2
IF LNMCOL2=LNMCOL1
RETURN
ENDIF
IF LNMCOL2<0
LNMOL2 = LNMCOL1
ENDIF
LNCOLUMNS = LNMCOL2-LNMCOL1+ORIGHTPANE.LEFT
LNCOLUMNS = MIN(MAX(LNCOLUMNS, LNMINCOL), LNMAXCOL)-ORIGHTPANE.LEFT
WITH THISFORM
.LOCKSCREEN = .T.
OLEFTPANE.WIDTH = OLEFTPANE.WIDTH+LNCOLUMNS
ORIGHTPANE.LEFT = ORIGHTPANE.LEFT+LNCOLUMNS
ORIGHTPANE.WIDTH = ORIGHTPANE.WIDTH-LNCOLUMNS
THIS.LEFT = LNLEFT+(ORIGHTPANE.LEFT-LNOLDLEFT)
.LOCKSCREEN = .F.
ENDWITH
二、ShpspiltterS MouseUp 事件:Thisform.lmousedown=.F.
三、ShpspiltterH MouseDown 事件(注解与ShpspiltterS的MOUSEDOWN类同):
LOCALLCWINDOWNAME,LNSCALEMODE,LNMINROW,LNMAXROW,LNMROW1,LNMROW2,LNROWS ,LNTOP,LNOLDTOP
LOCAL LLBROWSER,LLVISIBLE1,LLVISIBLE2,LLLOCKSCREEN
LOCAL OTOPPANEleft, OTOPPANEright, OBOTTOMPANE
THISFORM.LMOUSEDOWN = .T.
THISFORM.NMOUSEBUTTON = IIF(TYPE("nButton")=="N", NBUTTON, 0)
THISFORM.NSHIFT = NSHIFT
IF NBUTTON<>1
RETURN
ENDIF
LCWINDOWNAME = THISFORM.NAME
LNSCALEMODE = THISFORM.SCALEMODE
LNMROW1 = MROW(LCWINDOWNAME, LNSCALEMODE)
IF TYPE("lnMRow1")<>"N" .OR. LNMROW1<=0
RETURN
ENDIF
LLLOCKSCREEN = THISFORM.LOCKSCREEN
OTOPPANEleft = THISFORM.Txt3dleft
OTOPPANEright = THISFORM.Txt3dright
OBOTTOMPANE = THISFORM.Edtdesc
LLVISIBLE1 = OTOPPANEleft.VISIBLE
LLVISIBLE2 = OTOPPANEright.VISIBLE
LNTOP = THIS.TOP
LNOLDTOP = OBOTTOMPANE.TOP
LNMINROW = OTOPPANEleft.TOP+(THIS.HEIGHT-1)+40
LNMAXROW = OBOTTOMPANE.TOP+OBOTTOMPANE.HEIGHT-40
LNMROW2 = LNMROW1
THIS.FILLSTYLE = 0
THIS.ZORDER(0)
DO WHILE MDOWN()
DOEVENTS
THISFORM.DRAW
LNMROW2 = MROW(LCWINDOWNAME, LNSCALEMODE)
IF TYPE("lnMRow2")<>"N" .OR. LNMROW2=0
LOOP
ENDIF
IF LNMROW2<=LNMINROW
LNMROW2 = MROW("", 3)
IF LNMROW2<=0
LOOP
ENDIF
LNMROW2 = IIF(LNMROW2>=THISFORM.TOP+THISFORM.HEIGHT, LNMAXROW, LN MINROW)
ENDIF
LNMROW2 = MIN(MAX(LNMROW2, LNMINROW), LNMAXROW)
IF LNMROW2=LNMROW1 .OR. LNMROW2<0
LOOP
ENDIF
THIS.TOP = LNTOP+(LNMROW2-LNMROW1)
ENDDO
THIS.FILLSTYLE = 1
OTOPPANEleft.VISIBLE = LLVISIBLE1
OTOPPANEright.VISIBLE = LLVISIBLE2
IF LNMROW2=LNMROW1
RETURN
ENDIF
IF LNMROW2<0
LNMROW2 = LNMROW1
ENDIF
LNROWS = LNMROW2-LNMROW1+OBOTTOMPANE.TOP
LNROWS = MIN(MAX(LNROWS, LNMINROW), LNMAXROW)-OBOTTOMPANE.TOP
WITH THISFORM
.LOCKSCREEN = .T.
OTOPPANEleft.HEIGHT = OTOPPANEleft.HEIGHT+LNROWS
OTOPPANEright.HEIGHT = OTOPPANEleft.HEIGHT
.SHPSPLITTERS.HEIGHT = OTOPPANEleft.HEIGHT
OBOTTOMPANE.TOP = OBOTTOMPANE.TOP+LNROWS
OBOTTOMPANE.HEIGHT = OBOTTOMPANE.HEIGHT-LNROWS
THIS.TOP = LNTOP+(OBOTTOMPANE.TOP-LNOLDTOP)
.LOCKSCREEN = LLLOCKSCREEN
ENDWITH
-- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.130.101.243]
|
|