PowerBASIC Forums
  Source Code
  PB/CC: Switching between Full-screen and Windowed modes

Post New Topic  Post A Reply
profile | register | preferences | faq | search

UBBFriend: Email This Page to Someone! next newest topic | next oldest topic
Author Topic:   PB/CC: Switching between Full-screen and Windowed modes
Lance Edmonds
Member
posted June 11, 2003 08:09 PM     Click Here to See the Profile for Lance Edmonds     Edit/Delete Message   Reply w/Quote

'------------------------------------------------------------------------------
' Examples of console mode switching between full-screen and windowed modes.
' by Lance C. Edmonds, 2001-2003.
'
' Note: This code uses undocumented Windows functions. Use at your own risk.
'------------------------------------------------------------------------------

#COMPILE CON
#INCLUDE "WIN32API.INC"

%ID_SWITCH_CONSOLEMODE = &hE00F
%CONSOLE_FULLSCREEN = 1 ' fullscreen console
%CONSOLE_FULLSCREEN_HARDWARE = 2 ' console owns the hardware

DECLARE FUNCTION SetConsoleDisplayMode ALIAS "SetConsoleDisplayMode" ( _
BYVAL hOut AS LONG, _ ' STDOUT handle
BYVAL dwNewMode AS DWORD, _ ' The new display mode
BYREF lpdwOldMode AS DWORD) AS LONG ' The old mode stored here

DECLARE FUNCTION GetConsoleDisplayMode ALIAS "GetConsoleDisplayMode" ( _
BYREF lpdwMode AS DWORD) AS LONG ' The mode stored here (%CONSOLE_xxx)


'------------------------------------------------------------------------------
' Return true if OS is Windows NT 4.0 or later
'
FUNCTION IsWinNT() EXPORT AS LONG
LOCAL vi AS OSVERSIONINFO

vi.dwOsVersionInfoSize = SIZEOF(vi)
GetVersionEx vi

FUNCTION = (vi.dwPlatformId = %VER_PLATFORM_WIN32_NT)
END FUNCTION


'------------------------------------------------------------------------------
' Return console handle
'
FUNCTION GetConsHWnd() AS DWORD
LOCAL a AS STRING
LOCAL b AS STRING

#IF %PB_REVISION < &H300
a = CONSNAME$
b = "CONSID:" & STR$(GetTickCount)
CONSOLE NAME b
SLEEP 250
FUNCTION = FindWindow(BYVAL %NULL, BYVAL STRPTR(b))
CONSOLE NAME a
#ELSE
FUNCTION = CONSHNDL
#ENDIF
END FUNCTION


'------------------------------------------------------------------------------
' Return 1 if running in Full Screen Mode, 0 if not.
'
FUNCTION IsFullScreen() AS DWORD
LOCAL Rct AS RECT

GetWindowRect GetConsHWnd, Rct
IF ABS(Rct.nTop) > 2000 THEN
IF ABS(Rct.nLeft) > 2000 THEN
FUNCTION = 1
END IF
END IF
END FUNCTION


'------------------------------------------------------------------------------
' Return a Verbose screen mode string (0 = windowed, 0 <> full-screen)
'
FUNCTION ScreenMode(BYVAL lMode AS LONG) AS STRING
IF lMode <> 0 THEN
FUNCTION = "Full-screen"
ELSE
FUNCTION = "Windowed"
END IF
END FUNCTION


'------------------------------------------------------------------------------
' Main application entry point...
'
FUNCTION PBMAIN
IF IsWinNT THEN
' NT full-screen mode
DIM hKernel32 AS DWORD
DIM pSetConsoleDisplayMode AS DWORD
DIM pGetConsoleDisplayMode AS DWORD
DIM hOut AS LONG
DIM dwOldMode AS DWORD
DIM Result AS LONG

hKernel32 = LoadLibrary("KERNEL32.DLL")
pSetConsoleDisplayMode = GetProcAddress(hKernel32, "SetConsoleDisplayMode")
pGetConsoleDisplayMode = GetProcAddress(hKernel32, "GetConsoleDisplayMode")

IF pGetConsoleDisplayMode THEN
dwOldMode = 0
CALL DWORD pGetConsoleDisplayMode USING GetConsoleDisplayMode(dwOldMode) TO Result
ELSE
dwOldMode = ISTRUE IsFullScreen()
END IF

PRINT "The current display mode is: " ScreenMode(dwOldMode)

#IF %PB_REVISION < &H300
hOut = GetStdHandle(%STD_OUTPUT_HANDLE)
#ELSE
hOut = GETSTDOUT
#ENDIF

IF pSetConsoleDisplayMode THEN
PRINT "Switching to Full-screen..."
CALL DWORD pSetConsoleDisplayMode USING SetConsoleDisplayMode(hOut, 1, dwOldMode) TO Result
SLEEP 10000
PRINT "Switching to Windowed..."
CALL DWORD pSetConsoleDisplayMode USING SetConsoleDisplayMode(hOut, 0, dwOldMode) TO Result
FreeLibrary hKernel32
END IF

ELSE
' Win9x screen-mode toggle
dwOldMode = IsFullScreen()
PRINT "The current display mode is: " & ScreenMode(dwOldMode)

PRINT "Toggling the console from " & ScreenMode(dwOldMode) & _
" to " & ScreenMode(dwOldMode = 0) & "..."
CALL SendMessage(GetConsHWnd, %WM_COMMAND, %ID_SWITCH_CONSOLEMODE, 0)
END IF

PRINT "Press a key..."

INPUT FLUSH
WAITKEY$
END FUNCTION

------------------
Lance
PowerBASIC Support
support@powerbasic.com

IP: Logged

All times are EasternTime (US)

next newest topic | next oldest topic

Administrative Options: Close Topic | Archive/Move | Delete Topic
Post New Topic  Post A Reply
Hop to:

Contact Us | PowerBASIC BASIC Compilers

Copyright © 1999-2005 PowerBASIC, Inc. All Rights Reserved.


Ultimate Bulletin Board 5.45c