mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
117 lines
2.3 KiB
C++
117 lines
2.3 KiB
C++
#include "stdafx.h"
|
|
#include "Application.h"
|
|
|
|
// We're an application, so, we require GDI+, ComCtl32
|
|
#pragma comment(lib, "Gdiplus.lib")
|
|
#pragma comment(lib, "Comctl32.lib")
|
|
|
|
namespace Forms
|
|
{
|
|
// We haven't initialized it yet...
|
|
std::atomic<bool> Application::IsGdipInitialized = false;
|
|
ULONG_PTR Application::GdipToken = NULL;
|
|
|
|
void Application::Run(Form* MainWindow)
|
|
{
|
|
if (MainWindow == nullptr)
|
|
return;
|
|
|
|
// Initialize COM
|
|
OleInitialize(NULL);
|
|
|
|
#if _DEBUG
|
|
if (!IsGdipInitialized)
|
|
printf("-- Warning: GDI+ has not been initialized before Application::Run() --\n");
|
|
#endif
|
|
|
|
// Execute on the main loop
|
|
Application::RunMainLoop(MainWindow);
|
|
|
|
if (MainWindow)
|
|
delete MainWindow;
|
|
|
|
// Shutdown COM
|
|
OleUninitialize();
|
|
}
|
|
|
|
void Application::RunDialog(Form* MainDialog)
|
|
{
|
|
// We must disable the owner dialog so that we can properly be the focus
|
|
auto HwndOwner = GetWindowLongPtr(MainDialog->GetHandle(), GWLP_HWNDPARENT);
|
|
if (HwndOwner != NULL)
|
|
{
|
|
if (IsWindowEnabled((HWND)HwndOwner))
|
|
EnableWindow((HWND)HwndOwner, false);
|
|
}
|
|
|
|
RunMainLoop(MainDialog);
|
|
|
|
// We must re-enable the owner window
|
|
if (HwndOwner != NULL)
|
|
EnableWindow((HWND)HwndOwner, true);
|
|
}
|
|
|
|
void Application::EnableVisualStyles()
|
|
{
|
|
SetProcessDPIAware();
|
|
if (!IsGdipInitialized)
|
|
InitializeGdip();
|
|
}
|
|
|
|
void Application::RunMainLoop(Form* MainWindow)
|
|
{
|
|
bool ContinueLoop = true;
|
|
|
|
//
|
|
// Initialize the main window before starting the message pump...
|
|
//
|
|
|
|
MainWindow->Show();
|
|
|
|
//
|
|
// Loop until any of the conditions are met...
|
|
//
|
|
|
|
MSG nMSG;
|
|
while (ContinueLoop)
|
|
{
|
|
auto Peeked = PeekMessage(&nMSG, NULL, 0, 0, PM_NOREMOVE);
|
|
|
|
if (Peeked)
|
|
{
|
|
if (!GetMessage(&nMSG, NULL, 0, 0))
|
|
continue;
|
|
|
|
TranslateMessage(&nMSG);
|
|
DispatchMessage(&nMSG);
|
|
|
|
if (MainWindow)
|
|
ContinueLoop = !MainWindow->CheckCloseDialog(false);
|
|
}
|
|
else if (MainWindow == nullptr || MainWindow->GetState(ControlStates::StateDisposed))
|
|
{
|
|
break;
|
|
}
|
|
else if (!PeekMessage(&nMSG, NULL, 0, 0, PM_NOREMOVE))
|
|
{
|
|
WaitMessage();
|
|
}
|
|
}
|
|
}
|
|
|
|
void Application::InitializeGdip()
|
|
{
|
|
IsGdipInitialized = true;
|
|
|
|
Gdiplus::GdiplusStartupInput gdipStartup;
|
|
Gdiplus::GdiplusStartup(&GdipToken, &gdipStartup, NULL);
|
|
}
|
|
|
|
void Application::ShutdownGdip()
|
|
{
|
|
IsGdipInitialized = false;
|
|
|
|
Gdiplus::GdiplusShutdown(GdipToken);
|
|
}
|
|
}
|