2

ランドスケープ モードで実行するポケット PC 用のアプリケーションを開発しています。

画面を回転させる関数 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 度に回転することです。

デバッグ中に関数が 2 回目に実行されると、次の 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;
...
}
}

アプリケーションの最小化/最大化または複数の機能の実行を妨げる可能性のあるトリックで画面の向きを設定する他の方法を知っている人はいますか?

4

1 に答える 1

1

1 つは、SetScreenOrientation が別の OnSize 通知を送信する可能性が高いため、再帰呼び出しを検出し、それが発生したときに何もしないことです。

さらに重要なことは、ユーザーが本当に望んでいる向きをどうやって知るのでしょうか? アプリケーションの起動時に、向きを確認して保存できます。しかし、たまたま実行中にユーザーが方向を変更した場合、元に戻したときにユーザーは満足しません。おそらく、システム設定の変更の通知を確認し、ユーザーが自分で向きを変更したかどうかを検出できます。

于 2008-11-20T08:29:25.440 に答える