Создание экрана загрузки

Как правильно реализовать экран загрузки?

Например, у меня есть главное окно:

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);

Правильно ли я понимаю реализацию? Или это лучше сделать как-то через многопоточность?


Ответы (0 шт):