发信人: 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]
  | 
 
 
 |