精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VFP>>〖界面设计〗>> 发表一篇VFP中表单画面分割的方法

主题: 发表一篇VFP中表单画面分割的方法
发信人: 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]

[关闭][返回]