Splitter and Resize window
Posted: Thu Mar 21, 2024 11:13 am
I want that when the end user resizes the oWnd window, the splitter should move to the left
when the window is widened the splitter must go to the right and the second explorer must have the dimensions
as I have drawn them in the figure below
the test
On Init I have
If I iconize the window and then call the window I have a wrong wnd
and when I put maximized the wnd I have
I wish move the splitter where you see the red line
when the window is widened the splitter must go to the right and the second explorer must have the dimensions
as I have drawn them in the figure below
the test
Code: Select all | Expand
#include "FiveWin.ch"
#include "Splitter.ch"
#define ID_TOP 60
#define ID_FXBAR 68
*+--------------------------------------------------------------------
*+
*+ Function Main()
*+
*+--------------------------------------------------------------------
*+
FUNCTION Main()
LOCAL oWnd, oFld1, oFld2, oSplit, nPart
LOCAL nHeight, nWidth
LOCAL oBtn1, oBtn2, oBtn3, oBtn4,oBtn5, oBtn6, oBtn7, oBtn8,oBar
LOCAL ii, oBtn0, nCol := 0, aButton := {}
LOCAL bAction := { || MsgInfo( "hello Main" ) }
LOCAL nSplit:= 490
local cFolderBmps:="C:\work\fwh\"
local oBrush1,oFontTitle,oFontText
DEFINE BRUSH oBrush1 COLOR CLR_WHITE //RGB( 245,245,235)
DEFINE FONT oFontTitle NAME "Segoe UI Light" SIZE 0, -18 BOLD
DEFINE FONT oFontText NAME "Segoe UI Light" SIZE 0, -12
DEFINE WINDOW oWnd FROM 0, 0 TO 600, 800 PIXEL TITLE "test splitter"
DEFINE BUTTONBAR oBar OF oWnd 2013 SIZE 70, 60
nWidth := oWnd:nWidth / 2
nHeight := oWnd:nHeight
oFld1 := TEXplorerBar():New( 0, 0, nSplit, , oWnd)
oFld1:nTopColor := RGB( 240,240,240)
oFld1:nBottomColor := RGB( 240,240,240)
oBtn1:= oFld1:AddPanel("Name Panel 1", cFolderBmps+"people.bmp" ,80 )
oBtn3:= oFld1:AddPanel("Name Panel 3", cFolderBmps+"people.bmp" ,80 )
oBtn4:= oFld1:AddPanel("Name Panel 4", cFolderBmps+"people.bmp" ,80 )
oBtn5:= oFld1:AddPanel("Name Panel 5", cFolderBmps+"people.bmp" ,80 )
For n=1 to len(oFld1:aPanels)
oFld1:aPanels[n]:nRound := 0
oFld1:aPanels[n]:aGradient := { { CLR_WHITE, CLR_WHITE }, {CLR_WHITE, CLR_WHITE } }
oFld1:aPanels[n]:nTitleHeight := 40
oFld1:aPanels[n]:lCollapsed :=.f.
oFld1:aPanels[n]:lSpecial = .t.
oFld1:aPanels[n]:oBrush:= oBrush1
oFld1:aPanels[n]:nClrTextSpecial :=RGB(255,165,0)
oFld1:aPanels[n]:lOverTitle :=.f.
oFld1:aPanels[n]:oFont:= oFontTitle
oFld1:aPanels[n]:nTopMargin := 1
next
oFld2 := TEXplorerBar():New( 0, 0, nWidth - 5, , oWnd)
oFld2:nTopColor := RGB( 240,240,240)
oFld2:nBottomColor := RGB( 240,240,240)
oBtn2:= oFld2:AddPanel("Name Panel 2", cFolderBmps+"case.bmp" ,80 )
oBtn6:= oFld2:AddPanel("Name Panel 6", cFolderBmps+"case.bmp" ,80 )
oBtn7:= oFld2:AddPanel("Name Panel 7", cFolderBmps+"case.bmp" ,80 )
For n=1 to len(oFld2:aPanels)
oFld2:aPanels[n]:nRound := 0
oFld2:aPanels[n]:aGradient := { { CLR_WHITE, CLR_WHITE }, {CLR_WHITE, CLR_WHITE } }
oFld2:aPanels[n]:nTitleHeight := 40
oFld2:aPanels[n]:lCollapsed :=.f.
oFld2:aPanels[n]:lSpecial = .t.
oFld2:aPanels[n]:oBrush:= oBrush1
oFld2:aPanels[n]:nClrTextSpecial :=RGB(255,165,0)
oFld2:aPanels[n]:lOverTitle :=.f.
oFld2:aPanels[n]:oFont:= oFontTitle
oFld2:aPanels[n]:nTopMargin := 1
next
@ ID_TOP,nSplit+2 SPLITTER oSplit ;
VERTICAL ;
PREVIOUS CONTROLS oFld1 ;
HINDS CONTROLS oFld2 ;
LEFT MARGIN 1 ;
RIGHT MARGIN 1 ;
SIZE 0.5, nHeight - 98 PIXEL ;
ON CHANGE DoResize( oWnd, oSplit, oFld1, oFld2 ) ;
COLOR CLR_BLUE ;
OF oWnd
oSplit:lStatic:=.t.
oSplit:AdjLeft()
oWnd:aMinMaxInfo := { nil, nil, ,, 750,550, , }
ACTIVATE WINDOW oWnd ;
ON RESIZE DoResize( oWnd, oSplit, oFld1, oFld2 ) CENTER
RETURN NIL
PROCEDURE DoResize( oWnd, oSplit, oFld1, oFld2 )
LOCAL nTop := oWnd:nTop
LOCAL nBottom := oWnd:nBottom
LOCAL nRight := oWnd:nRight
LOCAL nLeft := oWnd:nLeft
LOCAL nHeight := nBottom - nTop
LOCAL nPart := oWnd:nWidth / 12
LOCAL nLeftWidth, nRightWidth
LOCAL ii, oBtn, nCol := 0
LOCAL oCtrol
// ************************ left *************************
oSplit:AdjLeft()
oSplit:nTop := ID_TOP
oSplit:nHeight := nHeight - ID_TOP - ID_FXBAR
oCtrol := oSplit:aPrevCtrols[ 1 ]
nLeftWidth := oCtrol:nWidth
IF nLeftWidth > oWnd:nWidth
nLeftWidth := oWnd:nWidth - 100
oSplit:SetPosition( nLeftWidth )
ENDIF
oCtrol:nLeft := 0
oCtrol:nRight := nLeftWidth
oCtrol:nTop := ID_TOP
oCtrol:nBottom := nHeight - ID_FXBAR - 130
oCtrol:SetSize( nLeftWidth, nHeight - ID_FXBAR - 40 )
// ************************ right *************************
oSplit:AdjRight()
oSplit:nTop := ID_TOP
oSplit:nHeight := nHeight - ID_TOP - ID_FXBAR
oCtrol := oSplit:aHindCtrols[ 1 ]
nRightWidth := oCtrol:nWidth
oCtrol:nLeft := nLeftWidth
oCtrol:nRight := nRightWidth
oCtrol:nTop := ID_TOP
oCtrol:nBottom := nHeight - ID_FXBAR - 130
oCtrol:SetSize( nRightWidth, nHeight - ID_FXBAR - 40 )
// ************************ NEED again *************************
oFld1:SetPos( ID_TOP, 0 )
oFld1:SetSize( nLeftWidth, nHeight - ID_FXBAR - 40 )
oWnd:Refresh()
RETURN
On Init I have
If I iconize the window and then call the window I have a wrong wnd
and when I put maximized the wnd I have
I wish move the splitter where you see the red line