518 lines
15 KiB
C++
518 lines
15 KiB
C++
//=========================================================================
|
|
// CPAFrame.cpp : implementation of the CPA_MainFrame class
|
|
// This is a part of the CPA project.
|
|
//
|
|
// Version 1.0
|
|
// Creation date 06/06/96
|
|
// Revision date
|
|
//
|
|
// (c) Ubi Studios 1996
|
|
//
|
|
// DO NOT MODIFY THAT FILE. IF SOMETHING NEEDS TO BE CHANGE, PLEASE CONTACT
|
|
// VINCENT GRECO OR CHRISTOPHE BEAUDET.
|
|
//=========================================================================
|
|
|
|
#include "stdafx.h"
|
|
#include "acp_base.h"
|
|
|
|
#include <pbt.h>
|
|
|
|
#include "direct.h"
|
|
#include "Itf/CPARes.h"
|
|
#include "errint.h"
|
|
#include "mmgint.h"
|
|
#include "Itf/DEVViewp.hpp"
|
|
#include "Itf/DEVMul3D.hpp"
|
|
#include "Itf/CPAFrame.hpp"
|
|
#include "Itf/CPAProj.hpp"
|
|
#include "Itf/CPAConst.hpp"
|
|
#include "Itf/A3dkeyal.hpp"
|
|
#include "Itf/cpamworl.hpp"
|
|
#include "Itf/camdllb.hpp"
|
|
#include "Itf/CPAInter.hpp"
|
|
#include "incgam.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPA_MainFrame
|
|
|
|
#define M_BaseClass CFrameWnd
|
|
|
|
IMPLEMENT_DYNCREATE(CPA_MainFrame, M_BaseClass)
|
|
BEGIN_MESSAGE_MAP(CPA_MainFrame, M_BaseClass)
|
|
|
|
//{{AFX_MSG_MAP(CPA_MainFrame)
|
|
ON_MESSAGE(WM_POWERBROADCAST, m_lOnPowerManagement)
|
|
ON_MESSAGE(WM_DISPLAYCHANGE, OnDisplayChange)
|
|
ON_WM_CREATE()
|
|
ON_WM_CLOSE()
|
|
ON_WM_ACTIVATEAPP()
|
|
ON_WM_ACTIVATE()
|
|
ON_WM_SYSCOMMAND()
|
|
ON_WM_SIZE()
|
|
ON_WM_GETMINMAXINFO()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPA_MainFrame construction/destruction
|
|
|
|
CPA_MainFrame::CPA_MainFrame()
|
|
{
|
|
}
|
|
|
|
CPA_MainFrame::~CPA_MainFrame()
|
|
{
|
|
}
|
|
|
|
|
|
LRESULT CPA_MainFrame::OnDisplayChange(UINT wParam, LONG lParam)
|
|
{
|
|
HDC hdc;
|
|
int iAppBPP;
|
|
|
|
hdc = ::GetDC(NULL);
|
|
iAppBPP = ::GetDeviceCaps(hdc, PLANES);
|
|
iAppBPP *= wParam;
|
|
::ReleaseDC(NULL, hdc);
|
|
|
|
M_GetMainApp()->m_bBadResolution = FALSE;
|
|
if(iAppBPP != 16)
|
|
M_GetMainApp()->m_bBadResolution = TRUE;
|
|
|
|
if(M_GetMainApp()->m_bBadResolution)
|
|
{
|
|
if(!M_GetMainDevice()->GetDevice(0)->IsFullScreen())
|
|
{
|
|
if(!IsIconic())
|
|
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE);
|
|
// else
|
|
// M_GetMainApp()->m_bWasInFullScreenBeforeLooseFocus = TRUE;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//###########################################################################
|
|
// POWER MANAGEMENT AND SCREEN SAVER
|
|
//###########################################################################
|
|
|
|
// handled WM_POWERBROADCAST
|
|
LRESULT CPA_MainFrame::m_lOnPowerManagement(UINT wParam, LONG lParam)
|
|
{
|
|
switch ( lParam )
|
|
{
|
|
case PBT_APMQUERYSUSPEND: //when system asks apps if they accept to enter low-power mode
|
|
case PBT_APMQUERYSTANDBY:
|
|
return TRUE; //return BROADCAST_QUERY_DENY for refusal to enter low-power mode
|
|
|
|
case PBT_APMSTANDBY: //received when all apps granted low-power mode, right before low-power mode is activated
|
|
case PBT_APMSUSPEND: //these 2 may me received before the two others if some app forces the mode
|
|
if ( !M_GetMainApp()->m_bEngineIsStopped )
|
|
{
|
|
M_GetMainApp()->fn_vStopEngine();
|
|
// if we are in fullscreen, then swap to windowed
|
|
// and tell we were in full screen
|
|
M_GetMainApp()->BeforeWindows();
|
|
if (M_GetMainDevice()->GetDevice(0)->IsFullScreen())
|
|
{
|
|
M_GetMainDevice()->GetDevice(0)->SwapFullScreen();
|
|
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
|
|
{
|
|
M_GetMainApp()->m_bWasInFullScreenBeforeLooseFocus = TRUE;
|
|
}
|
|
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE);
|
|
}
|
|
M_GetMainApp()->AfterWindows();
|
|
|
|
}
|
|
return TRUE; //accept entry into low-power mode
|
|
|
|
case PBT_APMRESUMESUSPEND: //when resuming from low-power mode to normal operation
|
|
case PBT_APMRESUMESTANDBY: //when resuming from low-power mode to normal operation
|
|
case PBT_APMRESUMECRITICAL: //received when power is enough to proceed with normal operations
|
|
OnActivateApp(TRUE, NULL);
|
|
return FALSE;
|
|
|
|
case PBT_APMQUERYSUSPENDFAILED: //when an app denied request, others receive this message
|
|
case PBT_APMQUERYSTANDBYFAILED: //when an app denied request, others receive this message
|
|
case PBT_APMPOWERSTATUSCHANGE: //when power supply change is detected (batt<->mains/low, etc...)
|
|
case PBT_APMOEMEVENT: //when bios sends an OEM APM change
|
|
case PBT_APMBATTERYLOW: //when battery is running low
|
|
return FALSE; //return value is irrelevant
|
|
// PBTF_APMRESUMEFROMFAILURE ?
|
|
}
|
|
return BROADCAST_QUERY_DENY; //any other case is not known, so prevent power management just in case
|
|
}
|
|
|
|
void CPA_MainFrame::OnSysCommand(UINT nID, LPARAM lParam) //handles WM_SYSCOMMAND message
|
|
{
|
|
UINT uiTrueNID = nID & 0xFFFFFFF0;
|
|
|
|
M_GetMainApp()->BeforeWindows();
|
|
switch ( uiTrueNID )
|
|
{
|
|
case SC_MONITORPOWER:
|
|
case SC_SCREENSAVE: // screensaver
|
|
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
|
|
{
|
|
if (M_GetMainDevice()->GetDevice(0)->IsFullScreen() )
|
|
{
|
|
M_GetMainDevice()->GetDevice(0)->SwapFullScreen();
|
|
M_GetMainApp()->m_bWasInFullScreenBeforeLooseFocus = TRUE;
|
|
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE);
|
|
}
|
|
M_GetMainApp()->fn_vAppliAskToStopEngine();
|
|
}
|
|
else
|
|
{
|
|
CFrameWnd::OnSysCommand(nID, lParam);
|
|
}
|
|
break;
|
|
|
|
case SC_MINIMIZE:
|
|
if (GLI_lWhatIsGLI() != GLI_C_VersionGlide)
|
|
{
|
|
CFrameWnd::OnSysCommand(nID, lParam);
|
|
M_GetMainDevice()->GetDevice(0)->SwapFullScreen();
|
|
}
|
|
break;
|
|
|
|
case SC_MAXIMIZE:
|
|
if (GLI_lWhatIsGLI() != GLI_C_VersionGlide)
|
|
{
|
|
M_GetMainWnd()->SendMessage(WM_SYSCOMMAND, SC_RESTORE);
|
|
}
|
|
break;
|
|
|
|
case SC_RESTORE:
|
|
if (GLI_lWhatIsGLI() != GLI_C_VersionGlide)
|
|
{
|
|
CFrameWnd::OnSysCommand(nID, lParam);
|
|
M_GetMainDevice()->GetDevice(0)->SwapFullScreen();
|
|
}
|
|
break;
|
|
|
|
default:
|
|
if (GLI_lWhatIsGLI() != GLI_C_VersionGlide)
|
|
{
|
|
CFrameWnd::OnSysCommand(nID, lParam);
|
|
}
|
|
}
|
|
|
|
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
|
|
{
|
|
CFrameWnd::OnSysCommand(nID, lParam);
|
|
}
|
|
M_GetMainApp()->AfterWindows();
|
|
}
|
|
|
|
|
|
void CPA_MainFrame::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
if (GLI_lWhatIsGLI() != GLI_C_VersionGlide)
|
|
{
|
|
M_GetMainApp()->BeforeWindows();
|
|
CFrameWnd::OnSize(nType, cx, cy);
|
|
M_GetMainApp()->AfterWindows();
|
|
}
|
|
else
|
|
{
|
|
if((M_GetMainApp()->m_p_oEngineThread) && (M_GetMainApp()->m_bEngineIsStopped == FALSE))
|
|
WaitForSingleObject(M_GetMainApp()->m_hDrawSem, INFINITE);
|
|
CFrameWnd::OnSize(nType, cx, cy);
|
|
if((M_GetMainApp()->m_p_oEngineThread) && (M_GetMainApp()->m_bEngineIsStopped == FALSE))
|
|
ReleaseSemaphore(M_GetMainApp()->m_hDrawSem, 1, NULL);
|
|
}
|
|
}
|
|
|
|
|
|
void CPA_MainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
|
|
{
|
|
CSize sizeScreen(GetSystemMetrics(SM_CXMAXIMIZED), GetSystemMetrics(SM_CYMAXIMIZED));
|
|
|
|
lpMMI->ptMinTrackSize.x = 50;
|
|
lpMMI->ptMinTrackSize.y = 50;
|
|
lpMMI->ptMaxTrackSize.x = sizeScreen.cx;
|
|
lpMMI->ptMaxTrackSize.y = sizeScreen.cy;
|
|
}
|
|
|
|
//===========================================================================
|
|
// Description: That function is called by MFC to update main frame title.
|
|
// We put project title and actual version of project.
|
|
// Creation date: 06 Jun 96
|
|
// Author: CB
|
|
//---------------------------------------------------------------------------
|
|
// BOOL Not used
|
|
// Return void
|
|
//---------------------------------------------------------------------------
|
|
// Revision date:
|
|
// Author:
|
|
//===========================================================================
|
|
void CPA_MainFrame::OnUpdateFrameTitle(BOOL)
|
|
{
|
|
M_GetMainApp()->fn_vUpdateFrameTitle();
|
|
::SetWindowText(m_hWnd, (LPCTSTR) m_szProjectName);
|
|
}
|
|
|
|
|
|
|
|
|
|
void CPA_MainFrame::OnActivate( UINT nState, CWnd* pWndOther, BOOL bMinimized )
|
|
{
|
|
long l;
|
|
static BOOL s_bPreventNestedCalls = FALSE;
|
|
static BOOL s_bActive = FALSE;
|
|
|
|
Erm_fn_v_PrintErrMsgWithPersonalMsg("ITF - CpaFrame_eng", "on_Activate", "***********************");
|
|
|
|
if (nState == WA_ACTIVE || nState == WA_CLICKACTIVE)
|
|
{
|
|
l = 5;
|
|
l++;
|
|
}
|
|
CFrameWnd::OnActivate(nState,pWndOther,bMinimized);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
// Description: Call when application is activate or desactivate.
|
|
// Creation date: 24 Jun 96
|
|
// Author: CB
|
|
//---------------------------------------------------------------------------
|
|
// bActive Application is activated or not ?
|
|
// Return void
|
|
//---------------------------------------------------------------------------
|
|
// Revision date:
|
|
// Author:
|
|
//===========================================================================
|
|
void CPA_MainFrame::OnActivateApp(BOOL bActive, DWORD)
|
|
{
|
|
static BOOL s_bPreventNestedCalls = FALSE;
|
|
static BOOL s_bActive = FALSE;
|
|
|
|
|
|
if (GLI_lWhatIsGLI() != GLI_C_VersionGlide)
|
|
{
|
|
|
|
|
|
Erm_fn_v_PrintErrMsgWithPersonalMsg("ITF - CpaFrame_eng", "on_ActivateApp", "***********************");
|
|
if ( s_bPreventNestedCalls )
|
|
return;
|
|
s_bPreventNestedCalls = TRUE;
|
|
|
|
if(bActive)
|
|
{
|
|
Erm_fn_v_PrintErrMsgWithPersonalMsg("ITF - CpaFrame_eng", "on_ActivateApp", "*********TRUE**************");
|
|
if (s_bActive)
|
|
{
|
|
s_bPreventNestedCalls = FALSE;
|
|
return;
|
|
}
|
|
|
|
s_bActive = TRUE;
|
|
M_GetMainApp()->BeforeWindows();
|
|
// Change priority level of main process
|
|
// Warning ! HIGH_PRIORITY_CLASS = same level as windows task manager. So if
|
|
// appli crash, it may causes somes problems.
|
|
// SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
|
|
|
|
// if we are not in editor mode, check if we were in fullscreen before leaving
|
|
// and resume then engine
|
|
|
|
if (M_GetMainApp()->m_p_oEngineThread)
|
|
{
|
|
|
|
// if((M_GetMainApp()->m_bWasInFullScreenBeforeLooseFocus) || (M_GetMainApp()->m_bBadResolution))
|
|
// {
|
|
// M_GetMainApp()->m_bWasInFullScreenBeforeLooseFocus = FALSE;
|
|
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
|
|
{
|
|
if ((M_GetMainDevice()->GetDevice(0)->IsFullScreen() == FALSE))
|
|
{
|
|
M_GetMainDevice()->GetDevice(0)->SwapFullScreen();
|
|
}
|
|
}
|
|
|
|
|
|
if ((M_GetMainWnd()->IsIconic()))
|
|
{
|
|
M_GetMainWnd()->SendMessage(WM_SYSCOMMAND, SC_RESTORE);
|
|
}
|
|
}
|
|
M_GetMainApp()->m_bAppliAskedToStopEngine = FALSE;
|
|
M_GetMainApp()->fn_vRestartEngine();
|
|
|
|
// Call a virtual method for a real project
|
|
M_GetMainApp()->fn_vWhenAppGainFocus();
|
|
M_GetMainApp()->AfterWindows();
|
|
M_GetMainApp()->AfterWindows();
|
|
}
|
|
else
|
|
{
|
|
Erm_fn_v_PrintErrMsgWithPersonalMsg("ITF - CpaFrame_eng", "on_ActivateApp", "*********FALSE**************");
|
|
if (!s_bActive)
|
|
{
|
|
s_bPreventNestedCalls = FALSE;
|
|
return;
|
|
}
|
|
|
|
s_bActive = FALSE;
|
|
|
|
M_GetMainApp()->BeforeWindows();
|
|
|
|
if (M_GetMainApp()->m_bProjectIsClosing == 0)
|
|
{
|
|
if (M_GetMainApp()->m_bLeavingApplication == FALSE)
|
|
{
|
|
// Suspend engine thread
|
|
M_GetMainApp()->fn_vAppliAskToStopEngine();
|
|
M_GetMainApp()->BeforeWindows();
|
|
|
|
if (!(M_GetMainWnd()->IsIconic()))
|
|
{
|
|
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE);
|
|
}
|
|
|
|
// Restore a normal priority for actual process
|
|
// SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
|
|
|
|
// Call a virtual method for a real project
|
|
M_GetMainApp()->fn_vWhenAppLooseFocus();
|
|
}
|
|
}
|
|
M_GetMainApp()->AfterWindows();
|
|
}
|
|
s_bPreventNestedCalls = FALSE;
|
|
}
|
|
else
|
|
{
|
|
if ( s_bPreventNestedCalls )
|
|
return;
|
|
s_bPreventNestedCalls = TRUE;
|
|
|
|
if(bActive)
|
|
{
|
|
// Change priority level of main process
|
|
// Warning ! HIGH_PRIORITY_CLASS = same level as windows task manager. So if
|
|
// appli crash, it may causes somes problems.
|
|
// SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
|
|
|
|
// if we are not in editor mode, check if we were in fullscreen before leaving
|
|
// and resume then engine
|
|
|
|
if (M_GetMainApp()->m_bWasInFullScreenBeforeLooseFocus)
|
|
{
|
|
M_GetMainApp()->m_bWasInFullScreenBeforeLooseFocus = FALSE;
|
|
if (M_GetMainDevice()->GetDevice(0)->IsFullScreen() == FALSE)
|
|
{
|
|
if(M_GetMainWnd()->IsIconic())
|
|
M_GetMainWnd()->SendMessage(WM_SYSCOMMAND, SC_RESTORE);
|
|
M_GetMainDevice()->GetDevice(0)->SwapFullScreen();
|
|
}
|
|
}
|
|
M_GetMainApp()->m_bAppliAskedToStopEngine = FALSE;
|
|
M_GetMainApp()->fn_vRestartEngine();
|
|
|
|
|
|
// Call a virtual method for a real project
|
|
M_GetMainApp()->fn_vWhenAppGainFocus();
|
|
}
|
|
else
|
|
{
|
|
|
|
if (M_GetMainApp()->m_bProjectIsClosing == 0)
|
|
{
|
|
if (M_GetMainApp()->m_bLeavingApplication == FALSE)
|
|
{
|
|
|
|
// Suspend engine thread
|
|
M_GetMainApp()->fn_vAppliAskToStopEngine();
|
|
|
|
//if we were in full screen, it might be because the screen saver was activated...
|
|
if (M_GetMainDevice()->GetDevice(0)->IsFullScreen())
|
|
{
|
|
M_GetMainDevice()->GetDevice(0)->SwapFullScreen();
|
|
M_GetMainApp()->m_bWasInFullScreenBeforeLooseFocus = TRUE;
|
|
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE);
|
|
}
|
|
// Restore a normal priority for actual process
|
|
// SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
|
|
|
|
// Call a virtual method for a real project
|
|
M_GetMainApp()->fn_vWhenAppLooseFocus();
|
|
}
|
|
}
|
|
}
|
|
s_bPreventNestedCalls = FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
//===========================================================================
|
|
// Description: Call to close main frame.
|
|
// In editor mode, we ask all editors to close. Editors can
|
|
// say NO to not close application !
|
|
// Else we force second thread to close.
|
|
// Creation date: 20 Jun 96
|
|
// Author: CB
|
|
//---------------------------------------------------------------------------
|
|
// Return void
|
|
//---------------------------------------------------------------------------
|
|
// Revision date:
|
|
// Author:
|
|
//===========================================================================
|
|
void CPA_MainFrame::OnClose(void)
|
|
{
|
|
// if the engine has finished its closing process, the perform the onclose
|
|
if (M_GetMainApp()->m_bEngineIsOver == FALSE)
|
|
{
|
|
|
|
|
|
// We are in full screen ?
|
|
if(M_GetMainDevice()->GetDevice(0)->IsFullScreen())
|
|
M_GetMainDevice()->GetDevice(0)->SwapFullScreen();
|
|
|
|
// We indicate that project is closing
|
|
M_GetMainApp()->m_bProjectIsClosing = 1;
|
|
M_GetMainApp()->m_bLeavingApplication = 1;
|
|
|
|
// Force engine thread to close.
|
|
// we ask engine thread to begin the closing process
|
|
M_GetMainApp()->fn_vAppliAskToEndGame();
|
|
}
|
|
else
|
|
{
|
|
// We close window
|
|
CFrameWnd::OnClose();
|
|
}
|
|
}
|
|
|
|
//===========================================================================
|
|
// Description: Call to create main frame.
|
|
// In editor mode, we create toolbar and menus.
|
|
// Creation date: 06 Jun 96
|
|
// Author: CB
|
|
//---------------------------------------------------------------------------
|
|
// Return void
|
|
//---------------------------------------------------------------------------
|
|
// Revision date:
|
|
// Author:
|
|
//===========================================================================
|
|
int CPA_MainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (M_BaseClass::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
SetMenu(NULL); // No menu at this point of program
|
|
return 0;
|
|
}
|
|
|
|
//###########################################################################
|
|
// RESPONSE TO EDIT INTERFACE MESSAGES
|
|
//###########################################################################
|
|
|
|
|