在VC中实现一个占据整个Windows桌面(包括任务栏等)的全屏对话框的其实并不难。两行代码搞定:
GetWindowLong(hWnd, GWL_STYLE) & ~WS_MAXIMIZEBOX); // 去掉WS_MAXIMIZEBOX风格
ShowWindow(hWnd, SW_MAXIMIZE); // 最大化显式窗口
如果再加上TOPMOST属性,一般的全屏要求也就如此了吧。
再接着说,如何防止无标题的窗口最大化时遮住任务栏,可在WM_GETMINMAXINFO消息中进行处理:
// 防止窗口最大化时会遮住任务栏
MINMAXINFO *pmmi = (MINMAXINFO*)lParam;
pmmi->ptMaxSize.y = GetSystemMetrics(SM_CYFULLSCREEN) + GetSystemMetrics(SM_CYCAPTION);
RECT rc1, rc2;
::GetWindowRect (_WndMenuInfo.hWnd, &rc1);
::GetClientRect (_WndMenuInfo.hWnd, &rc2);
int borderWidth = (rc1.bottom - rc1.top) - (rc2.bottom - rc2.top);
pmmi->ptMaxSize.y += borderWidth;
那么如何拦截最大化、还原事件呢?光拦截SC_MAXMIZE、SC_RESTORE是不行的,因为双击标题栏、最大化窗口的拖动标题栏时都会触发最大化、还原事件,所以还需拦截这些事件,代码如下:
LRESULT CTest::OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if (wParam == SC_MAXIMIZE || wParam == 0xF032)
{
TRACE(_T("还原"));
}
else if (wParam == SC_RESTORE || wParam == 0xF122 || wParam == 0xF012)
{
TRACE(_T("最大化"));
}
return 0;
}
0xF032、0xF122、0xF012这三个值是我通过TRACE (wParam)这个参数得到的。