简单实现全屏对话框

在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)这个参数得到的。

posted @ 2013-08-12 20:27  爱好奇  阅读(363)  评论(0编辑  收藏  举报