在分屏窗口中最大化,点击任务栏切换最大,最小化,出现图1情况。
图1
Demo说明:从WindowImplBase派生出来的窗体,未重写父类方法。
注意:分屏的显示器分辨率大于电脑主显示的分辨率。
Bug原因:LPMINMAXINFO的结构体数据赋值错误。
解决方法:修改两个地方
LRESULT WindowImplBase::OnGetMinMaxInfo(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
MONITORINFO oMonitor = {};
oMonitor.cbSize = sizeof(oMonitor);
::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTOPRIMARY), &oMonitor);
CDuiRect rcWork = oMonitor.rcWork;
rcWork.Offset(-oMonitor.rcMonitor.left, -oMonitor.rcMonitor.top);
LPMINMAXINFO lpMMI = (LPMINMAXINFO)lParam;
lpMMI->ptMaxPosition.x = rcWork.left;
lpMMI->ptMaxPosition.y = rcWork.top;
lpMMI->ptMaxSize.x = rcWork.right;
lpMMI->ptMaxSize.y = rcWork.bottom;
bHandled = FALSE;
return 0;
}
LRESULT WindowImplBase::OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
LPRECT pRect=NULL;
if ( wParam == TRUE)
{
LPNCCALCSIZE_PARAMS pParam = (LPNCCALCSIZE_PARAMS)lParam;
pRect=&pParam->rgrc[0];
}
else
{
pRect=(LPRECT)lParam;
}
if ( ::IsZoomed(m_hWnd))
{ // 最大化时,计算当前显示器最适合宽高度
MONITORINFO oMonitor = {};
oMonitor.cbSize = sizeof(oMonitor);
::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTONEAREST), &oMonitor);
CDuiRect rcWork = oMonitor.rcWork;
CDuiRect rcMonitor = oMonitor.rcMonitor;
rcWork.Offset(-oMonitor.rcMonitor.left, -oMonitor.rcMonitor.top);
pRect->right = pRect->left + rcWork.GetWidth();
pRect->bottom = pRect->top + rcWork.GetHeight();
return WVR_REDRAW;
}
return 0;
}