Window with Canvas;

Windows specific forum
HanPBF
Enthusiast
Enthusiast
Posts: 570
Joined: Fri Feb 19, 2010 3:42 am

Window with Canvas;

Post by HanPBF »

If someone needs this.
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	
User avatar
Lunasole
Addict
Addict
Posts: 1091
Joined: Mon Oct 26, 2015 2:55 am
Location: UA
Contact:

Re: Window with Canvas;

Post by Lunasole »

Cool, I like the idea, it looks good to construct custom unique GUI this way, but because of it is hard to make such, it can be used only to produce primitive "one-click" GUIs, like that one in Google Chrome or any typical modern mobile (or web) application offers. But well, that's enough for many cases, lot of lame users becoming impressed and don't want more ^^
"W̷i̷s̷h̷i̷n̷g o̷n a s̷t̷a̷r"
HanPBF
Enthusiast
Enthusiast
Posts: 570
Joined: Fri Feb 19, 2010 3:42 am

Re: Window with Canvas;

Post by HanPBF »

Yes, it's an idea.
If I did understand You correctly, You mean simpler GUIs for "lot of lame users becoming impressed and don't want more" like easier access to a somewhat more or less complex software.

But, simpler like cleaner? Bigger buttons for lame users or... easier access from a tablet.
Yes! I think, Microsoft went years ago in exactly that direction.
A touch UI for tablets and for the desktop the same clicking with the mouse on an oversized button.

We built just a software with such a "clean" surface and it feels somewhat... empty!
Many numbers combined in statistics; in a few months nobody is interested anymore in those.


For me, things are evolving in direction of making UI look like paper and in some years we have tablets like paper.
(http://materializecss.com/about.html or apple pencil)


I like a white, borderless ui; but not if no more contrast is given and You don't know anymore what textbox belongs to which container.


With my window above I went some months ago in direction of micro services ("glueing" windows together); it's astounding that so many programs are there and so less work together in something like a mashup.
But, maybe it's not wanted.


So, résumé: paper like ui; clean white but empty ui; micro services;-)
Post Reply