Win7 home版 窗口最大化问题
问题:
程序设计是在进入编辑模式时,把回放窗口最大化,并且禁止窗口还原和拖动等操作。但是测试发现,进入编辑模式,回放窗口最大化,点击还原,窗口能够还原,再点击,变成最大化。
这种情况在我的机器(Win7 旗舰版)上没有出现(关闭最大化后窗口不能还原),在专用测试机上(win7专业版)也没有出现(不能还原)。在生产的两台机器上,一台有问题(能还原),一台正常(不能还原)。
程序中在进入编辑模式时:
ShowWindow(SW_SHOWMAXIMIZED);//最大化
//不准拖动
CMenu* pTopMenu = GetSystemMenu(FALSE);
if(pTopMenu != NULL)
{
pTopMenu -> RemoveMenu(SC_SIZE, MF_BYCOMMAND); //SC_SIZE
pTopMenu -> RemoveMenu(SC_RESTORE, MF_BYCOMMAND); //SC_RESTORE
pTopMenu -> RemoveMenu(SC_MOVE, MF_BYCOMMAND);
pTopMenu -> RemoveMenu(SC_MAXIMIZE, MF_BYCOMMAND);
}
在退出编辑模式时
//允许拖动
CMenu* pTopMenu = GetSystemMenu(FALSE);
if(pTopMenu != NULL)
{
pTopMenu -> AppendMenu(MF_ENABLED ,SC_SIZE);
pTopMenu -> AppendMenu(MF_ENABLED ,SC_RESTORE);
pTopMenu -> AppendMenu(MF_ENABLED ,SC_MOVE);
pTopMenu -> AppendMenu(MF_ENABLED ,SC_MAXIMIZE);
}
除了最大化功能,其它都正常(不能拖动等)。
测试:
生产机器用两台做对比,其中一台正常,一台不正常。经过以下测试:
1. 怀疑是硬件差异,拆开机器,看电脑配置,其型号完全一样。所以不存在硬件差异。
2. 对出问题的机器采用系统还原。还是有问题。
3. 对出问题的机器换用另外一个硬盘(双硬盘双系统,都是Win7Home版)。问题依旧。
4. 在出问题的机器上装VS2008+SP1,装完后在VC中运行程序。程序正常了,再运行以前的软件(exe),一切都正常了。
5. 恢复系统,运行程序,有问题,再装VS2008 ,运行程序,有问题,在VC中运行,还是有问题。装VS2008SP1,还是有问题。跟踪每个函数,函数返回值正确,没有错误。
6. 调试和修改程序,突然问题没有了。恢复修改的代码,程序还是正常,再运行以前的软件(exe),一切都正常了。
7. 重装系统(Win7 Home),运行程序,问题依然。再装VS2008 + SP1,同样有问题。
8. 查看两台机器的系统差异,发现有问题的机器装的Win7+ SP1,没问题的机器装的Win7,没SP1,怀疑是Win7SP1的问题。
9. 装没有SP1的Win7,还是有问题,装VS2008,还是有问题。不是Win7SP1的问题。
解决:
实在找不出问题所在,只能从解决问题入手。仅仅是解决了问题,根本原因还是没有找到。
解决方法:
1. 在最大化后,去掉最大化按钮
ShowWindow(SW_RESTORE);//先让窗口复位,这样避免在已经是最大化时,最大化按钮还是显示
//不准拖动
LONG lStyle= ::GetWindowLong(m_hWnd,GWL_STYLE);
lStyle &= ~(WS_MAXIMIZEBOX);
::SetWindowLong(m_hWnd,GWL_STYLE,lStyle);
CMenu* pTopMenu = GetSystemMenu(FALSE);
if(pTopMenu != NULL)
{
pTopMenu -> RemoveMenu(SC_SIZE, MF_BYCOMMAND); //SC_SIZE
pTopMenu -> RemoveMenu(SC_RESTORE, MF_BYCOMMAND); //SC_RESTORE
pTopMenu -> RemoveMenu(SC_MOVE, MF_BYCOMMAND);
pTopMenu -> RemoveMenu(SC_MAXIMIZE, MF_BYCOMMAND);
}
ShowWindow(SW_SHOWMAXIMIZED);//最大化
2. 在回到正常模式时,加上最大化按钮
//允许拖动
LONG lStyle= ::GetWindowLong(m_hWnd,GWL_STYLE);
lStyle |= (WS_MAXIMIZEBOX);
::SetWindowLong(m_hWnd,GWL_STYLE,lStyle);
CMenu* pTopMenu = GetSystemMenu(FALSE);
if(pTopMenu != NULL)
{
pTopMenu -> AppendMenu(MF_ENABLED ,SC_SIZE);
pTopMenu -> AppendMenu(MF_ENABLED ,SC_RESTORE);
pTopMenu -> AppendMenu(MF_ENABLED ,SC_MOVE);
pTopMenu -> AppendMenu(MF_ENABLED ,SC_MAXIMIZE);
}
ShowWindow(SW_RESTORE);
3. 使用WindowProc拦截最大化、还原、和标题栏双击鼠标消息
if(m_bEditMode)
{//在编辑模式才需要处理
if(message == WM_SYSCOMMAND &&( wParam == SC_MAXIMIZE || wParam == SC_RESTORE))
{
return 1;
}
if(message == WM_NCLBUTTONDBLCLK)
{
return 1;
}
}
结语:
有些问题,我们是不知道为什么的。我们只能在当问题出现了的时候,再来想办法解决。这也是一种解决问题的方法。