293 lines
6.5 KiB
C++
293 lines
6.5 KiB
C++
|
/*
|
||
|
** Command & Conquer Renegade(tm)
|
||
|
** Copyright 2025 Electronic Arts Inc.
|
||
|
**
|
||
|
** This program is free software: you can redistribute it and/or modify
|
||
|
** it under the terms of the GNU General Public License as published by
|
||
|
** the Free Software Foundation, either version 3 of the License, or
|
||
|
** (at your option) any later version.
|
||
|
**
|
||
|
** This program is distributed in the hope that it will be useful,
|
||
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
** GNU General Public License for more details.
|
||
|
**
|
||
|
** You should have received a copy of the GNU General Public License
|
||
|
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
// SplashScreen.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "leveledit.h"
|
||
|
#include "SplashScreen.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// SplashScreenClass
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
SplashScreenClass::SplashScreenClass (void)
|
||
|
: m_Size (0, 0),
|
||
|
m_hFont (NULL),
|
||
|
m_hBitmap (NULL),
|
||
|
m_hMemDC (NULL)
|
||
|
{
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// ~SplashScreenClass
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
SplashScreenClass::~SplashScreenClass (void)
|
||
|
{
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(SplashScreenClass, CWnd)
|
||
|
//{{AFX_MSG_MAP(SplashScreenClass)
|
||
|
ON_WM_CREATE()
|
||
|
ON_WM_PAINT()
|
||
|
ON_WM_DESTROY()
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// OnCreate
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
int
|
||
|
SplashScreenClass::OnCreate (LPCREATESTRUCT lpCreateStruct)
|
||
|
{
|
||
|
if (CWnd::OnCreate(lpCreateStruct) == -1)
|
||
|
return -1;
|
||
|
|
||
|
//
|
||
|
// Load the splash background from the resource section
|
||
|
//
|
||
|
m_hBitmap = (HBITMAP)::LoadImage ( ::AfxGetResourceHandle (),
|
||
|
MAKEINTRESOURCE (IDB_SPLASH),
|
||
|
IMAGE_BITMAP,
|
||
|
0,
|
||
|
0,
|
||
|
LR_CREATEDIBSECTION);
|
||
|
|
||
|
//
|
||
|
// Get the dimensions of the BMP
|
||
|
//
|
||
|
BITMAP bmp_info = { 0 };
|
||
|
if (::GetObject (m_hBitmap, sizeof (BITMAP), &bmp_info) != 0) {
|
||
|
|
||
|
//
|
||
|
// Resize the window so the BMP compeletely fills the window
|
||
|
//
|
||
|
m_Size.cx = bmp_info.bmWidth;
|
||
|
m_Size.cy = bmp_info.bmHeight;
|
||
|
SetWindowPos ( NULL,
|
||
|
(::GetSystemMetrics (SM_CXSCREEN) >> 1) - (m_Size.cx >> 1),
|
||
|
(::GetSystemMetrics (SM_CYSCREEN) >> 1) - (m_Size.cy >> 1),
|
||
|
m_Size.cx,
|
||
|
m_Size.cy,
|
||
|
SWP_NOZORDER);
|
||
|
|
||
|
//
|
||
|
// Create a memory DC (for drawing) and the font object we will use
|
||
|
//
|
||
|
m_hMemDC = ::CreateCompatibleDC (NULL);
|
||
|
m_hFont = ::CreateFont (-::MulDiv (7, GetDeviceCaps(m_hMemDC, LOGPIXELSY), 72),
|
||
|
0,
|
||
|
0,
|
||
|
0,
|
||
|
FW_REGULAR,
|
||
|
FALSE,
|
||
|
FALSE,
|
||
|
FALSE,
|
||
|
ANSI_CHARSET,
|
||
|
OUT_DEFAULT_PRECIS,
|
||
|
CLIP_DEFAULT_PRECIS,
|
||
|
DEFAULT_QUALITY,
|
||
|
DEFAULT_PITCH,
|
||
|
"Small Fonts");
|
||
|
}
|
||
|
|
||
|
SetForegroundWindow ();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// OnPaint
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
void
|
||
|
SplashScreenClass::OnPaint (void)
|
||
|
{
|
||
|
CPaintDC dc (this);
|
||
|
|
||
|
if (m_hMemDC != NULL && m_hBitmap != NULL) {
|
||
|
|
||
|
//
|
||
|
// Paint the BMP into the window
|
||
|
//
|
||
|
HBITMAP old_bmp = (HBITMAP)::SelectObject (m_hMemDC, m_hBitmap);
|
||
|
::BitBlt ((HDC)dc, 0, 0, m_Size.cx, m_Size.cy, m_hMemDC, 0, 0, SRCCOPY);
|
||
|
::SelectObject (m_hMemDC, old_bmp);
|
||
|
|
||
|
//
|
||
|
// Update the status text in the window
|
||
|
//
|
||
|
Paint_Status_Text (dc);
|
||
|
}
|
||
|
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Set_Status_Text
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
void
|
||
|
SplashScreenClass::Set_Status_Text (LPCTSTR text)
|
||
|
{
|
||
|
m_StatusText = text;
|
||
|
|
||
|
//
|
||
|
// Repaint the status text area of the window
|
||
|
//
|
||
|
HDC hdc = ::GetDC (m_hWnd);
|
||
|
Paint_Status_Text (hdc);
|
||
|
::ReleaseDC (m_hWnd, hdc);
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Paint_Status_Text
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
void
|
||
|
SplashScreenClass::Paint_Status_Text (HDC hdc)
|
||
|
{
|
||
|
if (m_StatusText.GetLength () > 0) {
|
||
|
|
||
|
//
|
||
|
// Select the correct font, pen, and brush into the DC
|
||
|
//
|
||
|
HFONT old_font = (HFONT)::SelectObject (hdc, m_hFont);
|
||
|
HPEN old_pen = (HPEN)::SelectObject (hdc, ::GetStockObject (WHITE_PEN));
|
||
|
HBRUSH old_brush = (HBRUSH)::SelectObject (hdc, ::GetStockObject (BLACK_BRUSH));
|
||
|
::SetTextColor (hdc, RGB (255, 255, 255));
|
||
|
::SetBkColor (hdc, RGB (128, 128, 128));
|
||
|
|
||
|
//
|
||
|
// Draw the status text in its correct position
|
||
|
//
|
||
|
RECT rect;
|
||
|
rect.left = 15;
|
||
|
rect.right = m_Size.cx - 15;
|
||
|
rect.top = 224;
|
||
|
rect.bottom = 238;
|
||
|
//::DrawText (hdc, m_StatusText, m_StatusText.GetLength (), &rect, DT_LEFT | DT_BOTTOM);
|
||
|
::ExtTextOut (hdc, 15, 225, ETO_OPAQUE, &rect, m_StatusText, m_StatusText.GetLength (), NULL);
|
||
|
|
||
|
|
||
|
// Restore the original settings
|
||
|
::SelectObject (hdc, old_brush);
|
||
|
::SelectObject (hdc, old_pen);
|
||
|
::SelectObject (hdc, old_font);
|
||
|
}
|
||
|
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// OnDestroy
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
void
|
||
|
SplashScreenClass::OnDestroy (void)
|
||
|
{
|
||
|
if (m_hMemDC != NULL) {
|
||
|
::DeleteDC (m_hMemDC);
|
||
|
m_hMemDC = NULL;
|
||
|
}
|
||
|
|
||
|
if (m_hBitmap != NULL) {
|
||
|
::DeleteObject (m_hBitmap);
|
||
|
m_hBitmap = NULL;
|
||
|
}
|
||
|
|
||
|
if (m_hFont != NULL) {
|
||
|
::DeleteObject (m_hFont);
|
||
|
m_hFont = NULL;
|
||
|
}
|
||
|
|
||
|
CWnd::OnDestroy ();
|
||
|
|
||
|
//
|
||
|
// Its assumed this window is operating on a separate thread...
|
||
|
//
|
||
|
::PostQuitMessage (0);
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// WindowProc
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
LRESULT
|
||
|
SplashScreenClass::WindowProc
|
||
|
(
|
||
|
UINT message,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
if (message == WM_USER+102) {
|
||
|
Set_Status_Text ((LPCTSTR)lParam);
|
||
|
} else if (message == WM_USER+101) {
|
||
|
DestroyWindow ();
|
||
|
return 1L;
|
||
|
}
|
||
|
|
||
|
return CWnd::WindowProc (message, wParam, lParam);
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// PostNcDestroy
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
void
|
||
|
SplashScreenClass::PostNcDestroy (void)
|
||
|
{
|
||
|
CWnd::PostNcDestroy ();
|
||
|
|
||
|
// Hehe... :)
|
||
|
delete this;
|
||
|
return ;
|
||
|
}
|