Создание экрана загрузки
Как правильно реализовать экран загрузки?
Например, у меня есть главное окно:
MainWindow::MainWindow(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR lpCmdLine,
int nCmdShow) // ctr for main window (using in main.cpp)
{
this->hInstance = hInstance;
WNDCLASSEX wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.cbSize = sizeof(WNDCLASSEX);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_WINDOW + 6;
wc.hInstance = hInstance;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.lpfnWndProc = MainWindow::_WndProc;
wc.lpszMenuName = NULL;
wc.lpszClassName = "WinMainClass";
if (!RegisterClassEx(&wc))
{
throw MyException("Error of register Class",MyException::errors::CREATE_REGISTER_ERROR); // for try / catch (main.cpp)
}
hWnd = CreateWindowEx(0,
wc.lpszClassName,
"MainW",
WS_CAPTION | WS_SYSMENU |WS_MINIMIZEBOX,
//WS_OVERLAPPEDWINDOW,
windowX, windowY, windowW, windowH,
nullptr, nullptr, hInstance, nullptr);
if(!hWnd) throw MyException("Error of create HWND",MyException::errors::CREATE_WINDOW_ERROR);
LONG_PTR val = reinterpret_cast<LONG_PTR>(this);
SetWindowLongPtr(hWnd, GWLP_USERDATA, val);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
}
И окно, которое показывает пользователю готовность главного окна для отображения в процентах
SplashScreen::SplashScreen(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.cbSize = sizeof(WNDCLASSEX);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_WINDOW + 6;
wc.hInstance = hInstance;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.lpfnWndProc = DefWindowProc;
wc.lpszMenuName = NULL;
wc.lpszClassName = "SplashScreen";
if (!RegisterClassEx(&wc))
{
throw MyException("Error of register Class",MyException::errors::CREATE_REGISTER_ERROR);
}
hWnd = CreateWindowEx(0,
wc.lpszClassName,
"SplashScreen",
WS_CAPTION | WS_SYSMENU |WS_MINIMIZEBOX,
//WS_OVERLAPPEDWINDOW,
windowX, windowY, windowW, windowH,
nullptr, nullptr, hInstance, nullptr);
if(!hWnd) throw MyException("Error of create HWND",MyException::errors::CREATE_WINDOW_ERROR);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
}
То есть, я должен экземпляр класса MainWindiow в конструкторе SplashScreen, а в самом классе (MainWindow), например, метод bool IsLoad(); и в цикле
MSG msg;
while (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
{
return msg.wParam;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
проверять true/false, если true, тогда
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
Правильно ли я понимаю реализацию? Или это лучше сделать как-то через многопоточность?