Non-MaxGUI Resizable window?

BlitzMax Forums/BlitzMax Beginners Area/Non-MaxGUI Resizable window?

bizzlebazreese(Posted 2016) [#1]
I tried googling this forum, and I found a few responses but couldn't understand how this is done.

I want to know how I'd do this from scratch, anyone know of a tutorial? Do I "Include" the win32 API or something? Can blitzmax import and read raw c++ cpp and headers files or is there a guide to importing regular c++ libs for use in blitzmax maybe?

anyway, MaxGUI is nice and whatever, but I dont know if I could figure them out.

Graphics(params) seems very simple compared to working inside TGadgets which can become windows..... or 10 other things.. but im confused, do all TGadgets work inside one renderer element or what/ does it work off a heirchy of Gadgets, such as the first canvas TGadget or first TGadget which returns a canvas becomes the master rendering element that parents all the other child TGadget elements?

anyway my original questions is how can I have a simple resizable window without using MAxGUI since I read its possible but didnt understand the responses.


Midimaster(Posted 2016) [#2]
Here is a minimal solution with MaxGUI:

This sample has only one window and inside a canvas, which can be used very simple:
SuperStrict

Import MaxGUI.Drivers 

Global Window:TGadget=CreateWindow("TEST",100,100,400,400)
Global Canvas:Tgadget=CreateCanvas(0,0,1920,1080,Window)
Global MausHit%, MausX%, MausY%
CreateTimer 10

While WaitEvent()
   Select EventID()
	Case EVENT_KEYDOWN
			Print "KKeydown" + EventData()
	'Case EVENT_KEYUP
 
  	Case EVENT_TIMERTICK
			MainLoop
   	Case EVENT_GADGETPAINT
			MainLoop		
   	Case EVENT_WINDOWCLOSE
			QuitMe
   	Case EVENT_APPTERMINATE
			QuitMe
	Case EVENT_MENUACTION
  			RedrawGadget Canvas
	'Case EVENT_GADGETACTION

  	Case EVENT_MOUSEDOWN 
			MausHit=1
	Case EVENT_MOUSEUP
			MausHit=0
 	Case EVENT_MOUSEMOVE 
			MausX=EventX()
			MausY=EventY()
 	'Case EVENT_MOUSELEAVE

	Case EVENT_WINDOWSIZE
			ResizeMe
	Default
		Print  "EVENT= " + 		EventID()
	End Select
Wend



Function MainLoop()
			SetGraphics CanvasGraphics(Canvas)
			SetAlpha 1
			SetColor 255,255,255
			SetScale 1,1
			Cls
			'**** your code here: **********************************************************			
				For Local i%=0 To 100
					DrawOval Rand(0,GadgetWidth(Window)), Rand(0,GadgetHeight(Window)),5,5
				Next
				SetColor 255,0,0
				If MausHit=1
					Print "Maus " + MausX +" " + MausY
					DrawOval MausX-15,MausY-15,30,30
				EndIf
			'*********************************************************		

			Flip 0
End Function



Function QuitMe()
	FreeGadget Canvas
   	End
End Function



Function ResizeMe()
		SetGadgetLayout Canvas , 1,1,1,1
		SetGadgetShape Canvas, 0 , 0 , GadgetWidth(Window) , GadgetHeight(Window)
		RedrawGadget Canvas
End Function


Put your drawing code between CLS and FLIP like your are used to do. The DEFAULT section helps to to identify unkonwn events


Kryzon(Posted 2016) [#3]
The TGadget type is extended by each of the MaxGUI "drivers" (which are modules that contain platform-specific code), and these extended gadgets represent actual gadgets of the native UI system (on Windows I think it's based on Kernel32, User32 and GDI32).

The gadgets that your MaxGUI application uses are always native, wrapped in that TGadget abstraction.
Without using MaxGUI, to get a resizable window you would use an Extern "win32" block to get the system functions necessary to create those UI objects, which is the same that MaxGUI does.

So you should use MaxGUI because it'll save you work. But you can "hack" into it to get the behaviour you want: the specialised TWindowsGadget type has a hWnd field, for example, that you can obtain with QueryGadget() and use with native functions.


Kryzon(Posted 2016) [#4]
On using external libraries, take a look at how other modules are doing it. They Import the source files and use Extern:

https://github.com/maxmods/bah.mod/blob/master/cairo.mod/externs.bmx

You need MinGW configured properly to be able to compile external source files.