我正在开发一款应该以横向模式运行的掌上电脑应用程序。
我写了一个旋转屏幕的函数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;
...
}
}
有没有人知道在应用程序最小化/最大化或任何可能阻止多功能执行的技巧上设置屏幕方向的任何其他方法?
答案 0 :(得分:1)
首先,似乎SetScreenOrientation会为您提供另一个OnSize通知,因此您希望检测递归调用,并在发生这种情况时不执行任何操作。
更重要的是,您如何知道用户真正想要的方向?当您的应用程序启动时,您可以检查方向并保存。但是,如果用户在您正在运行时更改了方向,那么当您将其更改回来时,他们将不会感到高兴。也许您可以检查系统设置更改的通知,并检测用户是否自己更改了方向。