1.在MainFrame.h的CMainFrame类中添加数据成员及成员函数:
class CMainFrame : public CMDIFrameWnd
{
......
//数据成员
RECT m_rcOldWnd;//旧的窗口位置及大小
BOOL m_bFullScreen; //全屏显示标志
//成员函数
void EnterFullScreen();//全屏
void QuitFullScreen();//退出全屏
}
2.在MainFrame.cpp中实现函数:
先在构造函数中初始化m_bFullScreen:
CMainFrame::CMainFrame():m_bFullScreen( false){...}
PreCreateWindow()和OnCreate()函数可以不修改,用默认的.
然后就是关键部分:实现全屏和退出全屏:
//进入全屏 void CMainFrame::EnterFullScreen() { //如果已经是全屏状态,则不处理 if(m_bFullScreen) { return ; } //保存旧窗口坐标位置 GetWindowRect(&m_rcOldWnd); //隐藏菜单栏,状态栏等,以便全屏 m_wndStatusBar.ShowWindow( SW_HIDE); m_wndToolBar.ShowWindow( SW_HIDE); SetMenu(NULL);//设置菜单为空 ModifyStyle(0 ,WS_POPUP); ModifyStyle(WS_CAPTION, 0); ModifyStyle(WS_BORDER,0); ModifyStyle(WS_THICKFRAME,0); //将窗口大小设为全屏, MoveWindow(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); MDIGetActive()->ShowWindow(SW_SHOWMAXIMIZED);//将视图区占满整个客户区 m_bFullScreen= true; } //退出全屏 void CMainFrame::QuitFullScreen() { //如果不是全屏状态,则不处理 if(!m_bFullScreen) { return ; } m_bFullScreen = false; //显示菜单栏,状态栏等 m_wndStatusBar.ShowWindow(SW_SHOW); m_wndToolBar.ShowWindow(SW_SHOW); //恢复到旧位置 MoveWindow(&m_rcOldWnd); ModifyStyle(0, WS_CAPTION); ModifyStyle(0, WS_BORDER); ModifyStyle(0, WS_THICKFRAME); //注意,此处不能用WS_MAXIMIZE,否则位置会变为第一次窗口的位置 ModifyStyle(0, WS_OVERLAPPED | FWS_ADDTOTITLE |WS_MINIMIZEBOX | WS_MAXIMIZEBOX /* |WS_MAXIMIZE*/); //重新加载菜单 SetMenu(CMenu::FromHandle(::LoadMenu( ::AfxGetApp()->m_hInstance ,MAKEINTRESOURCE( IDR_MDITYPE)))); //修改子窗口属性 MDIGetActive()->ModifyStyle( 0, WS_CHILD | WS_VISIBLE | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | FWS_ADDTOTITLE /*| WS_THICKFRAME*/ | WS_MINIMIZEBOX | WS_MAXIMIZEBOX /*| WS_MAXIMIZE*/); MDIGetActive()->ShowWindow(SW_SHOWNORMAL);//将子窗口视图区正常显示 ShowWindow(SW_SHOWNORMAL);//显示正常的主窗口 }
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或样式
if( !CMDIChildWnd::PreCreateWindow(cs) )
return FALSE;
//注意,要全屏千万不能有WS_THICKFRAME
cs.style = WS_CHILD | WS_VISIBLE | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU
| FWS_ADDTOTITLE /*| WS_THICKFRAME*/ | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_MAXIMIZE;
return TRUE;
}
4.现在全屏的功能已经完成,只需调用即可,可在MDIView.cpp里通过按键调用(F1全屏,F2退出全屏):
BOOL CMDIView::PreTranslateMessage( MSG* pMsg)
{
if ( pMsg->wParam == VK_F1)//进入全屏
{
(( CMainFrame*)::AfxGetMainWnd())->EnterFullScreen();//调用主框架里的函数
return TRUE;
}
if ( pMsg->wParam == VK_F2)//退出全屏
{
(( CMainFrame*)::AfxGetMainWnd())->QuitFullScreen();//调用主框架里的函数
return TRUE;
}
return CView ::PreTranslateMessage( pMsg);
}
5.总结:
要实现全屏效果,可隐藏标题,菜单和工具,状态栏等,然后把子窗口最大化即可.本文还有一些缺陷,如没有考虑到滚动条等.