2

我正在为应该在横向模式下运行的掌上电脑开发一个应用程序。

我编写了函数 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;
...
}
}

有谁知道在应用程序最小化/最大化上设置屏幕方向的任何其他方法或任何可能阻止多个功能执行的技巧?

4

1 回答 1

1

一方面,SetScreenOrientation 似乎很可能会给您另一个 OnSize 通知,因此您希望检测递归调用并且在发生这种情况时什么也不做。

更重要的是,你怎么知道用户真正想要什么方向?当您的应用程序启动时,您可以检查方向并保存它。但是如果用户在你跑步的时候改变了方向,当你把它改回来时,他们不会高兴的。也许您可以检查系统设置更改的通知并检测用户是否自己更改了方向。

于 2008-11-20T08:29:25.440 回答