Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
216 lines
5.3 KiB
C++
216 lines
5.3 KiB
C++
// This is a part of the Microsoft Foundation Classes C++ library.
|
|
// Copyright (C) 1992-1998 Microsoft Corporation
|
|
// All rights reserved.
|
|
//
|
|
// This source code is only intended as a supplement to the
|
|
// Microsoft Foundation Classes Reference and related
|
|
// electronic documentation provided with the library.
|
|
// See these sources for detailed information regarding the
|
|
// Microsoft Foundation Classes product.
|
|
|
|
#include "stdafx.h"
|
|
|
|
#ifdef AFX_CORE3_SEG
|
|
#pragma code_seg(AFX_CORE3_SEG)
|
|
#endif
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CWinApp UI related functions
|
|
|
|
void CWinApp::EnableModeless(BOOL bEnable)
|
|
{
|
|
#ifdef _AFX_NO_OLE_SUPPORT
|
|
UNUSED(bEnable);
|
|
#endif
|
|
|
|
// no-op if main window is NULL or not a CFrameWnd
|
|
CWnd* pMainWnd = AfxGetMainWnd();
|
|
if (pMainWnd == NULL || !pMainWnd->IsFrameWnd())
|
|
return;
|
|
|
|
#ifndef _AFX_NO_OLE_SUPPORT
|
|
// check if notify hook installed
|
|
ASSERT_KINDOF(CFrameWnd, pMainWnd);
|
|
CFrameWnd* pFrameWnd = (CFrameWnd*)pMainWnd;
|
|
if (pFrameWnd->m_pNotifyHook != NULL)
|
|
pFrameWnd->m_pNotifyHook->OnEnableModeless(bEnable);
|
|
#endif
|
|
}
|
|
|
|
int CWinApp::DoMessageBox(LPCTSTR lpszPrompt, UINT nType, UINT nIDPrompt)
|
|
{
|
|
// disable windows for modal dialog
|
|
EnableModeless(FALSE);
|
|
HWND hWndTop;
|
|
HWND hWnd = CWnd::GetSafeOwner_(NULL, &hWndTop);
|
|
|
|
// set help context if possible
|
|
DWORD* pdwContext = NULL;
|
|
if (hWnd != NULL)
|
|
{
|
|
// use app-level context or frame level context
|
|
LRESULT lResult = ::SendMessage(hWndTop, WM_HELPPROMPTADDR, 0, 0);
|
|
if (lResult != 0)
|
|
pdwContext = (DWORD*)lResult;
|
|
}
|
|
// for backward compatibility use app context if possible
|
|
if (pdwContext == NULL && this != NULL)
|
|
pdwContext = &m_dwPromptContext;
|
|
|
|
DWORD dwOldPromptContext = 0;
|
|
if (pdwContext != NULL)
|
|
{
|
|
// save old prompt context for restoration later
|
|
dwOldPromptContext = *pdwContext;
|
|
if (nIDPrompt != 0)
|
|
*pdwContext = HID_BASE_PROMPT+nIDPrompt;
|
|
}
|
|
|
|
// determine icon based on type specified
|
|
if ((nType & MB_ICONMASK) == 0)
|
|
{
|
|
switch (nType & MB_TYPEMASK)
|
|
{
|
|
case MB_OK:
|
|
case MB_OKCANCEL:
|
|
nType |= MB_ICONEXCLAMATION;
|
|
break;
|
|
|
|
case MB_YESNO:
|
|
case MB_YESNOCANCEL:
|
|
nType |= MB_ICONEXCLAMATION;
|
|
break;
|
|
|
|
case MB_ABORTRETRYIGNORE:
|
|
case MB_RETRYCANCEL:
|
|
// No default icon for these types, since they are rarely used.
|
|
// The caller should specify the icon.
|
|
break;
|
|
}
|
|
}
|
|
|
|
#ifdef _DEBUG
|
|
if ((nType & MB_ICONMASK) == 0)
|
|
TRACE0("Warning: no icon specified for message box.\n");
|
|
#endif
|
|
|
|
TCHAR szAppName[_MAX_PATH];
|
|
LPCTSTR pszAppName;
|
|
if (this != NULL)
|
|
pszAppName = m_pszAppName;
|
|
else
|
|
{
|
|
pszAppName = szAppName;
|
|
GetModuleFileName(NULL, szAppName, _MAX_PATH);
|
|
}
|
|
|
|
int nResult =
|
|
::MessageBox(hWnd, lpszPrompt, pszAppName, nType);
|
|
|
|
// restore prompt context if possible
|
|
if (pdwContext != NULL)
|
|
*pdwContext = dwOldPromptContext;
|
|
|
|
// re-enable windows
|
|
if (hWndTop != NULL)
|
|
::EnableWindow(hWndTop, TRUE);
|
|
EnableModeless(TRUE);
|
|
|
|
return nResult;
|
|
}
|
|
|
|
int AFXAPI AfxMessageBox(LPCTSTR lpszText, UINT nType, UINT nIDHelp)
|
|
{
|
|
CWinApp* pApp = AfxGetApp();
|
|
if (pApp != NULL)
|
|
return pApp->DoMessageBox(lpszText, nType, nIDHelp);
|
|
else
|
|
return pApp->CWinApp::DoMessageBox(lpszText, nType, nIDHelp);
|
|
}
|
|
|
|
int AFXAPI AfxMessageBox(UINT nIDPrompt, UINT nType, UINT nIDHelp)
|
|
{
|
|
CString string;
|
|
if (!string.LoadString(nIDPrompt))
|
|
{
|
|
TRACE1("Error: failed to load message box prompt string 0x%04x.\n",
|
|
nIDPrompt);
|
|
ASSERT(FALSE);
|
|
}
|
|
if (nIDHelp == (UINT)-1)
|
|
nIDHelp = nIDPrompt;
|
|
return AfxMessageBox(string, nType, nIDHelp);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// UI related CWnd functions
|
|
|
|
HWND PASCAL CWnd::GetSafeOwner_(HWND hParent, HWND* pWndTop)
|
|
{
|
|
// get window to start with
|
|
HWND hWnd = hParent;
|
|
if (hWnd == NULL)
|
|
{
|
|
CFrameWnd* pFrame = CCmdTarget::GetRoutingFrame_();
|
|
if (pFrame != NULL)
|
|
hWnd = pFrame->GetSafeHwnd();
|
|
else
|
|
hWnd = AfxGetMainWnd()->GetSafeHwnd();
|
|
}
|
|
|
|
// a popup window cannot be owned by a child window
|
|
while (hWnd != NULL && (::GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD))
|
|
hWnd = ::GetParent(hWnd);
|
|
|
|
// determine toplevel window to disable as well
|
|
HWND hWndTop = hWnd, hWndTemp = hWnd;
|
|
for (;;)
|
|
{
|
|
if (hWndTemp == NULL)
|
|
break;
|
|
else
|
|
hWndTop = hWndTemp;
|
|
hWndTemp = ::GetParent(hWndTop);
|
|
}
|
|
|
|
// get last active popup of first non-child that was found
|
|
if (hParent == NULL && hWnd != NULL)
|
|
hWnd = ::GetLastActivePopup(hWnd);
|
|
|
|
// disable and store top level parent window if specified
|
|
if (pWndTop != NULL)
|
|
{
|
|
if (hWndTop != NULL && ::IsWindowEnabled(hWndTop) && hWndTop != hWnd)
|
|
{
|
|
*pWndTop = hWndTop;
|
|
::EnableWindow(hWndTop, FALSE);
|
|
}
|
|
else
|
|
*pWndTop = NULL;
|
|
}
|
|
|
|
return hWnd; // return the owner as HWND
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// UI related CCmdTarget functions
|
|
|
|
CView* PASCAL CCmdTarget::GetRoutingView_()
|
|
{
|
|
CView* pView = AfxGetThreadState()->m_pRoutingView;
|
|
return pView;
|
|
}
|
|
|
|
CFrameWnd* PASCAL CCmdTarget::GetRoutingFrame_()
|
|
{
|
|
CFrameWnd* pFrame = AfxGetThreadState()->m_pRoutingFrame;
|
|
return pFrame;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|