Code archives/Miscellaneous/Resize and Maximize Blitz Window!

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

Download source code

Resize and Maximize Blitz Window! by fredborg2003
Shows how you can make a resizeable window in Blitz2D and Blitz3D, without the contents get scaled.

Take a close look at the Viewport command in the Blitz Docs. You will probably need this to clip your graphics, so you don't waste any power on drawing outside the screen!

At the top of the code is a userlib definition, put this in your userlib folder!

Have fun!
;
; User32.decls - place in your userlibs folder
; And uncomment the commands.
;
;.lib "user32.dll"
;
;User32_GetActiveWindow%():"GetActiveWindow"
;User32_SetWindowLong% (hwnd%, nIndex%, dwNewLong%) : "SetWindowLongA"
;User32_GetSystemMetrics% (nIndex%) : "GetSystemMetrics"
;User32_MoveWindow% (hwnd%, x%, y%, nWidth%, nHeight%, bRepaint%) : "MoveWindow"
;User32_GetWindowRect% (hwnd%, lpRect*) : "GetWindowRect"
;User32_GetClientRect% (hwnd%, lpRect*) : "GetClientRect"
;User32_ClientToScreen% (hwnd%, lpwndpl*): "ClientToScreen"
;User32_ScreenToClient% (hwnd%, lpwndpl*): "ScreenToClient"
;User32_GetCursorPos%( lpwndpl* ):"GetCursorPos"

Type WinPoint
    Field X,Y
End Type

Type WinRect
	Field x,y,w,h
End Type

; Desktop Size
Const SM_CXSCREEN=0
Const SM_CYSCREEN=1

; Set Window Long 
Const GWL_WNDPROC		=(-4)
Const GWL_HINSTANCE		=(-6)
Const GWL_HWNDPARENT	=(-8)
Const GWL_STYLE			=(-16)
Const GWL_EXSTYLE		=(-20)
Const GWL_USERDATA		=(-21)
Const GWL_ID			=(-12)

; Window Style
Const WS_OVERLAPPED		=$0
Const WS_POPUP			=$80000000
Const WS_CHILD			=$40000000
Const WS_MINIMIZE		=$20000000
Const WS_VISIBLE		=$10000000
Const WS_DISABLED		=$8000000
Const WS_CLIPSIBLINGS	=$4000000
Const WS_CLIPCHILDREN	=$2000000
Const WS_MAXIMIZE		=$1000000
Const WS_CAPTION		=$C00000
Const WS_BORDER			=$800000
Const WS_DLGFRAME		=$400000
Const WS_VSCROLL		=$200000
Const WS_HSCROLL		=$100000
Const WS_SYSMENU		=$80000
Const WS_THICKFRAME		=$40000
Const WS_GROUP			=$20000
Const WS_TABSTOP		=$10000
Const WS_MINIMIZEBOX	=$20000
Const WS_MAXIMIZEBOX	=$10000
Const WS_TILED			=WS_OVERLAPPED
Const WS_ICONIC			=WS_MINIMIZE
Const WS_SIZEBOX		=WS_THICKFRAME
Const WS_OVERLAPPEDWINDOW=(WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
Const WS_TILEDWINDOW	=WS_OVERLAPPEDWINDOW
Const WS_POPUPWINDOW	=(WS_POPUP Or WS_BORDER Or WS_SYSMENU)
Const WS_CHILDWINDOW	=(WS_CHILD)

; Window Messages
Const SW_HIDE=0
Const SW_SHOWNORMAL=1
Const SW_NORMAL=1
Const SW_SHOWMINIMIZED=2
Const SW_SHOWMAXIMIZED=3
Const SW_MAXIMIZE=3
Const SW_SHOWNOACTIVATE=4
Const SW_SHOW=5
Const SW_MINIMIZE=6
Const SW_SHOWMINNOACTIVE=7
Const SW_SHOWNA=8
Const SW_RESTORE=9
Const SW_SHOWDEFAULT=10
Const SW_MAX=10

Type win
	Field TempPos.WinPoint
	Field MousePos.WinPoint
	Field WindowRect.WinRect
	Field DesktopW,DesktopH
	Field hWindow
	Field WindowStyle
	Field W,H,X,Y
	Field MX,MY,MZ,MSX,MSY,MSZ
End Type

;
; This function initializes the actual blitz window
Function InitBlitzWindow()

	; Prepare custom types
	win\TempPos.WinPoint	= New WinPoint
	win\MousePos.WinPoint	= New WinPoint
	win\WindowRect.WinRect	= New WinRect
	
	; Get Desktop Dimensions
	win\DesktopW = User32_GetSystemMetrics(SM_CXSCREEN)
	win\DesktopH = User32_GetSystemMetrics(SM_CYSCREEN)

	; Initialize Graphics Window
	Graphics3D win\DesktopW,win\DesktopH,0,2
	
	; Get hWnd pointer for the Blitz Window
	win\hWindow = User32_GetActiveWindow()

	; Set the Blitz Window Style
	win\WindowStyle = WS_VISIBLE + WS_BORDER + WS_MINIMIZEBOX + WS_MAXIMIZEBOX + WS_SIZEBOX + WS_SYSMENU + WS_DLGFRAME;+ WS_THICKFRAME
	User32_SetWindowLong(win\hWindow,GWL_STYLE,win\WindowStyle)
	
	; Resize and center Blitz Window	
	User32_MoveWindow(win\hWindow,(win\DesktopW/2)-(640/2),(win\DesktopH/2)-(480/2),640,480,True)

End Function


Function UpdateBlitzWindow()

	User32_GetWindowRect(win\hWindow,win\WindowRect)
	
	win\WindowRect\w = win\WindowRect\w-win\WindowRect\x
	win\WindowRect\h = win\WindowRect\h-win\WindowRect\y
			
	If win\WindowRect\w<320
		toosmall = True
		win\WindowRect\w = 320
	End If
	If win\WindowRect\h<240
		toosmall = True
		win\WindowRect\h = 240
	End If
	If toosmall
		User32_MoveWindow(win\hWindow,win\WindowRect\x,win\WindowRect\y,win\WindowRect\w,win\WindowRect\h,True)	
	End If
	
	; Get Screen position of pixel 0,0
	win\TempPos\x = 0
	win\TempPos\y = 0
	User32_ClientToScreen(win\hWindow,win\TempPos)
	win\X = win\TempPos\x
	win\Y = win\TempPos\y
	
	; Get Width and Height of the Blitz Window
	User32_GetClientRect(win\hWindow,win\WindowRect)
	win\W = win\WindowRect\w
	win\H = win\WindowRect\h
	Viewport 0,0,win\W,win\H
	
	; Store old mouse position
	win\MSX = win\MX
	win\MSY = win\MY
	win\MSZ = win\MZ
		
	; Get the mouse position (even if mouse is outside the Blitz Window)
	User32_GetCursorPos(win\MousePos)
	User32_ScreenToClient(win\hWindow,win\MousePos)
	win\MX		 = win\MousePos\x
	win\MY		 = win\MousePos\y
	win\MZ		 = MouseZ()

	; Update Mouse Speed
	win\MSX = win\MX-win\MSX
	win\MSY = win\MY-win\MSY
	win\MSZ = win\MZ-win\MSZ
	
End Function

; Example

Global win.win = New win
InitBlitzWindow()
SetBuffer BackBuffer()

Repeat
	Cls
	UpdateBlitzWindow()
	Text 0, 0,"Window Width  - "+win\W
	Text 0,10,"Window Height - "+win\H
	Text 0,20,"Window X - "+win\X
	Text 0,30,"Window Y - "+win\Y
	Text 0,40,"Mouse X - "+win\MX
	Text 0,50,"Mouse Y - "+win\MY
	Flip
Until KeyHit(1)
End

Comments

Red2004
Thanx,Thanx,Thanx :)


Richard Betson2004
Yes Nice! ...also much thanks. :)

L8r,


ShadowTurtle2004
Its nice code. I use it now :)

(ps fredborg: thanks!)


Code Archives Forum