Code archives/BlitzPlus Gui/GUI Application Template

This code has been declared by its author to be Public Domain code.

Download source code

GUI Application Template by JoshK2009
Template to get a GUI application started, the right way
SuperStrict

Framework maxgui.win32maxgui
Import brl.eventqueue

AppTitle=StripAll(AppFile)

Global MainWindow:TGadget

MainWindow=CreateWindow(AppTitle,100,100,640,480,Null,WINDOW_TITLEBAR|WINDOW_STATUS|WINDOW_MENU|WINDOW_CLIENTCOORDS)

Local root:TGadget
Local menu:TGadget

root=WindowMenu(MainWindow)
menu=CreateMenu("File",0,root)
CreateMenu("Open",0,menu,KEY_O,MODIFIER_COMMAND)
CreateMenu("Save",0,menu)
CreateMenu("",0,menu)
CreateMenu("Exit",0,menu)
UpdateWindowMenu(MainWindow)

AddHook EmitEventHook,MainHook
AddHook EmitEventHook,MenuHook

Repeat; WaitEvent() ; Forever

Function MainHook:Object(id:Int,data:Object,context:Object)
	If data=Null Return Null
	Local event:TEvent=TEvent(data)
	Select event.id
		Case EVENT_WINDOWCLOSE
			Select event.source
				Case MainWindow
					CloseProgram()
			EndSelect
	End Select
	Return data
EndFunction

Function MenuHook:Object(id:Int,data:Object,context:Object)
	If data=Null Return Null
	Local event:TEvent=TEvent(data)
	Select event.id
		Case EVENT_MENUACTION
			Select GadgetText(TGadget(event.source))
				Case "Exit"
					CloseProgram()
			EndSelect
	End Select
	Return data
EndFunction

Function CloseProgram()
	Select Proceed("Are you sure you want to quit?")
		Case 1
			End
		Case 0,- 1
			Return
	EndSelect
EndFunction

Comments

SebHoll2009
Template to get a GUI application started, the right way.

Framework maxgui.win32maxgui

Are you missing two letters on the end, there? :P

Btw, if you replace...

Repeat; WaitEvent() ; Forever
...with...

Repeat;WaitSystem();Forever
...then you no longer need to import BRL.EventQueue. ;-)

Edit: Oh and finally... I would probably use Confirm() instead of Proceed() here...

Function CloseProgram()
	Select Proceed("Are you sure you want to quit?")
		Case 1
			End
		Case 0,- 1
			Return
	EndSelect
EndFunction
...as the user, when presented with the dialog, may get confused wondering the difference between 'No' and 'Cancel', despite them meaning the same thing in the code.


SebHoll2009
Also, becareful with your hooks. You'll get a runtime error if anything other than a TEvent is accidentally emitted (not likely, but its best to be safe). See below for a fix:

Function MainHook:Object(id:Int,data:Object,context:Object)
	Local event:TEvent=TEvent(data)
	If Not event Then Return data
	Select event.id
		Case EVENT_WINDOWCLOSE
			Select event.source
				Case MainWindow
					CloseProgram()
			EndSelect
	End Select
	Return data
EndFunction
Function MenuHook:Object(id:Int,data:Object,context:Object)
	Local event:TEvent=TEvent(data)
	If Not event Then Return data
	Select event.id
		Case EVENT_MENUACTION
			Select GadgetText(TGadget(event.source))
				Case "Exit"
					CloseProgram()
			EndSelect
	End Select
	Return data
EndFunction
This should be safe under most, if not all, circumstances.


Grisu2014
Updated the code with all the suggestions from above.

SuperStrict

Framework Maxgui.Drivers
'Import brl.eventqueue

AppTitle=StripAll(AppFile)

Global MainWindow:TGadget

MainWindow=CreateWindow(AppTitle,100,100,640,480,Null,WINDOW_TITLEBAR|WINDOW_STATUS|WINDOW_MENU|WINDOW_CLIENTCOORDS)

Local root:TGadget
Local menu:TGadget

root=WindowMenu(MainWindow)
menu=CreateMenu("File",0,root)
CreateMenu("Open",0,menu,KEY_O,MODIFIER_COMMAND)
CreateMenu("Save",0,menu)
CreateMenu("",0,menu)
CreateMenu("Exit",0,menu)
UpdateWindowMenu(MainWindow)

AddHook EmitEventHook,MainHook
AddHook EmitEventHook,MenuHook

Repeat;WaitSystem();Forever

Function MainHook:Object(id:Int,data:Object,context:Object)
	Local event:TEvent=TEvent(data)
	If Not event Then Return data
	Select event.id
		Case EVENT_WINDOWCLOSE
			Select event.source
				Case MainWindow
					CloseProgram()
			EndSelect
	End Select
	Return data
EndFunction

Function MenuHook:Object(id:Int,data:Object,context:Object)
	Local event:TEvent=TEvent(data)
	If Not event Then Return data
	Select event.id
		Case EVENT_MENUACTION
			Select GadgetText(TGadget(event.source))
				Case "Exit"
					CloseProgram()
			EndSelect
	End Select
	Return data
EndFunction

Function CloseProgram()
	Select Confirm("Are you sure you want to quit?")
		Case 1
			End
		Case 0,- 1
			Return
	EndSelect
EndFunction



Code Archives Forum