mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-12-01 22:25:53 +01:00
124 lines
3.2 KiB
C++
124 lines
3.2 KiB
C++
/* Copyright (c) 2002-2012 Croteam Ltd.
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of version 2 of the GNU General Public License as published by
|
|
the Free Software Foundation
|
|
|
|
|
|
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, write to the Free Software Foundation, Inc.,
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
|
|
|
|
#include "StdH.h"
|
|
#include "resource.h"
|
|
|
|
#define NAME "Splash"
|
|
|
|
static HBITMAP _hbmSplash = NULL;
|
|
static BITMAP _bmSplash;
|
|
static HBITMAP _hbmSplashMask = NULL;
|
|
static BITMAP _bmSplashMask;
|
|
static HWND hwnd = NULL;
|
|
|
|
static long FAR PASCAL SplashWindowProc( HWND hWnd, UINT message,
|
|
WPARAM wParam, LPARAM lParam )
|
|
{
|
|
switch( message ) {
|
|
case WM_PAINT: {
|
|
PAINTSTRUCT ps;
|
|
BeginPaint(hWnd, &ps);
|
|
|
|
HDC hdcMem = CreateCompatibleDC(ps.hdc);
|
|
SelectObject(hdcMem, _hbmSplashMask);
|
|
BitBlt(ps.hdc, 0, 0, _bmSplash.bmWidth, _bmSplash.bmHeight, hdcMem, 0, 0,
|
|
SRCAND);
|
|
SelectObject(hdcMem, _hbmSplash);
|
|
BitBlt(ps.hdc, 0, 0, _bmSplash.bmWidth, _bmSplash.bmHeight, hdcMem, 0, 0,
|
|
SRCPAINT);
|
|
|
|
DeleteDC(hdcMem);
|
|
EndPaint(hWnd, &ps);
|
|
|
|
return 0;
|
|
} break;
|
|
case WM_ERASEBKGND: return 1; break;
|
|
}
|
|
return DefWindowProc(hWnd, message, wParam, lParam);
|
|
}
|
|
|
|
void ShowSplashScreen(HINSTANCE hInstance)
|
|
{
|
|
|
|
_hbmSplash = LoadBitmapA(hInstance, (char*)IDB_SPLASH);
|
|
if (_hbmSplash==NULL) {
|
|
return;
|
|
}
|
|
_hbmSplashMask = LoadBitmapA(hInstance, (char*)IDB_SPLASHMASK);
|
|
if (_hbmSplashMask==NULL) {
|
|
return;
|
|
}
|
|
|
|
GetObject(_hbmSplash, sizeof(BITMAP), (LPSTR) &_bmSplash);
|
|
GetObject(_hbmSplashMask, sizeof(BITMAP), (LPSTR) &_bmSplashMask);
|
|
if (_bmSplashMask.bmWidth != _bmSplash.bmWidth
|
|
||_bmSplashMask.bmHeight != _bmSplash.bmHeight) {
|
|
return;
|
|
}
|
|
|
|
int iScreenX = ::GetSystemMetrics(SM_CXSCREEN); // screen size
|
|
int iScreenY = ::GetSystemMetrics(SM_CYSCREEN);
|
|
|
|
WNDCLASSA wc;
|
|
wc.style = CS_HREDRAW | CS_VREDRAW;
|
|
wc.lpfnWndProc = SplashWindowProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = 0;
|
|
wc.hInstance = hInstance;
|
|
wc.hIcon = LoadIcon( hInstance, (LPCTSTR)IDR_MAINFRAME );
|
|
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
|
|
wc.hbrBackground = NULL;
|
|
wc.lpszMenuName = NAME;
|
|
wc.lpszClassName = NAME;
|
|
RegisterClassA(&wc);
|
|
|
|
/*
|
|
* create a window
|
|
*/
|
|
hwnd = CreateWindowExA(
|
|
WS_EX_TRANSPARENT|WS_EX_TOOLWINDOW,
|
|
NAME,
|
|
"SeriousSam loading...", // title
|
|
WS_POPUP,
|
|
iScreenX/2-_bmSplash.bmWidth/2,
|
|
iScreenY/2-_bmSplash.bmHeight/2,
|
|
_bmSplash.bmWidth,_bmSplash.bmHeight, // window size
|
|
NULL,
|
|
NULL,
|
|
hInstance,
|
|
NULL);
|
|
|
|
if(!hwnd) {
|
|
return;
|
|
}
|
|
|
|
ShowWindow( hwnd, SW_SHOW);
|
|
RECT rect;
|
|
GetClientRect(hwnd, &rect);
|
|
InvalidateRect(hwnd, &rect, TRUE);
|
|
UpdateWindow(hwnd);
|
|
}
|
|
|
|
void HideSplashScreen(void)
|
|
{
|
|
if (hwnd==NULL) {
|
|
return;
|
|
}
|
|
DestroyWindow(hwnd);
|
|
DeleteObject(_hbmSplash);
|
|
DeleteObject(_hbmSplashMask);
|
|
}
|