[bb] Option Window - Messages and request user response by Nicstt [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:43

Previous topic - Next topic

BlitzBot

Title : Option Window - Messages and request user response
Author : Nicstt
Posted : 1+ years ago

Description : I wanted a window that would display messages I wanted to advise user of.

This developed - message only window, 1 button 'ok' window also a 2 button yes/no and a 3 button yes/no/cancel.

Specifying Number selects the type of message - 0 no buttons, 1 = 1, 2 = 2 and (surprisingly) 3 = 3.

Enter text required - no other details need to be passed, although the font defaults to ariel.

Can pass an image that requires buttons drawing, or even a fully drawn window with buttons, although the buttons have to be placed specifically to be used correctly.

Sorry about the lack of comments.

I wrote it using 1024x768, however I have tested it using 800x600 and seems to be fine.

I have included a small program to test its use.

To ensure custom drawn window is correct I would enter details required then screen print and copy and paste into a drawing package.

Hope some find it useful.

Edit: ewww thought I'd found a bug, just a mistake on boolean I'd forgotten to change when testing - just changed it. :D


Code :
Code: blitzbasic
Function AdviceWindowOption(number, gfxGeneric, custom_width, custom_hight, fntGeneric, btnTextColor, message$, boolean)
	; ********************************************************************************************************************************
	; AdviceWindowOption(number, gfxGeneric, custom_width, custom_hight, fntGeneric, message$, boolean)
	; number			0, 1, 2 or 3 - determines how many buttons each window will have
	;					a number out of range defaults to 0 with a message
	; gfxGeneric		set it to 0 will let function draw window and buttons when required using defaults
	; custom_width		0 when happy with defaults or if passing a predrawn graphic - default is 300 or when window has 3 buttons 450
	; custom_hight		0 when happy with defaults or if passing a predrawn graphic - default is 120
	;					custom size won't allow a control larger than screen size
	; fntGeneric		0 when happy with defaults - which is unlikely
	; btnTextColor		black or white - does not affect fntGeneric
	; message$			text to be displayed - will be split up into three lines by function
	;					- pass empty if predrawn window has the message displayed
	;					- if string is too long outputs a default message.
	; boolean			set to false unless predrawn window (or image/texture) needs buttons adding
	;					- if image is smaller than default size it will be resized - no warning is given
	;					- however, a copy of the image is used preserving the original
	; ********************************************************************************************************************************
	; Returns			reply = 1, 2, 3 or 4 - | 1 = ok button | 2 = yes button | 3 = no button | 4 = cancel button
	;					- also returns Null when no button is displayed if a Null return is required
	; ********************************************************************************************************************************
	; Button Size 		Default is 127 x 32 - no option to change the size
	; ********************************************************************************************************************************
	; example code of use	

	;answer = AdviceWindowOption(1, 0, 0, 0, 0, "Test", False) ;  one button 'ok'
	;Select answer
	;	Case 1
			; code here would be for what to do with answer (return)
	;	Case 2
			; code here would be for what to do with answer (return)
	;	Case 3
			; code here would be for what to do with answer (return)
	;	Case 4
			; code here would be for what to do with answer (return)
	;End Select
	
	; ********************************************************************************************************************************
	; text displayed on drawn buttons
	btntextOk$ = "OK" : btntextYes$ = "Yes" : btntextNo$ = "No" : btntextCancel$ = "Cancel"

	imagefree = False : fontfree = False : fontfreelarge = False
	
	gfxFullScreen = CreateImage(GraphicsWidth(), GraphicsHeight())

	; draws button to use to show button 'activated' 127 x 32
	gfxActiveBtn = CreateImage (127, 32)
	SetBuffer (ImageBuffer(gfxActiveBtn))
	ClsColor 0, 0, 0 : Cls ; cls with color that will be masked
	x1 = 0 : y1 = 0 : x2 = 126 : y2 = 31 ; top left and bottom right coords
	Color 32, 32, 32
	Line x1, y1, x2, y1 : Line x1, y1 + 1, x2 - 1, y1 + 1
	Line x1, y1 + 2, x1, y2 : Line x1 + 1, y1 + 2, x1 + 1, y2 - 1
	Color 255, 255, 255
	Line x1 + 2, y2 - 1, x2, y2 - 1 : Line x1 + 1, y2, x2, y2
	Line x2 - 1, y1 + 2, x2 - 1, y2 - 2 : Line x2, y1 + 1, x2, y2 - 2
	SetBuffer (BackBuffer())
	MaskImage gfxActiveBtn, 0, 0, 0
	If fntGeneric = 0
		fntGeneric = LoadFont("Ariel",16, False, False, False) ; default font
		fontfree = True 
	EndIf
		; makes a copy of imported image as any changes will affect original
	If gfxGeneric <> 0
		gfxTemp = gfxGeneric
		gfxGeneric = CopyImage(gfxTemp)
		gfxTemp = 0
	EndIf
	If gfxGeneric = 0 Or (gfxGeneric <> 0 And boolean = True) ; no graphics passed, or graphic needs buttons adding
		If boolean = True	; need to test passing a gfx for window that is being used as background
			custom_width = ImageWidth(gfxGeneric)
			custom_hight = ImageHeight(gfxGeneric)
			resize = False
			If ImageWidth(gfxGeneric) < 300 And number <> 3 
				custom_width = 300 : resize = True
			ElseIf ImageWidth(gfxGeneric) < 450 And number = 3
				custom_width = 450 : resize = True
			EndIf
			If ImageHeight(gfxGeneric) < 120
				custom_hight = 120 : resize = True
			EndIf
			If resize = True Then ResizeImage gfxGeneric, custom_width, custom_hight
		EndIf
		If custom_width < 300 And number <> 3 Then custom_width = 300
		If custom_width < 450 And number = 3 Then custom_width = 450
		If custom_hight < 120 Then custom_hight = 120
		If custom_width > GraphicsWidth() Then custom_width = GraphicsWidth() : message$ = "custom_width was greater than max allowed!"
		If custom_hight > GraphicsHeight() Then custom_hight = GraphicsHeight() : message$ = "custom_height was greater than max allowed!"
		If boolean = False
			gfxGeneric = CreateImage (custom_width, custom_hight); generic variable to hold gfx data of whatever is passed - 0 will make the default gfx
			imagefree = True
		EndIf
		fntStandardLarge = LoadFont("Comic Sans MS",28, False, False, False) ; used to display text on buttons
		fontfreelarge = True
		SetBuffer (ImageBuffer(gfxGeneric))
		
		If boolean = False Then ClsColor 180, 180, 210 : Cls
		; window without buttons - draws border on predrawn background or image after cls
		Color 255, 255, 255
		Line 0, 0, custom_width - 1, 0
		Line 0, 1, custom_width - 1, 1
		Line 0, 2, 0, custom_hight - 1
		Line 1, 2, 1, custom_hight - 1
		Color 32, 32, 32
		Line 2, 2, custom_width - 1, 2
		Line 2, 3, custom_width - 1, 3
		Line 2, custom_hight - 1, custom_width - 1, custom_hight - 1
		Line 2, custom_hight - 2, custom_width - 1, custom_hight - 2
		Line 2, 4, 2, custom_hight - 1
		Line 3, 4, 3, custom_hight - 1
		Line custom_width - 1, 4, custom_width - 1, custom_hight - 1
		Line custom_width - 2, 4, custom_width - 2, custom_hight - 1
		; draws what buttons are required with text of specified colour - 0 black, 1 white
		Select number
			Case 1 ; 1 button - ok
				x1_1 = custom_width / 2 - 65 : y1_1 = custom_hight - 40
				x1_2 = x1_1 + ImageWidth(gfxActiveBtn) - 1 : y1_2 = y1_1 + ImageHeight(gfxActiveBtn) - 1
				Color 255, 255, 255
				Line x1_1, y1_1, x1_2, y1_1 : Line x1_1, y1_1 + 1, x1_2 - 1, y1_1 + 1
				Line x1_1, y1_1 + 2, x1_1, y1_2 : Line x1_1 + 1, y1_1 + 2, x1_1 + 1, y1_2 - 1
				Color 32, 32, 32
				Line x1_1 + 2, y1_2 - 1, x1_2, y1_2 - 1 : Line x1_1 + 1, y1_2, x1_2, y1_2
				Line x1_2 - 1, y1_1 + 2, x1_2 - 1, y1_2 - 2 : Line x1_2, y1_1 + 1, x1_2, y1_2 - 2
				SetFont fntStandardLarge 
				If btnTextColor = 0 Then Color 32, 32, 32 Else Color 255, 255, 255
				Text (custom_width / 2) - (StringWidth (btntextOk$) / 2), y1_1, btntextOk$
			Case 2	; 2 buttons - yes, no
				x1_1 = 9 : y1_1 = custom_hight - 40
				x1_2 = x1_1 + ImageWidth(gfxActiveBtn) - 1 : y1_2 = y1_1 + ImageHeight(gfxActiveBtn) - 1
				Color 255, 255, 255
				Line x1_1, y1_1, x1_2, y1_1 : Line x1_1, y1_1 + 1, x1_2 - 1, y1_1 + 1
				Line x1_1, y1_1 + 2, x1_1, y1_2 : Line x1_1 + 1, y1_1 + 2, x1_1 + 1, y1_2 - 1
				Color 32, 32, 32
				Line x1_1 + 2, y1_2 - 1, x1_2, y1_2 - 1 : Line x1_1 + 1, y1_2, x1_2, y1_2
				Line x1_2 - 1, y1_1 + 2, x1_2 - 1, y1_2 - 2 : Line x1_2, y1_1 + 1, x1_2, y1_2 - 2
				SetFont fntStandardLarge 
				If btnTextColor = 0 Then Color 32, 32, 32 Else Color 255, 255, 255
				Text x1_1 + (ImageWidth(gfxActiveBtn) / 2) - (StringWidth (btntextYes$) / 2), y1_1, btntextYes$
				x2_2 = custom_width - 9 : y2_1 = custom_hight - 40
				x2_1 = x2_2 - ImageWidth(gfxActiveBtn) + 1 : y2_2 = y2_1 + ImageHeight(gfxActiveBtn) - 1
				Color 255, 255, 255
				Line x2_1, y2_1, x2_2, y2_1 : Line x2_1, y2_1 + 1, x2_2 - 1, y2_1 + 1
				Line x2_1, y2_1 + 2, x2_1, y2_2 : Line x2_1 + 1, y2_1 + 2, x2_1 + 1, y2_2 - 1
				Color 32, 32, 32
				Line x2_1 + 2, y2_2 - 1, x2_2, y2_2 - 1 : Line x2_1 + 1, y2_2, x2_2, y2_2
				Line x2_2 - 1, y2_1 + 2, x2_2 - 1, y2_2 - 2 : Line x2_2, y2_1 + 1, x2_2, y2_2 - 2
				SetFont fntStandardLarge 
				If btnTextColor = 0 Then Color 32, 32, 32 Else Color 255, 255, 255
				Text x2_1 + (ImageWidth(gfxActiveBtn) / 2) - (StringWidth (btntextNo$) / 2), y2_1, btntextNo$
			Case 3 ; 3 buttons - yes, no, cancel
				x1_1 = 9 : y1_1 = custom_hight - 40
				x1_2 = x1_1 + ImageWidth(gfxActiveBtn) - 1 : y1_2 = y1_1 + ImageHeight(gfxActiveBtn) - 1
				Color 255, 255, 255
				Line x1_1, y1_1, x1_2, y1_1 : Line x1_1, y1_1 + 1, x1_2 - 1, y1_1 + 1
				Line x1_1, y1_1 + 2, x1_1, y1_2 : Line x1_1 + 1, y1_1 + 2, x1_1 + 1, y1_2 - 1
				Color 32, 32, 32
				Line x1_1 + 2, y1_2 - 1, x1_2, y1_2 - 1 : Line x1_1 + 1, y1_2, x1_2, y1_2
				Line x1_2 - 1, y1_1 + 2, x1_2 - 1, y1_2 - 2 : Line x1_2, y1_1 + 1, x1_2, y1_2 - 2
				SetFont fntStandardLarge 
				If btnTextColor = 0 Then Color 32, 32, 32 Else Color 255, 255, 255
				Text x1_1 + (ImageWidth(gfxActiveBtn) / 2) - (StringWidth (btntextYes$) / 2), y1_1, btntextYes$
				x2_1 = custom_width / 2 - 63 : y2_1 = custom_hight - 40
				x2_2 = x2_1 + ImageWidth(gfxActiveBtn) - 1 : y2_2 = y2_1 + ImageHeight(gfxActiveBtn) - 1
				Color 255, 255, 255
				Line x2_1, y2_1, x2_2, y2_1 : Line x2_1, y2_1 + 1, x2_2 - 1, y2_1 + 1
				Line x2_1, y2_1 + 2, x2_1, y2_2 : Line x2_1 + 1, y2_1 + 2, x2_1 + 1, y2_2 - 1
				Color 32, 32, 32
				Line x2_1 + 2, y2_2 - 1, x2_2, y2_2 - 1 : Line x2_1 + 1, y2_2, x2_2, y2_2
				Line x2_2 - 1, y2_1 + 2, x2_2 - 1, y2_2 - 2 : Line x2_2, y2_1 + 1, x2_2, y2_2 - 2
				SetFont fntStandardLarge 
				If btnTextColor = 0 Then Color 32, 32, 32 Else Color 255, 255, 255
				Text x2_1 + (ImageWidth(gfxActiveBtn) / 2) - (StringWidth (btntextNo$) / 2), y2_1, btntextNo$
				x3_2 = custom_width - 9 : y3_1 = custom_hight - 40
				x3_1 = x3_2 - ImageWidth(gfxActiveBtn) + 1 : y3_2 = y3_1 + ImageHeight(gfxActiveBtn) - 1
				Color 255, 255, 255
				Line x3_1, y3_1, x3_2, y3_1 : Line x3_1, y3_1 + 1, x3_2 - 1, y3_1 + 1
				Line x3_1, y3_1 + 2, x3_1, y3_2 : Line x3_1 + 1, y3_1 + 2, x3_1 + 1, y3_2 - 1
				Color 32, 32, 32
				Line x3_1 + 2, y3_2 - 1, x3_2, y3_2 - 1 : Line x3_1 + 1, y3_2, x3_2, y3_2
				Line x3_2 - 1, y3_1 + 2, x3_2 - 1, y3_2 - 2 : Line x3_2, y3_1 + 1, x3_2, y3_2 - 2
				SetFont fntStandardLarge 
				If btnTextColor = 0 Then Color 32, 32, 32 Else Color 255, 255, 255
				Text x3_1 + (ImageWidth(gfxActiveBtn) / 2) - (StringWidth (btntextCancel$) / 2), y3_1, btntextCancel$
		End Select
		SetBuffer (BackBuffer())
	ElseIf gfxGeneric <> 0 And boolean = False ; passing in a ready drawn graphic with standard buttons
		custom_width = ImageWidth(gfxGeneric)
		custom_hight = ImageHeight(gfxGeneric)
		Select number	; (standard graphic without buttons dealt with in first part of statement)
			Case 1 ; coords for one button - ok
				x1_1 = custom_width / 2 - 65 : y1_1 = custom_hight - 40
				x1_2 = x1_1 + ImageWidth(gfxActiveBtn) - 1 : y1_2 = y1_1 + ImageHeight(gfxActiveBtn) - 1
			Case 2 ; coords for two buttons 'YES' and 'NO'
				x1_1 = 9 : y1_1 = custom_hight - 40
				x1_2 = x1_1 + ImageWidth(gfxActiveBtn) - 1 : y1_2 = y1_1 + ImageHeight(gfxActiveBtn) - 1
				x2_2 = custom_width - 9 : y2_1 = custom_hight - 40
				x2_1 = x2_2 - ImageWidth(gfxActiveBtn) + 1 : y2_2 = y2_1 + ImageHeight(gfxActiveBtn) - 1
			Case 3 ; coords for three buttons 'YES', 'NO' and 'CANCEL'
				x1_1 = 9 : y1_1 = custom_hight - 40
				x1_2 = x1_1 + ImageWidth(gfxActiveBtn) - 1 : y1_2 = y1_1 + ImageHeight(gfxActiveBtn) - 1
				x2_1 = custom_width / 2 - 63 : y2_1 = custom_hight - 40
				x2_2 = x2_1 + ImageWidth(gfxActiveBtn) - 1 : y2_2 = y2_1 + ImageHeight(gfxActiveBtn) - 1
				x3_2 = custom_width - 9 : y3_1 = custom_hight - 40
				x3_1 = x3_2 - ImageWidth(gfxActiveBtn) + 1 : y3_2 = y3_1 + ImageHeight(gfxActiveBtn) - 1
		End Select
	EndIf
	CopyRect 0, 0, GraphicsWidth(), GraphicsHeight(), 0, 0, FrontBuffer(), ImageBuffer(gfxFullScreen) 
	SetFont fntGeneric	
	If number < 0 And number > 3
		number = 0 : message$ = "'number' passed was outside range - allowed are 0 to 3."
	EndIf
	dly = 5000 ; delay for case 0
	x = ((GraphicsWidth() / 2) - (ImageWidth(gfxGeneric)) / 2)
	xs = GraphicsWidth() / 2
	ys = GraphicsHeight() / 2
	y = ((GraphicsHeight() / 2) - (ImageHeight(gfxGeneric)) / 2)
	sw = StringWidth(message$)
	sh = StringHeight(message$)
	iw = ImageWidth(gfxGeneric) - 6 ; the 6 reduction allows for border
	ih = ImageHeight(gfxGeneric)
	DrawImage gfxFullScreen, 0, 0
	DrawImage gfxGeneric, x, y 
	If sw <= iw
		Color 255,255,0
		Text xs, ys - sh, message$, True, False
		dly = 3000
	Else
		If sw / 2 < iw - 15
			lenth_ok = False
			For a = 1 To Len(message$)
				If Mid$(message$, a, 1) = " " Or Mid$(message$, a, 1) = "," Or Mid$(message$, a, 1) = "." Or Mid$(message$, a, 1) = ":" Or Mid$(message$, a, 1) = ":" Or Mid$(message$, a, 1) = "!"
					message1$ = Left$(message$, a)
					message2$ = Right$(message$, Len(message$) - a)
					If StringWidth(message1$) <= iw And StringWidth(message2$) <= iw
						If Mid$(message$, a, 1) = " "
							message1$ = Left$(message$, a - 1)
						EndIf
						lenth_ok = True
						Exit
					EndIf
				EndIf
			Next
			Color 255,255,0 
			If number > 0
				sw = StringWidth (message1$)
				Text x + ((iw + 6 - sw) / 2), y + 20, message1$
				sw = StringWidth (message2$)
				Text x + ((iw + 6 - sw) / 2), y + 50, message2$
			Else
				sw = StringWidth (message1$)
				Text x + ((iw + 6 - sw) / 2), y + 30, message1$
				sw = StringWidth (message2$)
				Text x + ((iw + 6 - sw) / 2), y + 60, message2$
			EndIf
		ElseIf sw / 3 < iw
			lenth_ok = False : adjust = 25
			Repeat
				For a = adjust To Len(message$)
					If Mid$(message$, a, 1) = " " Or Mid$(message$, a, 1) = "," Or Mid$(message$, a, 1) = "." Or Mid$(message$, a, 1) = ":" Or Mid$(message$, a, 1) = ":" Or Mid$(message$, a, 1) = "!"
						message1$ = Left$(message$, a)
						messagetemp$ = Right$(message$, Len(message$) - a)
						If Mid$(message$, a, 1) = " "
							message1$ = Left$(message$, a - 1)
						EndIf
						If StringWidth(message1$) <= iw 
							Exit
						EndIf
					EndIf	
				Next		
				For a = 1 To Len(messagetemp$)
					If Mid$(messagetemp$, a, 1) = " " Or Mid$(messagetemp$, a, 1) = "," Or Mid$(messagetemp$, a, 1) = "." Or Mid$(messagetemp$, a, 1) = ":" Or Mid$(messagetemp$, a, 1) = ":" Or Mid$(messagetemp$, a, 1) = "!"
						message2$ = Left$(messagetemp$, a)
						message3$ = Right$(messagetemp$, Len(messagetemp$) - a)
						If StringWidth(message1$) <= iw And StringWidth(message2$) <= iw And StringWidth(message3$) <= iw
							If Mid$(message2$, a, 1) = " "
								message2$ = Left$(messagetemp$, a - 1)
							EndIf
							lenth_ok = True
							Exit
						EndIf
					EndIf
				Next
				adjust = adjust + 1
			Until lenth_ok = True Or adjust > Len(message$)
			Color 255,255,0 
			If adjust > Len(message$)
				sw = StringWidth ("Message Failed!")
				Text x + ((iw + 6 - sw) / 2), y + 80, "Message Failed!"
			Else
				If number > 0
					sw = StringWidth (message1$)
					Text x + ((iw + 6 - sw) / 2), y + 8, message1$
					sw = StringWidth (message2$)
					Text x + ((iw + 6 - sw) / 2), y + 30, message2$
					sw = StringWidth (message3$)
					Text x + ((iw + 6 - sw) / 2), y + 52, message3$
				Else
					sw = StringWidth (message1$)
					Text x + ((iw + 6 - sw) / 2), y + 20, message1$
					sw = StringWidth (message2$)
					Text x + ((iw + 6 - sw) / 2), y + 50, message2$
					sw = StringWidth (message3$)
					Text x + ((iw + 6 - sw) / 2), y + 80, message3$
				EndIf
			EndIf
		Else
			sw = StringWidth ("Message too Long")
			Text x + ((iw + 6 - sw) / 2), y + 40, "Message too Long"
		EndIf
	EndIf
	reply = 0
	Select number
		Case 0	; requires text to display message - no buttons
			Flip 0: Delay dly
		Case 1	; requires text to display message - one button 'OK'
			CopyRect 0, 0, GraphicsWidth(), GraphicsHeight(), 0, 0, BackBuffer(), ImageBuffer(gfxFullScreen) 
			x1_1 = x1_1 + x : y1_1 = y1_1 + y : x1_2 = x1_2 + x - 1 : y1_2 = y1_2 + y - 1
			Repeat
				ML = MouseHit(1)
				If ML = True And MouseX() > x1_1 And MouseX() < x1_2 And MouseY() > y1_1 And MouseY() < y1_2
					DrawImage gfxFullScreen, 0, 0
					DrawImage gfxActiveBtn, x1_1, y1_1
					Flip 0 : Delay 200
					DrawImage gfxFullScreen, 0, 0
					Flip 0 : Delay 100
					reply = 1 ; 1 = ok
				EndIf
				DrawImage gfxFullScreen, 0, 0
				Flip 0
			Until reply <> 0
		Case 2	; requires text to display message - two buttons 'YES' and 'NO'
			CopyRect 0, 0, GraphicsWidth(), GraphicsHeight(), 0, 0, BackBuffer(), ImageBuffer(gfxFullScreen) 
			x1_1 = x1_1 + x : y1_1 = y1_1 + y : x1_2 = x1_2 + x : y1_2 = y1_2 + y
			x2_1 = x2_1 + x : y2_1 = y2_1 + y : x2_2 = x2_2 + x : y2_2 = y2_2 + y
			Repeat
				ML = MouseHit(1)
				If ML = True And MouseX() > x1_1 And MouseX() < x1_2 And MouseY() > y1_1 And MouseY() < y1_2
					DrawImage gfxFullScreen, 0, 0
					DrawImage gfxActiveBtn, x1_1, y1_1
					Flip 0 : Delay 200
					DrawImage gfxFullScreen, 0, 0
					Flip 0 : Delay 100
					reply = 2 : ML = 0 ; 2 = yes
				EndIf
				If ML = True And MouseX() > x2_1 And MouseX() < x2_2 And MouseY() > y2_1 And MouseY() < y2_2
					DrawImage gfxFullScreen, 0, 0
					DrawImage gfxActiveBtn, x2_1, y2_1
					Flip 0 : Delay 200
					DrawImage gfxFullScreen, 0, 0
					Flip 0 : Delay 100
					reply = 3 : ML = 0 ; 3 = no
				EndIf
				DrawImage gfxFullScreen, 0, 0
				Flip 0
			Until reply <> 0
		Case 3	; requires text to display message - three buttons 'YES', 'NO' and 'CANCEL'
			CopyRect 0, 0, GraphicsWidth(), GraphicsHeight(), 0, 0, BackBuffer(), ImageBuffer(gfxFullScreen) 
			x1_1 = x1_1 + x : y1_1 = y1_1 + y : x1_2 = x1_2 + x : y1_2 = y1_2 + y
			x2_1 = x2_1 + x : y2_1 = y2_1 + y : x2_2 = x2_2 + x : y2_2 = y2_2 + y
			x3_1 = x3_1 + x : y3_1 = y3_1 + y : x3_2 = x3_2 + x : y3_2 = y3_2 + y
			Repeat
				ML = MouseHit(1)
				If ML = True And MouseX() > x1_1 And MouseX() < x1_2 And MouseY() > y1_1 And MouseY() < y1_2
					DrawImage gfxFullScreen, 0, 0
					DrawImage gfxActiveBtn, x1_1, y1_1
					Flip 0 : Delay 200
					DrawImage gfxFullScreen, 0, 0
					Flip 0 : Delay 100
					reply = 2 : ML = 0 ; 2 = yes
				EndIf
				If ML = True And MouseX() > x2_1 And MouseX() < x2_2 And MouseY() > y2_1 And MouseY() < y2_2
					DrawImage gfxFullScreen, 0, 0
					DrawImage gfxActiveBtn, x2_1, y2_1
					Flip 0 : Delay 200
					DrawImage gfxFullScreen, 0, 0
					Flip 0 : Delay 100
					reply = 3 : ML = 0 ; 3 = no
				EndIf
				If ML = True And MouseX() > x3_1 And MouseX() < x3_2 And MouseY() > y3_1 And MouseY() < y3_2
					DrawImage gfxFullScreen, 0, 0
					DrawImage gfxActiveBtn, x3_1, y3_1
					Flip 0 : Delay 200
					DrawImage gfxFullScreen, 0, 0
					Flip 0 : Delay 100
					reply = 4 : ML = 0 ; 4 = cancel
				EndIf
				DrawImage gfxFullScreen, 0, 0
				Flip 0
			Until reply <> 0
		Default
			Notify "number other than specified in function AdviceWindowOption()!"
	End Select
	FreeImage gfxGeneric
	If fontfree = True Then FreeFont fntGeneric
	If fontfreelarge = True FreeFont fntStandardLarge
	FreeImage gfxActiveBtn
	FreeImage gfxFullScreen
	Return reply
End Function

AppTitle "test of Options Function V0.1"
SeedRnd MilliSecs()

Const C_screenWidth		= 800		; width of game screen 
Const C_screenHeight	= 600		; height of game screen 
Const C_screenDepth		= 32		; depth of game screen
Const C_screenType		= 2			; type is windowed or full screen - 1 = full screen, 2 = windowed

Global fntStandard = LoadFont("Comic Sans MS",24, False, False, False)
Global fntSmallB = LoadFont("Comic Sans MS",48, True, False, False)
Global gfxTest = LoadImage ("Advice window test image.bmp") ; change this to test own graphics

Graphics C_screenWidth, C_screenHeight, C_screenDepth, C_screenType
ClsColor 0, 0, 0
SetBuffer(BackBuffer())

.again
Repeat
	Cls
	; what the function is passed - (number, gfxGeneric, custom_width, custom_hight, fntGeneric, btnTextColor, message$, boolean)
	
	SetFont fntSmallB : Color 255, 255, 255
	Text C_screenWidth / 2, C_screenHeight / 6, "Press keys 1 - 4", True, False
	; press a key to select a window
	Select True ; all options used here display as defaults - except text, default text is ""
		Case KeyHit(2) ; '1' key
			answer = AdviceWindowOption(0, 0, 0, 0, 0, 0, "Default Font", False) ;  no buttons
			mills = MilliSecs() : FlushKeys
		Case KeyHit(3) ; '2' key
			answer = AdviceWindowOption(1, 0, 0, 0, 0, 0, "Default Font", False) ;  one button 'ok'
			mills = MilliSecs() : FlushKeys
		Case KeyHit(4) ; '3' key
			answer = AdviceWindowOption(2, 0, 0, 0, 0, 0, "Default Font", False) ;  two button 'yes' & 'no'
			mills = MilliSecs() : FlushKeys
		Case KeyHit(5) ; '4' key
			answer = AdviceWindowOption(3, 0, 0, 0, 0, 0, "Default Font", False) ;  three buttons 'yes', 'no' & 'cancel'
			mills = MilliSecs() : FlushKeys
	End Select
	; outputs what response was given by user
	Select answer
		Case 0 ; no button clicked - normally not required to use return from function
			Text C_screenWidth / 2, C_screenHeight / 2, "No Buttons to 'click'", True, False
		Case 1 ; ok button
			; code here would be for what to do with answer (return)
			Text C_screenWidth / 2, C_screenHeight / 2, "OK Button", True, False
		Case 2 ; yes button
			; code here would be for what to do with answer (return)
			Text C_screenWidth / 2, C_screenHeight / 2, "Yes Button", True, False
		Case 3 ; no button
			; code here would be for what to do with answer (return)
			Text C_screenWidth / 2, C_screenHeight / 2, "No Button", True, False
		Case 4 ; cancel button
			; code here would be for what to do with answer (return)
			Text C_screenWidth / 2, C_screenHeight / 2, "Cancel Button", True, False
	End Select
	; resets variable 'answer' to stop displaying
	If mills + 1000 < MilliSecs()
		answer = 999
	EndIf
	Flip 

Until KeyHit(1)

; font changed from default
answer = AdviceWindowOption(2, 0, 0, 0, fntStandard, 0, "Please confirm you wish to quit program?", False) ;  two button 'yes' & 'no'

If answer = 3 Then Goto again

If answer = 2
	FreeFont fntStandard : FreeFont fntSmallB : FreeImage gfxTest
EndIf

EndGraphics : End

Include "AdviceWindowOption.bb" ; ensure correct path for include function or copy and paste here instead


Comments :


Steven Noyce(Posted 1+ years ago)

 I am confused.  What is up with the include at the bottom?  Why does this not work if I copy and paste?  I admit I did not spend a whole lot of time trying to figure out what was wrong, but I did sped some time and couldn't figure it out.Help!


mv333(Posted 1+ years ago)

 <div class="quote"> What is up with the include at the bottom? </div>The AdviceWindowOption function is already included in the code, so just remove that last line.<div class="quote"> Why does this not work if I copy and paste? </div>Because it's for BlitzPlus. It works for me in Blitz3D, if i remove the "Notify" line, and the "SetFont fntSmallB" line. I don't understand why that second one kept giving me a "Font does not exist" Runtime Error. Maybe someone else can explain that one......