Code archives/Miscellaneous/Win32 Access Through Blitz DLL Use Visual C++

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

Download source code

Win32 Access Through Blitz DLL Use Visual C++ by ronbravo2002
I just wanted to post a couple of tips that I thought might help other people
about using the Blitz DLL function to access Win32 system. I didn't want to
rite a tutorial or anything because I don't think I'm that great a programmer.
So I decided to post some tips that have helped me and will hopefully help others.
Its recommended that you know something about Visual C++ and how Windows.
If you don't just do like I did and search the net and read books for helpful info.
Well here goes. If you have any other tips feel free to add them to this thread. Thanks.

Tip #1 - To Blitz or Not to Blitz
When creating a Window you have a couple of options. The two I use is to either
create a new window all together or Manipulate the Blitz3D Window from the
exe you make in Blitz :
- To Create a new window you'll have to create a windows class,
register it, and then create the window.
- To manipulate the Blitz window of an Exe. This is my preffered way because
then you can add menus and dialog boxes to the Blitz window. Very Cool
Stuff. All you have to do is Use the " FindWindow" Function which help
you get the Blitz window handle.and "SetWindowLong" function which
can help you set the style of thewindows function like adding scroll
bars, increasing window frame thinckness and other thing.
Note: if you do use the "SetWindowLong" function don't forget to use
the "ShowWindow" and "UpdateWindow" commands to get
windows to refresh the window

Tip#2 - Use Hook Functions
Window of course is a event driven system using messsages to send events to a window,so one of the biggest problems I had was getting events like a menu being selected or the mouse moving. Reason for this was because Windows will not let you look at the messages being sent to another Message Processor of another Window. So if you use the method from above where you want to manipulatethe Blitz window the Bad News is you won't be able to get any of the Events from the Blitz Window Unless you set up a HookFunction. A HookFunction is
basicly a function that you tell windows to setup and depending on the
function manipulates the Current Event Message being sent by windows. Look Up HookFunctions in the Visual C++ Help files to get
more help. Another Bad thing about using Hook Functions is that it
doesn't work well with the Blitz IDE. When ever you exit a program you just ran in the Blitz IDE and error message comes up and the Blitz IDE terminates. The way Around this is to make your programs so that you can test the Blitz portion of it !!without the DLL!! in the Blitz IDE and make sure the Blitz Program works. Then create an exe. Then open up the Visual C++ IDE. Goto; "Project"--->"Settings"---->"Debug" Tab. And In the "Executable for debug session: " click the little arrow on the far right to open the explorer and search for your exe and select it. Once the exe is set then
everytime you hit F5 in The Visual C++ IDE your Blitz exe will be run with the DLL functions from Visual C++ implemented, including your hook function, so then you test out your DLLs and make sure they work. You can keep the Blitz IDE open and when ever you make changes to your Blitz program just recompile the exe. REMEMBER !!!! DO NOT RUN THE BLITZ PROGRAM IN THE BLITZ DLL IF YOUR DLL CONTAINS A HOOK FUNCTION !!!!! You need to compile the blitz program and run it from Visual C++.

One other method to get windows events from the Blitz window is to use "SetWindowsLong" and change the Message Processor that Blitz programs come built with to a Message Processor function you define. I don't recommend doing it this way becuase the Message Processor that comes with Blitz retrives valuble things like Keyboard input and other things that I can't tell you without looking at the code. So if you decide to use this method be very carefull.

If have any questions about the tips,the code, or anything else email me at:
bravoronald@...

I will do my best to try and help you out but remember I'm not an expert programmer and may not be able to help you.
HERE IS THE VISUAL C++ CODE 

//////////////////////////////////////////////////////
//HEADER FILE
//////////////////////////////////////////////////////
//INCLUDES
#include <windows.h>						//Include the windows standard files
#include <stdlib.h>
#include "commdlg.h"						//Include for windows common dialog boxes
#include "resource.h"						//Include the resource file



//////////////////////////////////////////////////////
//GLOBALS
//////////////////////////////////////////////////////
int				Event			=NULL;			//Passed the current event to the Blitz Window
int				DialogType		=NULL;			//Flag for "User" made Dialog Procedures;
int				FileDialogType	=NULL;			//Flag to open either a "Save" or "Open" Dialog
char			StringToSend[256];				//File String Name
char			*TypeList		=NULL			//Holds the string that contains the type list
HWND			BBWin			=NULL;			//Handle to the Blitz Window
HHOOK			hhkHook			=NULL;			//Handle to the hook function
HMENU			MainMenu		=NULL;			//Handle to the Main Menu that will be loaded
HMENU			PopUpMenu		=NULL;			//The popup menu for the mouse
HINSTANCE		DllInstance		=NULL;			//Instance to the Dll loaded into memory for the Blitz App
HINSTANCE		hBBInstance		=NULL;			//Instance of the Blitz Basic Window
OPENFILENAME	ofn; 



//////////////////////////////////////////////////////
//EXPORT FUNCTION DECLORATIONS
//////////////////////////////////////////////////////
//Get the desktop measurements
extern "C"{
_declspec(dllexport) void _cdecl DesktopMetrics( char *in,int in_size,long *out,int out_sz );
}

//////////////////////////////////////////////////////
//End the Win32 Blitz GUI
extern "C"{
_declspec(dllexport) void _cdecl EndWin32( const void *in,int in_size,void *out,int out_sz );
}

//////////////////////////////////////////////////////
//Get the current windows event
extern "C"{
_declspec(dllexport) int _cdecl GetEvent( const void *in,int in_size,void *out,int out_sz );
}

/////////////////////////////////////////////////////
//Get the string the File Path string
extern "C"{
_declspec(dllexport) void _cdecl GetString( const void *in,int in_size,char *out,int out_sz );
}

//message box
extern "C"{
_declspec(dllexport) int _cdecl MsgBox( char *in,int in_size,int *out,int out_sz );
}

/////////////////////////////////////////////////////
//Get the string the File Path string
extern "C"{
_declspec(dllexport) void _cdecl SetTypeList( const void *in,int in_size,char *out,int out_sz );
}

//////////////////////////////////////////////////////
//Start the Win32 Blitz GUI
extern "C"{
_declspec(dllexport) HWND _cdecl StartWin32( const void *in,int in_size,void *out,int out_sz );
}

//////////////////////////////////////////////////////
//Dialog Event Proccesor
extern "C"{
LRESULT _declspec(dllexport)_stdcall CALLBACK DlgProc( HWND hDlg,UINT msg,WPARAM wparam,LPARAM lparam );
}

//////////////////////////////////////////////////////
//Windows Message Processor Hook
extern "C"{
LRESULT _declspec(dllexport)_stdcall CALLBACK MsgProc( int ncode,WPARAM wparam,LPARAM lparam );
}





//////////////////////////////////////////////////////
//INTERNAL FUNCTION DECLORATIONS
//////////////////////////////////////////////////////
//Get File Name
void GetFileInfo( void );

//////////////////////////////////////////////////////
//get a character string
char *string( char *in );

//////////////////////////////////////////////////////
//SOURCE FILE
//////////////////////////////////////////////////////
//INCLUDES
#include "GLITCH GAME EDITOR.H"					//Include the Game Editor Header file

 

//////////////////////////////////////////////////////
//EXPORT FUNCTION DEFINITIONS
/////////////////////////////////////////////////////
//end the gui system
void DesktopMetrics( char *in,int in_size,long *out,int out_sz )
{
	RECT desktop;
	
	SystemParametersInfo( SPI_GETWORKAREA,NULL,&desktop,NULL );

	long screen_width = desktop.right;//GetSystemMetrics( SM_CXSCREEN );	//get the size of the desktop width
	*out = screen_width;
	out++;
	long screen_height = desktop.bottom;//GetSystemMetrics( SM_CYSCREEN );	//get the size of the desktop height
	*out = screen_height;
}

//////////////////////////////////////////////////////
//End the Win32 Blitz GUI
void EndWin32( const void *in,int in_size,void *out,int out_sz )
{
	SendMessage( BBWin,WM_CLOSE,0,0 );				//End Program
}//End the Win32 GUI for Blitz App function

//////////////////////////////////////////////////////
//Get the current windows event
int GetEvent( const void *in,int in_size,void *out,int out_sz )
{	
	int ReturnEvent = Event;					//The Event to return
	Event = 0;									//Set Event Variable to zero
	return( ReturnEvent );						//Return the current event to the Blitz App
}//End the event function

/////////////////////////////////////////////////////
//Get the string the File Path string
void GetString( const void *in,int in_size,char *out,int out_sz )
{
	//Copy the Buffer containing the File Path to 
	//the blitz basiz bank
	memmove( out,StringToSend,256);
}

/////////////////////////////////////////////////////
//message box
int MsgBox( char *in,int in_size,int *out,int out_sz )
{	
	// get the title string
	long next_string = *((long*)in);			//variable for number of string character to recive from *in bank
	char *title = string( in );					//create the title string
	in += (next_string+4);						//move the *in pointer to the next string
	
	//get the msg string
	next_string = *((long*)in);					//get the number of string characters to recive from the *in bank
	char *msg = string( in );					//create the message string
	in += (next_string+4);						// move the *in pointer to the find out the message box button type

	char button = *in;
	
	switch (button)								//show msg box type dependent on button value
	{	
	//create msg box with normal 'OK' button only
	case 0:
		MessageBox( BBWin,msg,title,MB_OK );
		break;
	case 1:
		MessageBox( BBWin,msg,title,MB_OKCANCEL );
		break;
	case 2:
		MessageBox( BBWin,msg,title,MB_YESNO );
		break;
	case 3:
		MessageBox( BBWin,msg,title,MB_YESNOCANCEL );
		break;
	case 4:
		MessageBox( BBWin,msg,title,MB_RETRYCANCEL );
		break;
	case 5:
		MessageBox( BBWin,msg,title,MB_ABORTRETRYIGNORE );
		break;
	}

	//free allocated memory
	free( title );								//free title memory allocated
	free( msg );								//free msg memory allocated

	return(button);
}	//end function

/////////////////////////////////////////////////////
//Get the string the File Path string
void SetTypeList( const void *in,int in_size,char *out,int out_sz )
{
	//Get the type list
	*TypeList = string( in );
}

//////////////////////////////////////////////////////
//Start the Win32 Blitz GUI
HWND StartWin32( const void *in,int in_size,void *out,int out_sz )
{	
	//Get the size of the Desktop
	long screen_width = GetSystemMetrics( SM_CXSCREEN );			//get the size of the desktop width
	long screen_height = GetSystemMetrics( SM_CYSCREEN );

	//Get the Blitz window and setup a menu for the Window
	BBWin		= FindWindow( NULL,"Blitz Basic Main Window" );	//Find the Bliz App Window
	DllInstance = GetModuleHandle( "GLITCH GAME EDITOR.DLL" );	//Get the handle to the DLL
	MainMenu	= LoadMenu( DllInstance,(LPCSTR)MAIN_MENU );	//Load the menu from the DLL handle
	PopUpMenu	= LoadMenu( DllInstance,(LPCSTR)MAIN_POPUPMENU );
	PopUpMenu	= GetSubMenu( PopUpMenu,0 );
	
	//Draw the loaded menu bar
	SetMenu( BBWin,MainMenu );					//Set the load menu as the main window menu
	DrawMenuBar( BBWin );						//Draw the menu to the window

	//Set the hook function to monitor messages
	hhkHook = SetWindowsHookEx( WH_GETMESSAGE,MsgProc,NULL,GetCurrentThreadId() );

	//Set the regular "App" icon for blitz Window
	SetWindowText( BBWin,"GLITCH - Game Editor" );
	SetClassLong( BBWin,GCL_HICON,(LONG)LoadIcon( NULL,IDI_APPLICATION ));
	SetWindowPos( BBWin,HWND_BOTTOM,0,0,screen_width/2,screen_height/2,SWP_SHOWWINDOW | SWP_NOMOVE );
	SetWindowLong( BBWin,GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_MAXIMIZE |	//set the new style of the BlITZ BASIC App
									WS_SIZEBOX );//WS_VSCROLL | WS_HSCROLL | ;

	ShowWindow( BBWin,SW_SHOWNORMAL );								//show the window
	UpdateWindow( BBWin );											//update the window
	return( BBWin );							//Return the handle of the Blitz Window
}//End the Initialize Function

//////////////////////////////////////////////////////
//Dialog Event Proccesor
LRESULT CALLBACK DlgProc( HWND hDlg,UINT msg,WPARAM wparam,LPARAM lparam )
{
	//Change settings for the dialog box depending
	//on the type of dialog box
	switch( DialogType )
	{
	case 1:
		{
			//SetDlgItemText( hDlg,IDD_TYPE_LIST,TEXT("Load Entity Type") );
			break;
		}
	case 2:
		{
			break;
		}
	}//End switch

	//Find out what type of Message is being sent
	switch( msg )
	{
	case WM_COMMAND:							//A menu,button, or key is being hit
		{
			switch(wparam)
			{
			case IDOK:							//ok button
				{
					EndDialog( hDlg,true);		//end the dialog
					return( true );				//send message to exit			
					break;
				}
			case IDCANCEL:
				{
					EndDialog( hDlg,true );		//end the dialog session
					return( true );				//send message to exit
					break;
				}
			}
			break;
		}
	}//End switch

	//return that user has not exited the dialog box yet
	return( false );
}//End Processor Function

//////////////////////////////////////////////////////
//Windows Message Processor Hook
LRESULT CALLBACK MsgProc( int ncode,WPARAM wparam,LPARAM lparam )
{
	//Get the Message sent to windows
	MSG msg = *(PMSG)lparam;
	
	//Decide next action based on type of message
	switch( msg.message )
	{
	case WM_CLOSE:
		{
			DestroyMenu( PopUpMenu );
			DestroyMenu( MainMenu );						//Free the main menu from memory
			UnhookWindowsHookEx( hhkHook );					//Unhook the conected hook function
		}
	//If message is about a menu
	case WM_COMMAND:					
		{
			//Check which menu item was selected
			switch( msg.wParam )
			{
			case ID_MAIN_FILE_NEW:								//Something for "File" was selected
				{
					Event = 2;									//Start a New Program
					break;
				}
			case ID_MAIN_FILE_OPEN:								//Open a Saved File
				{
					Event			= 3;
					FileDialogType	= 1;
					ofn.lpstrFilter	= TEXT("GLITCH Game World Section\0*""*.gws");
					ofn.lpstrTitle	= TEXT("Open File");
					GetFileInfo();
					break;
				}
			case ID_MAIN_FILE_SAVE:								//Save a File
				{
					FileDialogType	= 4;
					ofn.lpstrFilter	= TEXT("GLITCH Game World Section\0*""*.gws");
					ofn.lpstrTitle	= TEXT("Save File");
					GetFileInfo();
					break;
				}
			case ID_MAIN_FILE_SAVEAS:							//Save a File As
				{
					FileDialogType	= 5;
					ofn.lpstrFilter	= TEXT("GLITCH Game World Section\0*""*.gws");
					ofn.lpstrTitle	= TEXT("Save File As");
					GetFileInfo();
					break;
				}
			case ID_MAIN_FILE_EXIT:								//Exit the Program
				{
					Event = 1;
					break;
				}
			case ID_HELP_ABOUT:									//Show the About Dialog
				{
					//Open the about dialog box
					DialogBox( DllInstance,(LPCSTR)IDD_ABOUT,BBWin,(DLGPROC)DlgProc );
					break;
				}
			}//End switch
			break;
		}
	case WM_RBUTTONDOWN:
		{
			UINT value = 0;
			//Show the short cut Menu
			value = TrackPopupMenu( PopUpMenu,TPM_LEFTALIGN | TPM_TOPALIGN |
							  TPM_RETURNCMD | TPM_LEFTBUTTON,msg.pt.x,msg.pt.y,0,BBWin,NULL );

			//Update Action based on what Menu item was picked
			switch( value )
			{
			case ID_MAIN_POPUP_EDIT_ENTITY:
				{
					PopUpMenu	= LoadMenu( DllInstance,(LPCSTR)MAIN_POPUPMENU );
					PopUpMenu	= GetSubMenu( PopUpMenu,1 );
					DrawMenuBar( BBWin );
					Event = 100;
					break;
				}
			case ID_MAIN_POPUP_LOAD_ENTITY:
				{
					Event = 102;
					DialogType = 1;
					DialogBox( DllInstance,(LPCSTR)IDD_TYPE_LIST,BBWin,(DLGPROC)DlgProc );
					break;
				}
			case ID_EDITENTITY_TOMAIN:
				{
					PopUpMenu	= LoadMenu( DllInstance,(LPCSTR)MAIN_POPUPMENU );
					PopUpMenu	= GetSubMenu( PopUpMenu,0 );
					Event = 104;
					break;
				}
			}//End switch

			break;
		}
	}//End switch

	//Call the next hook function in the chain
	return( CallNextHookEx( hhkHook,ncode,wparam,lparam ));
}//End the Message Processor Function

//////////////////////////////////////////////////////
//INTERNAL FUNCTION DECLORATIONS
//////////////////////////////////////////////////////
//Get File Name
void GetFileInfo( void )
{
	HINSTANCE BBWinInstance = (HINSTANCE)GetModuleHandle(NULL);

	//TCHAR _szFilter[] = TEXT("All Files\0*.*\0Text Files (*.txt)\0*.TXT\0");
	//TCHAR _szPickMsg[] = TEXT(""); 
	//CHAR szFileName[] = TEXT("");

	ofn.lStructSize		= sizeof(OPENFILENAME); 
	ofn.hwndOwner		= BBWin; 
	ofn.hInstance		= BBWinInstance; 
	ofn.nFilterIndex	= 1L; 
	ofn.lpstrFile		= (LPTSTR)StringToSend;		
	ofn.nMaxFile		= 500;		
	ofn.lpstrInitialDir = NULL;
	ofn.lpstrInitialDir = NULL; 
	ofn.Flags			= OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | 
						  OFN_PATHMUSTEXIST | OFN_EXPLORER;

	if( FileDialogType == 1 )
		GetOpenFileName(&ofn);
	else
		GetSaveFileName(&ofn);
}//End Get File Name Function

/////////////////////////////////////////////////////
//get a string
char *string( char *in )
{
	//get the number of characters in the first string	

	long string_length = *((long*)in);							//get the length of the string
	char *string;												//create a char string
	in += 4;													//move the in pointer over 4bytes to get the string
	
	//allocate memory for the string
	if (( string = ( char *) malloc( string_length )) == NULL)	//allocate memory space for the string return "0" if unsuccessful
	{
		return 0;												//return back to main program with "0" if not enough memory
	}

	//get the string
	memset(string,NULL,string_length);							//set memory aside for the string
	memmove(string,in,string_length-1);							//!!VERY IMPORTANT!! remember that the total number of characters must be decreased by 1
																//copy the string stored at "in" pointer to the "title string" pointer
	//return the created string
	return( string );
}	//end function

/////////////////////////////////////////////////////
HERE IS THE BLITZ CODE
/////////////////////////////////////////////////////


;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

;	INITIALIZATION

;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;INCLUDES
Include "C:\GLITCH\GLITCH GAME EDITOR\GLITCH Blitz Files\GLITCH - Game Initialization.bb"
Include "C:\GLITCH\GLITCH GAME EDITOR\GLITCH Blitz Files\GLITCH - Functions.bb"
;Include "C:\GLITCH\GLITCH GAME EDITOR\GLITCH Blitz Files\GLITCH - Game  Engine BETA.bb"

;-----------------------------------------------------------------------------------------------------------
;GRAPHICS SETUP
;Setup the Editor for Use
AppTitle "Blitz Basic Main Window"										;Setup the app title
Global Win32Dll$ 	= "C:\GLITCH\GLITCH GAME EDITOR\Debug\GLITCH GAME EDITOR";Get the address of the dll

BankStartIn 		= CreateBank(8)										;Bank to go into dll function
BankStartOut 		= CreateBank(8)										;Bank of info from dll function
CallDLL( Win32Dll$,"DesktopMetrics",BankStartIn,BankStartOut )					;Call Dll to get the size of the Desktop
Graphics3D PeekInt( BankStartOut,0 ),PeekInt( BankStartOut,4 ),16,2				;Enable Blitz for 3D drawing and set Res to Desktop Size
SetBuffer BackBuffer()												;Set the backbuffer for drawing

;-----------------------------------------------------------------------------------------------------------
;VARIABLES
;Gloabl
Global gRecivedString$ 	= ""											;File string to hold the file path string

;Local
BBWin 			= CallDLL( Win32Dll$,"StartWin32" )						;Set up the Win32 Gui and get the window
ExitProgram 		= 0												;Flag to determine when to exit
TypeList$ 			= "Ron#Jeff#Test Wall#Test Floor#"
GuiSetTypeList( TypeList$ )

;-----------------------------------------------------------------------------------------------------------
;TYPES
;ViewPort Type
Type GuiViewPort
	Field CameraPivot												;Viewport Camera Pivot
	Field Camera													;Viewport Camera
	Field ViewType													;Viewport Type eg( Perspective, Top, Back...)
	Field Xpos														;Starting Xpos of Viewport
	Field Ypos														;Starting Ypos of Viewport
	Field Width													;Width of Viewport
	Field Height													;Height of Viewport
End Type

;Create array of 4 Viewports
Dim ViewPorts.GuiViewPort(3)											;Create an Array of  4 Viewports

;Create the first Viewport and Set the Parameters
ViewPorts(0) 			= New GuiViewPort								;Create new Viewport type
ViewPorts(0)\CameraPivot 	= CreatePivot()									;Viewport Camera Pivot
ViewPorts(0)\Camera 		= CreateCamera( ViewPorts(0)\CameraPivot )			;Create the Viewport Camera
ViewPorts(0)\ViewType	= 1											;Set Viewport Type to Perspective
ViewPorts(0)\Xpos 		= 0											;Set Starting Xpos of Viewport 
ViewPorts(0)\Ypos		= 0											;Set Starting Ypos of Viewport 
ViewPorts(0)\Width 		= GraphicsWidth()								;Set Starting Width of Viewport 
ViewPorts(0)\Height 		= GraphicsHeight()								;Set Starting Height of Viewport 

;Set the Viewport with Viewport Parameters
CameraViewport ViewPorts(0)\Camera,ViewPorts(0)\Xpos,ViewPorts(0)\Ypos,ViewPorts(0)\Width,ViewPorts(0)\Height
CameraClsColor ViewPorts(0)\Camera,128,128,128							;Set Viewport Cls Color

;Set current viewport
CurrentViewPort 	= ViewPorts(0)\Camera 								;Set the Current Viewport
CurrentViewPortPivot 	= ViewPorts(0)\CameraPivot							;Set the Current Viewport Pivot
PositionEntity CurrentViewPort ,0,8,-50

;-----------------------------------------------------------------------------------------------------------
;SCENERY
;Cube and light
cube		= CreateCube(CurrentViewPortPivot)								;Create a reference cube
PositionEntity cube,EntityX(CurrentViewPortPivot),EntityY(CurrentViewPortPivot),EntityZ(CurrentViewPortPivot)
light 		= CreateLight()												;Create a default light

;Grid
;Create the Grid Sprite and load it's texture from file
GridTop		= LoadSprite( "C:\GLITCH\GLITCH GAME EDITOR\GLITCH Blitz Files\Grid Texture.bmp" )
GridTexture	= LoadTexture( "C:\GLITCH\GLITCH GAME EDITOR\GLITCH Blitz Files\Grid Texture.bmp",2)
ScaleSprite GridTop,100,100											;Scale the Grid Top									
SpriteViewMode GridTop,2												;Set the Grid's orientaion to be indepndant of the camera
RotateEntity GridTop,90,0,0											;Rotate the Grid Top 90 degrees on the x axis so it faces the top
ScaleTexture GridTexture,0.1,0.1											;Scale the Grid Texutue to a smaller size
EntityTexture GridTop,GridTexture										;Texture the Grid Top
EntityFX GridTop,1													;Set the grid to be at full bright
GridBottom 	= CopyEntity( GridTop,GridTop )								;Create a copy of Grid top but a grid for the bottom
RotateEntity GridBottom,180,0,0											;Rotate the new grid so it faces the bottom

;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

;	MAIN LOOP

;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
While ExitProgram = 0												;Continue while user hasn't hit escape
	;-----------------------------------------------------------------------------------------------------------
	Event = CallDLL( Win32Dll$,"GetEvent" )								;Get the current input event
	
	;-----------------------------------------------------------------------------------------------------------
	;Set the mouse for input
	MouseXSpeed()
	MouseYSpeed()
	NewMouseZ = MouseZSpeed()
		
	;-----------------------------------------------------------------------------------------------------------
	;Act upon the current event
	Select Event 
		Case 1													;User Input to Exit
			ExitProgram = 1												;End Program
		Case 2													;Input New
			;Start a new program
			GuiMsgBox("Windows Message Box","Testing Windows Message Box",1)
		Case 3
			;Open a file
			GuiGetString()											;Get the file path for opening a file
			gFileToUse$ = gRecivedString$
			LoadWorldSection( 1,1 )
		Case 4
			;Save file
			GuiGetString()											;Get the file path for saving a file
		Case 5
			;Save file As
			GuiGetString()											;Get the file path for saving a file as
	End Select 
	
	;----------------------------------------------------------------------------------------------------------
		;camera movement
		If  MouseHit(3)
			HidePointer
			While MouseHit(1) = 0 Or MouseHit(3)
				Xpos# 	= EntityX( CurrentViewPortPivot )
				Ypos# 	= EntityY( CurrentViewPortPivot )
				Zpos# 	= EntityZ( CurrentViewPortPivot )
				
				Pitch# 	= EntityPitch( CurrentViewPortPivot  ) + MouseYSpeed()
				Yaw# 	= EntityYaw( CurrentViewPortPivot  ) + MouseXSpeed()
				RotateEntity CurrentViewPortPivot,Pitch#,Yaw#,0

				
				;-----------------------------------------------------------------------------------------------------------
				;If user wants to move the position of the viewport pivot
				If KeyDown( 42 )
					If KeyDown( 200 )=True Then MoveEntity CurrentViewPortPivot,0,0,1
					If KeyDown( 208 )=True Then MoveEntity CurrentViewPortPivot,0,0,-1
				Else
					If KeyDown( 200 )=True Then MoveEntity CurrentViewPortPivot,0,1,0
					If KeyDown( 208 )=True Then MoveEntity CurrentViewPortPivot,0,-1,0
				EndIf 
				If KeyDown( 203 )=True Then MoveEntity CurrentViewPortPivot,-1,0,0
				If KeyDown( 205 )=True Then MoveEntity CurrentViewPortPivot,1,0,0
				
				;-----------------------------------------------------------------------------------------------------------
				;Update the graphics
				UpdateWorld
				RenderWorld
				Flip
				
				;-----------------------------------------------------------------------------------------------------------
				;Stop all camera movement 
				MoveEntity CurrentViewPortPivot,0,0,0
			Wend
			ShowPointer
		ElseIf NewMouseZ > 0 Or KeyHit( 30 ) And EntityDistance( CurrentViewPort, CurrentViewPortPivot ) >= 1
			MoveEntity CurrentViewPort,0,0,NewMouseZ
		ElseIf NewMouseZ < 0 Or KeyHit( 44 )	
			MoveEntity CurrentViewPort,0,0,NewMouseZ
		EndIf 
		
		
				;-----------------------------------------------------------------------------------------------------------
				;SAVE THIS BIT OF CODE FOR WALK AROUND MODE
				;If user wants to move the camera around 
				;If KeyDown( 17 )=True Then MoveEntity CurrentViewPort,0,0,1
				;If KeyDown( 31 )=True Then MoveEntity CurrentViewPort,0,0,-1
				;If KeyDown( 30 )=True Then MoveEntity CurrentViewPort,-1,0,0
				;If KeyDown( 32 )=True Then MoveEntity CurrentViewPort,1,0,0
				;PositionEntity CurrentViewPort,0,8,-50
				;PointEntity CurrentViewPort,CurrentViewPortPivot
	;-----------------------------------------------------------------------------------------------------------
	;Draw Everything to screen
	;TurnEntity cube,0,1,0
	UpdateWorld
	RenderWorld
	Text 0,0, "Current Event: " + Event, False,False 							;Print the current event on screen
	Text 0,10,"File String: " + gRecivedString$,False,False						;Print the selected File path on screen
	Flip
Wend
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

CallDLL( Win32Dll$,"EndWin32" )										;Call the DLL to End the use of the Win32 Library
End																;Exit the program

;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

;	FUNCTIONS

;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Function GuiParseText( PassedString$, Bank )
	NewTitle$ 		= PassedString$									;create a temp copy of the passed$ to manipulate
	Char$ 		= PassedString$									;create a second temp copy to manipulate
	StringLength	= Len( PassedString$ ) + 5								;get the length of the passed string, and add 5. 4 the byte size of the int we will pass, and 1 for the NULL
	DebugLog "String Length with NULL character: " + ( StringLength - 4 )
	BankLocation	= BankSize( Bank )
	ResizeBank Bank,( BankSize( Bank) + StringLength )						;resize the passed bank to the size of the string 
	PokeInt Bank,BankLocation,( StringLength-4 )							;put an integer in the bank holding the number of characters in the string
	LoopEnd 		= BankLocation + (( StringLength-5 )-1 )					;get the end of the loop that will put the rest of the characters in the bank
	
	;parse the passed text
	For Counter_1 	= BankLocation To LoopEnd
		Char$ 	= Left( NewTitle$,1 )				
		DebugLog "char: " + Char$			
		NewTitle$ 	= Right(NewTitle$,Len( NewTitle$ )-1)
		PokeByte Bank,( Counter_1+4 ),Asc( Char$ )
	Next
End Function
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Function GuiMsgBox( Title$="", Msg$="", Button=0 )
	BankIn 	= CreateBank()											;create a bank to pass the DLL the needed function
	BankOut 	= CreateBank( 1 )										;create a bank to recive what user pressed
	GuiParseText( Title$,BankIn )										;put the title text in the bank but first parse the text
	GuiParseText( Msg$,BankIn )										;put the message text in the bank but parse it also
	ResizeBank BankIn, ( BankSize(BankIn)+1 )							;resize the bank by one value
	PokeByte BankIn,( BankSize(BankIn)-1 ),Button							;put the type of message box value in the bank
	Result 	= CallDLL( Win32Dll$,"MsgBox",BankIn )						;call the dll to show the message box
	DebugLog "result: " + Result
End Function
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Function GuiGetString()
	BankIn 	= CreateBank(4)											;Bank to send in the DLL function
	BankOut 	= CreateBank(256)										;Bank with information when we get out of the DLL function
	CallDLL( Win32Dll$,"GetString",BankIn,BankOut )						;Get the current input event
	For counter1 = 0 To 256											;Start counter
		If PeekByte( BankOut, counter1 ) = 0 Then Exit						;If the value in the bank is zero then exit loop
		gRecivedString$ = gRecivedString$ + Chr$( PeekByte( BankOut,counter1 ) )		;Get the file path
	Next
	gRecivedString$ = Trim( gRecivedString$ )								;Get rid of any trailing or leading "spaces" in the string
End Function
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Function GuiSetTypeList( TypeList$ )
	BankIn 	= CreateBank()											;create a bank to pass the DLL the needed function
	BankOut 	= CreateBank( 1 )										;create a bank to recive what user pressed
	GuiParseText( TypeList$,BankIn )									;put the title text in the bank but first parse the text
	ResizeBank BankIn, ( BankSize(BankIn)+1 )							;resize the bank by one value
	Result 	= CallDLL( Win32Dll$,"MsgBox",BankIn )						;call the dll to show the message box
	Return Result
End Function

Comments

None.

Code Archives Forum