Поделиться через


Активация приложения (DirectX и C++)

В этом разделе показано, как определить интерфейс активации для приложения DirectX универсальная платформа Windows (UWP).

Регистрация обработчика событий активации приложения

Сначала зарегистрируйтесь для обработки события CoreApplicationView::Activated , которое возникает при запуске и инициализации приложения операционной системой.

Добавьте этот код в реализацию метода IFrameworkView::Initialize поставщика представлений (с именем MyViewProvider в примере):

void App::Initialize(CoreApplicationView^ applicationView)
{
    // Register event handlers for the app lifecycle. This example includes Activated, so that we
    // can make the CoreWindow active and start rendering on the window.
    applicationView->Activated +=
        ref new TypedEventHandler<CoreApplicationView^, IActivatedEventArgs^>(this, &App::OnActivated);
  
  //...

}

Активация экземпляра CoreWindow для приложения

При запуске приложения необходимо получить ссылку на CoreWindow для приложения. CoreWindow содержит диспетчер сообщений событий окна, который приложение использует для обработки событий окна. Получите эту ссылку в обратном вызове для события активации приложения, вызвав CoreWindow::GetForCurrentThread. После получения этой ссылки активируйте главное окно приложения, вызвав CoreWindow::Activate.

void App::OnActivated(CoreApplicationView^ applicationView, IActivatedEventArgs^ args)
{
    // Run() won't start until the CoreWindow is activated.
    CoreWindow::GetForCurrentThread()->Activate();
}

Начало обработки сообщения о событии для главного окна приложения

Обратные вызовы происходят, так как сообщения о событиях обрабатываются CoreDispatcher для CoreWindow приложения. Этот обратный вызов не будет вызываться, если вы не вызываете CoreDispatcher::P rocessEvents из основного цикла приложения (реализовано в методе IFrameworkView::Run поставщика представлений).

// This method is called after the window becomes active.
void App::Run()
{
    while (!m_windowClosed)
    {
        if (m_windowVisible)
        {
            CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);

            m_main->Update();

            if (m_main->Render())
            {
                m_deviceResources->Present();
            }
        }
        else
        {
            CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessOneAndAllPending);
        }
    }
}