diff options
Diffstat (limited to 'samples/DX_APIUsage/Splash.cpp')
| -rw-r--r-- | samples/DX_APIUsage/Splash.cpp | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/samples/DX_APIUsage/Splash.cpp b/samples/DX_APIUsage/Splash.cpp new file mode 100644 index 0000000..f5aa853 --- /dev/null +++ b/samples/DX_APIUsage/Splash.cpp @@ -0,0 +1,185 @@ +#include "splash.h" + +const wchar_t SplashClassName[] = L"SplashWindowClass"; + +static HBITMAP g_hSplashBMP = nullptr; +static HDC g_hSplashDC = nullptr; +static HDC g_hMemoryDC = nullptr; +static LONG g_BitmapWidth = 628; +static LONG g_BitmapHeight = 888; +static HWND g_hSplashWnd = nullptr; +static UINT_PTR g_TimerId = 0; +static int g_iExitApplication = 0; + +#define DEMO_SPLASH_TIME 5000 + +LRESULT CALLBACK SplashWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + switch (Msg) + { + case WM_CLOSE: + g_iExitApplication = 1; + KillTimer(g_hSplashWnd, g_TimerId); + PostQuitMessage(0); + return 0; + + case WM_TIMER: + g_iExitApplication = 0; + KillTimer(g_hSplashWnd, g_TimerId); + PostQuitMessage(0); + return 0; + + case WM_ERASEBKGND: + BitBlt(reinterpret_cast<HDC>(wParam), 0, 0, g_BitmapWidth, g_BitmapHeight, g_hMemoryDC, 0, 0, SRCCOPY); + break; + + default: + return (DefWindowProc(hWnd, Msg, wParam, lParam)); + } + + return 0; +} + +int ShowSplash(HINSTANCE hInstance, UINT_PTR TimerId, int BitmapId) +{ + g_TimerId = TimerId; + if (TimerId == 0) + { + return 0; + } + + if (BitmapId == 0) + { + return 0; + } + + g_hSplashBMP = LoadBitmap(hInstance, MAKEINTRESOURCE(BitmapId)); + if (!g_hSplashBMP) + { + return 0; + } + + BITMAP Bitmap; + if (GetObject(g_hSplashBMP, sizeof(BITMAP), &Bitmap)) + { + g_BitmapWidth = Bitmap.bmWidth; + g_BitmapHeight = Bitmap.bmHeight; + } + + int X = 0; + int Y = 0; + RECT DesktopRect; + if (GetWindowRect(GetDesktopWindow(), &DesktopRect)) + { + X = (DesktopRect.right - g_BitmapWidth) / 2; + Y = (DesktopRect.bottom - g_BitmapHeight) / 2; + } + + WNDCLASSEX splashwc; + splashwc.cbSize = sizeof(WNDCLASSEX); + splashwc.style = 0; + splashwc.lpfnWndProc = SplashWndProc; + splashwc.cbClsExtra = 0; + splashwc.cbWndExtra = 0; + splashwc.hInstance = hInstance; + splashwc.hIcon = NULL; + splashwc.hIconSm = NULL; + splashwc.hCursor = LoadCursor(NULL, IDC_ARROW); + splashwc.hbrBackground = NULL; + splashwc.lpszMenuName = NULL; + splashwc.lpszClassName = SplashClassName; + if (!RegisterClassEx(&splashwc)) + { + return 0; + } + + g_hSplashWnd = CreateWindowEx( + 0, + SplashClassName, + L"Splash Screen", + WS_POPUP, + X, + Y, + Bitmap.bmWidth, + Bitmap.bmHeight, + NULL, + NULL, + hInstance, + NULL); + + if (!g_hSplashWnd) + { + return 0; + } + + g_hSplashDC = GetDC(g_hSplashWnd); + if (!g_hSplashDC) + { + return 0; + } + + g_hMemoryDC = CreateCompatibleDC(g_hSplashDC); + if (!g_hMemoryDC) + { + return 0; + } + + HGDIOBJ hGdiObj; + hGdiObj = SelectObject(g_hMemoryDC, g_hSplashBMP); + if (hGdiObj == NULL) + { + return 0; + } + + ShowWindow(g_hSplashWnd, SW_SHOW); + if (!UpdateWindow(g_hSplashWnd)) + { + return 0; + } + + if (!SetTimer(g_hSplashWnd, g_TimerId, DEMO_SPLASH_TIME, NULL)) + { + return 0; + } + + MSG msg; + + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return g_iExitApplication; +} + +int HideSplash() +{ + if (g_hSplashWnd) + { + KillTimer(g_hSplashWnd, g_TimerId); + + if (g_hSplashDC) + { + ReleaseDC(g_hSplashWnd, g_hSplashDC); + g_hSplashDC = nullptr; + } + + if (g_hMemoryDC) + { + ReleaseDC(g_hSplashWnd, g_hMemoryDC); + g_hMemoryDC = nullptr; + } + + DestroyWindow(g_hSplashWnd); + g_hSplashWnd = nullptr; + } + + if (g_hSplashBMP) + { + DeleteObject(g_hSplashBMP); + g_hSplashBMP = nullptr; + } + + return 0; +}
\ No newline at end of file |