Should work by copy'n'paste.
Comments expected;-)
Background is: modern window view on older Win OS.
Code: Select all
EnableExplicit
declareModule GUI
enableExplicit
enumeration EMouseButton
#MouseButton_None = 0
#MouseButton_Left = #PB_MouseButton_Left
#MouseButton_Right = #PB_MouseButton_Right
#MouseButton_Middle = #PB_MouseButton_Middle
endEnumeration ; EMouseButton
structure XYWH ;-XYWH
X .i
Y .i
W .i
H .i
endStructure ; XYWH extends Any
structure X1Y1X2Y2 ;-X1Y1X2Y2
X .i
Y .i
X2 .i
Y2 .i
endStructure ; X1Y1X2Y2 extends Any
;-begin sheet
structure Sheet ;-Sheet
PB .i
ID .i ; WindowID(PB)
Flag .i
EdgeWidth .i ; border width of window
GridSize .i ; the grid, the sheet snaps to on desktop
Title .s
IsMaximized .b
IsMinimized .b
InnerRect .XYWH
OuterRect .XYWH
HeaderHeight .i
PBSizers .i[9] ; CanvasGadget
PBTitle .i ; CanvasGadget or TextGadget
PBCloser .i ; CanvasGadget
PBMaximizer .i ; CanvasGadget
PBMinimizer .i ; CanvasGadget
PBIcon .i ; CanvasGadget
HeaderMouseButton .i
MouseOffsetX .i
MouseOffsetY .i
IsSizing .b
IsControlKeyDown .b
IsShiftKeyDown .b
endStructure ; Sheet extends Any
declare closeSheet (*Sheet.Sheet)
declare drawSheetCloser (*Sheet.Sheet, IsMouseOver=#False)
declare drawSheetIcon (*Sheet.Sheet, IsMouseOver=#False)
declare drawSheetMaximizer (*Sheet.Sheet, IsMouseOver=#False)
declare drawSheetMinimizer (*Sheet.Sheet, IsMouseOver=#False)
declare drawSheetSizer (*Sheet.Sheet, NrSizer)
declare maximizeSheet (*Sheet.Sheet, P=#True)
declare moveSheetByMouseCursor (*Sheet.Sheet)
declare onCallbackSheetSizer ()
declare onMouseEnter_CloserSheet ()
declare onMouseEnter_MaximizerSheet ()
declare onMouseEnter_MinimizerSheet ()
declare onMouseLeave_CloserSheet ()
declare onMouseLeave_MaximizerSheet ()
declare onMouseLeave_MinimizerSheet ()
declare onMouseLeftButtonDown_CloserSheet ()
declare onMouseLeftButtonDown_MaximizerSheet ()
declare onMouseLeftButtonDown_MinimizerSheet ()
declare onWindowCallbackSheet (hWnd, Message, WParam, LParam)
declare openSheet (X=0, Y=0, W=0, H=0, Title.s="", Flag=0)
declare sizeSheet (*Sheet.Sheet, Live=#False)
declare sizeSheetSizers (*Sheet.Sheet)
declare snapSheetToGrid (*Sheet.Sheet)
declare toRGBA (Color, Alpha=255)
declare updateSheetRect (*Sheet.Sheet, X=-1, Y=-1, W=-1, H=-1, HeaderHeight=-1, EdgeWidth=-1)
;end sheet
declare WindowNrFromHandle (Handle)
;-begin colors
#Color_AliceBlue = $FFF8F0
#Color_AntiqueWhite = $D7EBFA
#Color_Aqua = $FFFF00
#Color_Aquamarine = $D4FF7F
#Color_Azure = $FFFFF0
#Color_Beige = $DCF5F5
#Color_Bisque = $C4E4FF
#Color_Black = $000000
#Color_BlanchedAlmond = $CDEBFF
#Color_Blue = $FF0000
#Color_BlueViolet = $E22B8A
#Color_Brown = $2A2AA5
#Color_BurlyWood = $87B8DE
#Color_CadetBlue = $A09E5F
#Color_Chartreuse = $00FF7F
#Color_Chocolate = $1E69D2
#Color_Coral = $507FFF
#Color_CornflowerBlue = $ED9564
#Color_Cornsilk = $DCF8FF
#Color_Crimson = $3C14DC
#Color_Cyan = $FFFF00
#Color_DarkBlue = $8B0000
#Color_DarkCyan = $8B8B00
#Color_DarkGoldenRod = $0B86B8
#Color_DarkGray = $A9A9A9
#Color_DarkGreen = $006400
#Color_DarkKhaki = $6BB7BD
#Color_DarkMagenta = $8B008B
#Color_DarkOliveGreen = $2F6B55
#Color_DarkOrange = $008CFF
#Color_DarkOrchid = $CC3299
#Color_DarkRed = $00008B
#Color_DarkSalmon = $7A96E9
#Color_DarkSeaGreen = $8FBC8F
#Color_DarkSlateBlue = $8B3D48
#Color_DarkSlateGray = $4F4F2F
#Color_DarkTurquoise = $D1CE00
#Color_DarkViolet = $D30094
#Color_DeepPink = $9314FF
#Color_DeepSkyBlue = $FFBF00
#Color_DimGray = $696969
#Color_DodgerBlue = $FF901E
#Color_FireBrick = $2222B2
#Color_FloralWhite = $F0FAFF
#Color_ForestGreen = $228B22
#Color_Fuchsia = $FF00FF
#Color_Gainsboro = $DCDCDC
#Color_GhostWhite = $FFF8F8
#Color_Gold = $00D7FF
#Color_GoldenRod = $20A5DA
#Color_Gray = $808080
#Color_Green = $008000
#Color_GreenYellow = $2FFFAD
#Color_HoneyDew = $F0FFF0
#Color_HotPink = $B469FF
#Color_IndianRed = $5C5CCD
#Color_Indigo = $82004B
#Color_Ivory = $F0FFFF
#Color_Khaki = $8CE6F0
#Color_Lavender = $FAE6E6
#Color_LavenderBlush = $F5F0FF
#Color_LawnGreen = $00FC7C
#Color_LemonChiffon = $CDFAFF
#Color_LightBlue = $E6D8AD
#Color_LightCoral = $8080F0
#Color_LightCyan = $FFFFE0
#Color_LightGoldenRodYellow = $D2FAFA
#Color_LightGray = $D3D3D3
#Color_LightGreen = $90EE90
#Color_LightPink = $C1B6FF
#Color_LightSalmon = $7AA0FF
#Color_LightSeaGreen = $AAB220
#Color_LightSkyBlue = $FACE87
#Color_LightSlateGray = $998877
#Color_LightSteelBlue = $DEC4B0
#Color_LightYellow = $E0FFFF
#Color_Lime = $00FF00
#Color_LimeGreen = $32CD32
#Color_Linen = $E6F0FA
#Color_Magenta = $FF00FF
#Color_Maroon = $000080
#Color_MediumAquaMarine = $AACD66
#Color_MediumBlue = $CD0000
#Color_MediumOrchid = $D355BA
#Color_MediumPurple = $DB7093
#Color_MediumSeaGreen = $71B33C
#Color_MediumSlateBlue = $EE687B
#Color_MediumSpringGreen = $9AFA00
#Color_MediumTurquoise = $CCD148
#Color_MediumVioletRed = $8515C7
#Color_MidnightBlue = $701919
#Color_MintCream = $FAFFF5
#Color_MistyRose = $E1E4FF
#Color_Moccasin = $B5E4FF
#Color_NavajoWhite = $ADDEFF
#Color_Navy = $800000
#Color_OldLace = $E6F5FD
#Color_Olive = $008080
#Color_OliveDrab = $238E6B
#Color_Orange = $00A5FF
#Color_OrangeRed = $0045FF
#Color_Orchid = $D670DA
#Color_PaleGoldenRod = $AAE8EE
#Color_PaleGreen = $98FB98
#Color_PaleTurquoise = $EEEEAF
#Color_PaleVioletRed = $9370DB
#Color_PapayaWhip = $D5EFFF
#Color_PeachPuff = $B9DAFF
#Color_Peru = $3F85CD
#Color_Pink = $CBC0FF
#Color_Plum = $DDA0DD
#Color_PowderBlue = $E6E0B0
#Color_Purple = $800080
#Color_RebeccaPurple = $993366
#Color_Red = $0000FF
#Color_RosyBrown = $8F8FBC
#Color_RoyalBlue = $E16941
#Color_SaddleBrown = $13458B
#Color_Salmon = $7280FA
#Color_SandyBrown = $60A4F4
#Color_SeaGreen = $578B2E
#Color_SeaShell = $EEF5FF
#Color_Sienna = $2D52A0
#Color_Silver = $C0C0C0
#Color_SkyBlue = $EBCE87
#Color_SlateBlue = $CD5A6A
#Color_SlateGray = $908070
#Color_Snow = $FAFAFF
#Color_SpringGreen = $7FFF00
#Color_SteelBlue = $B48246
#Color_Tan = $8CB4D2
#Color_Teal = $808000
#Color_Thistle = $D8BFD8
#Color_Tomato = $4763FF
#Color_Turquoise = $D0E040
#Color_Violet = $EE82EE
#Color_Wheat = $B3DEF5
#Color_White = $FFFFFF
#Color_WhiteSmoke = $F5F5F5
#Color_Yellow = $00FFFF
#Color_YellowGreen = $32CD9A
;end colors
endDeclareModule ; GUI
module GUI
enableExplicit
;useModule BASE
;-begin sheet
procedure closeSheet(*Sheet.Sheet)
protected PB = *Sheet\PB
if PB
SetWindowCallback(0, PB)
CloseWindow(PB)
endif
endProcedure ; closeSheet(*Sheet.Sheet)
procedure drawSheetCloser(*Sheet.Sheet, IsMouseOver=#False)
protected PB = *Sheet\PBCloser
protected BackColor = toRGBA(#White);Color_Background_SheetHeader)
protected FrontColor = toRGBA(#Gray)
protected LineWidth = 1
protected W = GadgetWidth(PB)
protected H = GadgetHeight(PB)
if IsMouseOver
BackColor = toRGBA(#Red)
FrontColor = toRGBA(#White)
LineWidth = 2
endif
if StartVectorDrawing(CanvasVectorOutput(PB))
AddPathBox(0, 0, W, H)
VectorSourceColor(BackColor)
FillPath()
VectorSourceColor(FrontColor)
MovePathCursor(5, 5)
AddPathLine(W - 5, H - 5)
StrokePath(LineWidth, #PB_Path_RoundEnd)
MovePathCursor(W - 5, 5)
AddPathLine(5, H - 5)
StrokePath(LineWidth, #PB_Path_RoundEnd)
StopVectorDrawing()
endif
endProcedure ; drawSheetCloser(*Sheet.Sheet, IsMouseOver=#False)
procedure drawSheetIcon(*Sheet.Sheet, IsMouseOver=#False)
protected PB = *Sheet\PBIcon
if StartVectorDrawing(CanvasVectorOutput(PB))
protected BackColor = toRGBA(#White);Color_Background_SheetHeader)
protected FrontColor = toRGBA(#Gray)
protected LineWidth = 1
protected W = GadgetWidth(PB) - 8
protected H = GadgetHeight(PB) - 8
AddPathBox(0, 0, W, H)
VectorSourceColor(BackColor)
FillPath()
VectorFont(FontID(LoadFont(#PB_Any, "Tahoma", 10, #PB_Font_HighQuality | #PB_Font_Bold)))
VectorSourceColor(FrontColor)
protected T.s = left(trim(*Sheet\Title), 1)
protected X = (W - VectorTextWidth(T)) / 2
protected Y = (H - VectorTextHeight(T)) / 2
MovePathCursor(X, Y)
AddPathText(T)
FillPath()
VectorSourceColor(FrontColor)
AddPathBox(0, 0, W, H)
StrokePath(1)
StopVectorDrawing()
endif
endProcedure ; drawSheetIcon(*Sheet.Sheet, IsMouseOver=#False)
procedure drawSheetMaximizer(*Sheet.Sheet, IsMouseOver=#False)
protected PB = *Sheet\PBMaximizer
protected BackColor = toRGBA(#White);Color_Background_SheetHeader)
protected FrontColor = toRGBA(#Gray)
protected LineWidth = 1
protected W = GadgetWidth(PB)
protected H = GadgetHeight(PB)
if IsMouseOver
BackColor = toRGBA(#Gray)
FrontColor = toRGBA(#White)
LineWidth = 2
endif
if StartVectorDrawing(CanvasVectorOutput(PB))
if *Sheet\IsMaximized
AddPathBox(0, 0, W, H)
VectorSourceColor(BackColor)
FillPath()
AddPathBox(8, 8, W - 16, H - 16)
VectorSourceColor(FrontColor)
StrokePath(LineWidth, #PB_Path_Default | #PB_Path_SquareEnd)
GadgetToolTip(PB, "Fenster normal")
else
AddPathBox(0, 0, W, H)
VectorSourceColor(BackColor)
FillPath()
AddPathBox(5, 5, W - 10, H - 10)
VectorSourceColor(FrontColor)
StrokePath(LineWidth, #PB_Path_Default | #PB_Path_SquareEnd)
GadgetToolTip(PB, "Fenster gross")
endif
endif
StopVectorDrawing()
endProcedure ; drawSheetMaximizer(*Sheet.Sheet, IsMouseOver=#False)
procedure drawSheetMinimizer(*Sheet.Sheet, IsMouseOver=#False)
protected PB = *Sheet\PBMinimizer
protected BackColor = toRGBA(#White);Color_Background_SheetHeader)
protected FrontColor = toRGBA(#Gray)
protected LineWidth = 1
protected W = GadgetWidth(PB)
protected H = GadgetHeight(PB)
if IsMouseOver
BackColor = toRGBA(#Gray)
FrontColor = toRGBA(#White)
LineWidth = 2
endif
if StartVectorDrawing(CanvasVectorOutput(PB))
if *Sheet\IsMinimized
AddPathBox(0, 0, W, H)
VectorSourceColor(BackColor)
FillPath()
AddPathBox(8, 8, W - 16, H - 16)
VectorSourceColor(FrontColor)
StrokePath(LineWidth, #PB_Path_Default | #PB_Path_SquareEnd)
GadgetToolTip(PB, "Fenster normal")
else
AddPathBox(0, 0, W, H)
VectorSourceColor(BackColor)
FillPath()
MovePathCursor(5, H - 6)
AddPathLine(W - 5, H - 6)
VectorSourceColor(FrontColor)
StrokePath(LineWidth, #PB_Path_Default | #PB_Path_SquareEnd)
endif
endif
StopVectorDrawing()
endProcedure ; drawSheetMinimizer(*Sheet.Sheet, IsMouseOver=#False)
procedure drawSheetSizer(*Sheet.Sheet, NrSizer)
with *Sheet
if StartDrawing(CanvasOutput(\PBSizers[NrSizer]))
protected Color
Color = #Color_WhiteSmoke
;Color = #Color_Red;Gray ; debug
box(0, 0, GadgetWidth(\PBSizers[NrSizer]), GadgetHeight(\PBSizers[NrSizer]), Color)
StopDrawing()
endif
endWith ; *Sheet
endProcedure ; drawSheetSizer(*Sheet.Sheet, NrSizer)
procedure maximizeSheet(*Sheet.Sheet, P=#True)
if P
;ShowWindow_(WindowID(*Sheet\PB), #SW_MAXIMIZE)
SetWindowState(*Sheet\PB, #PB_Window_Maximize)
;ResizeWindow(*Sheet\PB, DesktopX, DesktopY, DesktopW, DesktopH)
else
ShowWindow_(WindowID(*Sheet\PB), #SW_NORMAL)
endif
endProcedure ; maximizeSheet(*Sheet.Sheet, P=#True)
procedure moveSheetByMouseCursor(*Sheet.Sheet)
protected Win = *Sheet\PB
SendMessage_(WindowID(Win), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
snapSheetToGrid(*Sheet)
sizeSheet(*Sheet)
endProcedure ; moveSheetByMouseCursor(*ISheet.ISheet)
procedure onCallbackSheetSizer()
protected Win = EventWindow()
protected Gadget = EventGadget()
protected NrEventType = EventType()
protected *Sheet .Sheet = GetWindowData(Win)
protected NrSizer .i = GetGadgetData(Gadget)
static X
static Y
static IsSizing
select NrEventType
case #PB_EventType_LeftButtonDown
*Sheet\IsSizing = #True
X = DesktopMouseX()
Y = DesktopMouseY()
IsSizing = #True
case #PB_EventType_MouseMove
if IsSizing
if DesktopMouseX()<>X or DesktopMouseY()<>Y
;sizeSheetBySizer(*Sheet, NrSizer, X, Y)
protected W = WindowWidth(*Sheet\PB)
protected H = WindowHeight(*Sheet\PB)
protected L = WindowX(*Sheet\PB)
protected T = WindowY(*Sheet\PB)
protected DX = DesktopMouseX() - X
protected DY = DesktopMouseY() - Y
X = DesktopMouseX()
Y = DesktopMouseY()
select NrSizer
case 1
T + DY: L + DX: W - DX: H - DY
case 2
T + DY: H - DY
case 3
T + DY: : W + DX: H - DY
case 4
W + DX
case 5
W + DX: H + DY
case 6
H + DY
case 7
L + DX: W - DX: H + DY
case 8
L + DX: W -DX
default
endSelect
if W < (*Sheet\GridSize * 10)
W = *Sheet\GridSize * 10
endif
if H < (*Sheet\GridSize * 5)
H = *Sheet\GridSize * 5
endif
ResizeWindow(*Sheet\PB, L, T, W, H)
sizeSheet(*Sheet)
else
endif
endif
case #PB_EventType_LeftButtonUp
*Sheet\IsSizing = #False
IsSizing = #False
snapSheetToGrid(*Sheet)
sizeSheet(*Sheet)
default
endSelect
procedureReturn #PB_ProcessPureBasicEvents
endProcedure ; onCallbackSheetSizer()
procedure onMouseEnter_CloserSheet()
drawSheetCloser(GetWindowData(EventWindow()), #True)
endProcedure ; onMouseEnter_CloserSheet()
procedure onMouseEnter_MaximizerSheet()
drawSheetMaximizer(GetWindowData(EventWindow()), #True)
endProcedure ; onMouseEnter_MaximizerSheet()
procedure onMouseEnter_MinimizerSheet()
drawSheetMinimizer(GetWindowData(EventWindow()), #True)
endProcedure ; onMouseEnter_MinimizerSheet()
procedure onMouseLeave_CloserSheet()
drawSheetCloser(GetWindowData(EventWindow()), #False)
endProcedure ; onMouseLeave_CloserSheet()
procedure onMouseLeave_MaximizerSheet()
drawSheetMaximizer(GetWindowData(EventWindow()), #False)
endProcedure
procedure onMouseLeave_MinimizerSheet()
drawSheetMinimizer(GetWindowData(EventWindow()), #False)
endProcedure ; onMouseLeave_MinimizerSheet()
procedure onMouseLeftButtonDown_CloserSheet()
closeSheet(GetWindowData(EventWindow()))
endProcedure ; onMouseLeftButtonDown_CloserSheet()
procedure onMouseLeftButtonDown_MaximizerSheet()
protected *Sheet .Sheet = GetWindowData(EventWindow())
*Sheet\IsMaximized = bool(not *Sheet\IsMaximized)
if *Sheet\IsMaximized
maximizeSheet(*Sheet)
else
maximizeSheet(*Sheet, #False)
endif
sizeSheet(*Sheet)
endProcedure ; onMouseLeftButtonDown_MaximizerSheet()
procedure onMouseLeftButtonDown_MinimizerSheet()
protected *Sheet .Sheet = GetWindowData(EventWindow())
*Sheet\IsMinimized = bool(not *Sheet\IsMinimized)
if *Sheet\IsMinimized
drawSheetMinimizer(*Sheet)
ShowWindow_(WindowID(*Sheet\PB), #SW_MINIMIZE)
endif
endProcedure ; onMouseLeftButtonDown_MinimizerSheet()
procedure onWindowCallbackSheet(hWnd, Message, WParam, LParam)
protected Win = WindowNrFromHandle(hWnd)
if Win<=0
procedureReturn #PB_ProcessPureBasicEvents
endif
protected *Sheet.Sheet = GetWindowData(Win)
;debug Message
select Message
case #WM_LBUTTONDOWN
moveSheetByMouseCursor(*Sheet)
case #WM_MOVING
case #WM_SIZE
if *Sheet\IsMinimized
*Sheet\IsMinimized = IsIconic_(WindowID(Win))
endif
case #WM_KEYDOWN
if WParam = #VK_CONTROL
*Sheet\IsControlKeyDown = #True
endif
if WParam = #VK_SHIFT
*Sheet\IsShiftKeyDown = #True
endif
case #WM_KEYUP
if WParam = #VK_CONTROL
*Sheet\IsControlKeyDown = #False
endif
if WParam = #VK_SHIFT
*Sheet\IsShiftKeyDown = #False
endif
;case #WM_ ; TODO how to detect minimize all windows of windows system?
; this code does work in example from RSBasic but not here -> works probably only for TextGadget as direct child of window
; case #WM_CTLCOLORSTATIC
; select LParam
;
; case gadgetId(*Sheet\Header\PBTextGadget)
; SetBkMode_(WParam, #TRANSPARENT)
;
; ProcedureReturn GetStockObject_(#HOLLOW_BRUSH)
default
endselect
procedureReturn #PB_ProcessPureBasicEvents
endProcedure ; onWindowCallbackSheet(hWnd, Message, WParam, LParam)
procedure openSheet(X=0, Y=0, W=0, H=0, Title.s="", Flag=0)
protected *Sheet.Sheet = AllocateStructure(Sheet)
protected GW
protected GH
with *Sheet
;\Namespace = #GUI
;\Type = #Sheet
\OuterRect\X = X
\OuterRect\Y = Y
\OuterRect\W = W
\OuterRect\H = H
if \OuterRect\W<64
\OuterRect\W = 64
endif
if \OuterRect\H<64
\OuterRect\H = 64
endif
\Flag = Flag
\EdgeWidth = 6
\HeaderHeight = 32
\InnerRect\X = \EdgeWidth
\InnerRect\Y = \EdgeWidth
\InnerRect\W = \OuterRect\W - (2 * \EdgeWidth)
\InnerRect\H = \OuterRect\H - (2 * \EdgeWidth) - \HeaderHeight
\GridSize = 32
\Title = Title
\IsMaximized = #False
\IsMinimized = #False
\Title = "untitled"
endwith ; *Sheet
updateSheetRect(*Sheet)
; draw the sheet finally
with *Sheet
\PB = OpenWindow(#PB_Any, \OuterRect\X, \OuterRect\Y, \OuterRect\W, \OuterRect\H, \Title, \Flag | #PB_Window_BorderLess); | #PB_Window_SizeGadget); | #PB_Window_SystemMenu); | #PB_Window_Invisible)
if \PB<>0
\ID = WindowID(\PB)
SmartWindowRefresh(\PB, #False)
SetWindowData(\PB, *Sheet) ; back refernce to structure
SetWindowCallback(@onWindowCallbackSheet(), \PB)
SetWindowColor(\PB, RGB(255, 255, 255)) ; white background
\GridSize = 16 ; grid size on desktop
\EdgeWidth = 6 ; width of size handlers
protected ew = \EdgeWidth
;header
\PBTitle = TextGadget(#PB_Any, 4, 4, 124, \HeaderHeight-10, \Title);, #PB_Text_Border)
SetGadgetFont(\PBTitle, FontId(LoadFont(#PB_Any, "Tahoma", 10, #PB_Font_HighQuality)))
SetGadgetColor(\PBTitle, #PB_Gadget_BackColor, #Color_White)
;title
SetWindowTitle(\PB, \Title)
SetGadgetText(\PBTitle, \Title)
GW = \HeaderHeight - 6
GH = \HeaderHeight - 6
;closer
\PBCloser = CanvasGadget(#PB_Any, 0, 2, GW, GH)
GadgetToolTip(\PBCloser, "Fenster schliessen")
drawSheetCloser(*Sheet, #False)
BindGadgetEvent(\PBCloser, @onMouseEnter_CloserSheet(), #PB_EventType_MouseEnter)
BindGadgetEvent(\PBCloser, @onMouseLeave_CloserSheet(), #PB_EventType_MouseLeave)
BindGadgetEvent(\PBCloser, @onMouseLeftButtonDown_CloserSheet(), #PB_EventType_LeftClick)
;maximizer
\PBMaximizer = CanvasGadget(#PB_Any, 0, 2, GW, GH)
GadgetToolTip(\PBMaximizer, "Fenster gross")
drawSheetMaximizer(*Sheet, #False)
BindGadgetEvent(\PBMaximizer, @onMouseEnter_MaximizerSheet(), #PB_EventType_MouseEnter)
BindGadgetEvent(\PBMaximizer, @onMouseLeave_MaximizerSheet(), #PB_EventType_MouseLeave)
BindGadgetEvent(\PBMaximizer, @onMouseLeftButtonDown_MaximizerSheet(), #PB_EventType_LeftClick)
;minimizer
\PBMinimizer = CanvasGadget(#PB_Any, 0, 2, GW, GH)
GadgetToolTip(\PBMinimizer, "Fenster in Taskleiste")
drawSheetMinimizer(*Sheet, #False)
BindGadgetEvent(\PBMinimizer, @onMouseEnter_MinimizerSheet(), #PB_EventType_MouseEnter)
BindGadgetEvent(\PBMinimizer, @onMouseLeave_MinimizerSheet(), #PB_EventType_MouseLeave)
BindGadgetEvent(\PBMinimizer, @onMouseLeftButtonDown_MinimizerSheet(), #PB_EventType_LeftClick)
;icon
\PBIcon = CanvasGadget(#PB_Any, 2 + \EdgeWidth, 2 + \EdgeWidth, \HeaderHeight - 2, \HeaderHeight - 2)
GadgetToolTip(\PBIcon, "Hint: " + \Title)
drawSheetIcon(*Sheet, #False)
;sizers
protected i
for i = 1 to 8
\PBSizers[i] = CanvasGadget(#PB_Any, 0, 0, 0, 0)
SetGadgetData(\PBSizers[i], i)
BindGadgetEvent(\PBSizers[i], @onCallbackSheetSizer())
next i
SetGadgetAttribute(\PBSizers[1], #PB_Canvas_Cursor, #PB_Cursor_LeftUpRightDown)
SetGadgetAttribute(\PBSizers[2], #PB_Canvas_Cursor, #PB_Cursor_UpDown)
SetGadgetAttribute(\PBSizers[3], #PB_Canvas_Cursor, #PB_Cursor_LeftDownRightUp)
SetGadgetAttribute(\PBSizers[4], #PB_Canvas_Cursor, #PB_Cursor_LeftRight)
SetGadgetAttribute(\PBSizers[5], #PB_Canvas_Cursor, #PB_Cursor_LeftUpRightDown)
SetGadgetAttribute(\PBSizers[6], #PB_Canvas_Cursor, #PB_Cursor_UpDown)
SetGadgetAttribute(\PBSizers[7], #PB_Canvas_Cursor, #PB_Cursor_LeftDownRightUp)
SetGadgetAttribute(\PBSizers[8], #PB_Canvas_Cursor, #PB_Cursor_LeftRight)
endWith ; *Sheet
sizeSheet(*Sheet)
endif ; *Sheet\PB
procedureReturn *Sheet
endProcedure ; openSheet(X.i=0, Y.i=0, W.i=0, H.i=0, Title.s="", Flag.i=0)
procedure sizeSheet(*Sheet.Sheet, Live=#False)
protected X
protected Y
protected W
protected H
protected X2
protected Y2
protected i
with *Sheet
\OuterRect\X = WindowX(*Sheet\PB)
\OuterRect\Y = WindowY(*Sheet\PB, #PB_Window_InnerCoordinate)
\OuterRect\W = WindowWidth(*Sheet\PB)
\OuterRect\H = WindowHeight(*Sheet\PB)
EndWith
protected ew = *Sheet\EdgeWidth
updateSheetRect(*Sheet)
;SendMessage_(*Sheet\ID, #WM_SETREDRAW, #False, 0);
with *Sheet
X = \OuterRect\W - \EdgeWidth - 2
Y = \EdgeWidth + 2
X - GadgetWidth(\PBCloser)
ResizeGadget(\PBCloser, X, Y, #PB_Ignore, #PB_Ignore)
X - 2 - GadgetWidth(\PBMaximizer)
ResizeGadget(\PBMaximizer, X, Y, #PB_Ignore, #PB_Ignore)
X - 2 - GadgetWidth(\PBMinimizer)
ResizeGadget(\PBMinimizer, X, Y, #PB_Ignore, #PB_Ignore)
W = X - GadgetX(\PBIcon) - GadgetWidth(\PBIcon) - 2
X = GadgetX(\PBIcon) + GadgetWidth(\PBIcon) + 2
ResizeGadget(\PBTitle, X, Y + 2, W, #PB_Ignore)
endWith ; *Sheet
sizeSheetSizers(*Sheet.Sheet)
endProcedure ; sizeSheet(*Sheet.Sheet, Live=#False)
procedure sizeSheetSizers(*Sheet.Sheet)
protected Win = *Sheet\PB
protected X = WindowX(Win)
protected Y = WindowY(Win)
protected W = WindowWidth(Win)
protected H = WindowHeight(Win)
protected i
with *Sheet
protected ew = \EdgeWidth
ResizeGadget(\PBSizers[1], 0, 0, ew, ew)
ResizeGadget(\PBSizers[2], ew, 0, W - (ew * 2), ew)
ResizeGadget(\PBSizers[3], W - ew, 0, ew, ew)
ResizeGadget(\PBSizers[4], W - ew, ew, ew, H - (ew * 2))
ResizeGadget(\PBSizers[5], W - ew, H - ew, ew, ew)
ResizeGadget(\PBSizers[6], ew, H - ew, W - (ew * 2), ew)
ResizeGadget(\PBSizers[7], 0, H - ew, ew, ew)
ResizeGadget(\PBSizers[8], 0, ew, ew, H - (ew * 2))
for i = 1 to 8
drawSheetSizer(*Sheet, i)
next i
endWith
endProcedure ; sizeSheetSizers(*Sheet.Sheet)
procedure snapSheetToGrid(*Sheet.Sheet)
protected X = WindowX(*Sheet\PB)
protected Y = WindowY(*Sheet\PB)
protected W = WindowWidth(*Sheet\PB)
protected H = WindowHeight(*Sheet\PB)
protected G = *Sheet\GridSize
X = Int(X / G) * G
Y = Int(Y / G) * G
W = Int(W / G) * G
H = Int(H / G) * G
ResizeWindow(*Sheet\PB, X, Y, W, H)
sizeSheet(*Sheet)
endProcedure ; snapSheetToGrid(*Sheet.Sheet)
procedure toRGBA(Color, Alpha=255)
protected R = RGBA(Red(Color), Green(Color), Blue(Color), Alpha)
procedureReturn R
endProcedure ; toRGBA(Color, Alpha)
procedure updateSheetRect(*Sheet.Sheet, X=-1, Y=-1, W=-1, H=-1, HeaderHeight=-1, EdgeWidth=-1)
with *Sheet
if X>-1
\OuterRect\X = X
endif
if Y>-1
\OuterRect\Y = Y
endif
if W>-1
\OuterRect\W = W
endif
if H>-1
\OuterRect\H = H
endif
if HeaderHeight>-1
\HeaderHeight = HeaderHeight
endif
if EdgeWidth>-1
\EdgeWidth = EdgeWidth
endif
\InnerRect\X = \EdgeWidth
\InnerRect\Y = \EdgeWidth
\InnerRect\W = \OuterRect\W - (2 * \EdgeWidth)
\InnerRect\H = \OuterRect\H - (2 * \EdgeWidth) - \HeaderHeight
endWith
endProcedure ; updateSheetRect(*Sheet.Sheet, X=-1, Y=-1, W=-1, H=-1, HeaderHeight=-1, EdgeWidth=-1)
;end sheet
procedure WindowNrFromHandle(Handle)
protected ClassName.s, WindowNumber.l
WindowNumber = -1
ClassName = Space(255)
GetClassName_(Handle, @ClassName, 254)
If Left(ClassName, 11) = "WindowClass"
WindowNumber = Val(Right(ClassName, Len(ClassName) - 12))
EndIf
procedureReturn WindowNumber
endProcedure ; WindowNrFromHandle(Handle)
endModule ; GUI
define *Sheet.GUI::Sheet = GUI::openSheet(8, 8, 480, 320, "Sheet")
if *Sheet\PB
define NrEvent
repeat
if not IsWindow(*Sheet\PB)
break
endif
NrEvent = WaitWindowEvent()
if NrEvent=#PB_Event_CloseWindow
break
endif
forever
endif