Поворот экрана на КПК - PullRequest
2 голосов
/ 20 ноября 2008

Я разрабатываю приложение для карманного ПК, которое должно работать в ландшафтном режиме.

Я написал функцию SetScreenOrientation (int angle), которая вращает экран. Эта функция вызывается при запуске и закрытии приложения. Я хочу изменить ориентацию экрана, когда я минимизирую / максимизирую ориентацию. Для этого я отредактировал следующую функцию:

void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
    RECT r;
    GetWindowRect(&r);

    RECT rstatus;
    rstatus.left = 0;
    rstatus.top = 0;
    rstatus.right = r.right;
    rstatus.bottom = TOOLBAR_HEIGHT;
    m_wndStatus.MoveWindow(&rstatus, TRUE);

    RECT rcamera;
    rcamera.left = 0;
    rcamera.top = 0;
    rcamera.right = r.right;
    rcamera.bottom = r.bottom - TOOLBAR_HEIGHT;
    m_wndCameraView.MoveWindow(&rcamera, TRUE);

    if(nType == SIZE_MAXIMIZED)
    {
        CScreenOrientation::SetScreenOrientation(270);
    }
    if(nType == SIZE_MINIMIZED)
    {
        CScreenOrientation::SetScreenOrientation(0);
    }
}

Проблема в том, что когда я минимизирую приложение, функция выполняется более одного раза, поэтому экран сначала поворачивается обратно на 0 градусов, а затем поворачивается на 270 градусов.

Во время отладки я вижу, что во второй раз, когда функция выполняется, исполняется следующий фрагмент кода wincore:

BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
...
switch (lpEntry->nSig)
    {
...
case AfxSig_v_u_ii:
        (this->*mmf.pfn_v_u_i_i)(static_cast<UINT>(wParam), LOWORD(lParam), HIWORD(lParam));
        break;
...
}
}

Кто-нибудь знает какой-либо другой способ установки ориентации экрана при минимизации / максимизации приложения или какой-либо хитрости, которая может помешать выполнению нескольких функций?

1 Ответ

1 голос
/ 20 ноября 2008

С одной стороны, вполне вероятно, что SetScreenOrientation собирается дать вам еще одно уведомление OnSize, поэтому вы хотите обнаруживать рекурсивные вызовы и ничего не делать, когда это происходит.

Что более важно, откуда вы знаете, какую ориентацию действительно хочет пользователь? Когда ваше приложение запускается, вы можете проверить ориентацию и сохранить ее. Но если пользователь изменил ориентацию во время работы, он не будет счастлив, когда вы вернете его обратно. Может быть, вы можете проверить уведомления об изменениях настроек системы и определить, изменил ли пользователь ориентацию самостоятельно.

...