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);//显示正常的主窗口
}
接着,在子窗口的ChildFrame.cpp里设置窗口属性:
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;
}
3.现在全屏的功能已经完成,只需调用即可,可在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);
}
4.总结:要实现全屏效果,可隐藏标题,菜单和工具,状态栏等,然后把子窗口最大化即可.本文还有一些缺陷,如没有考虑到滚动条等.
http://blog.youkuaiyun.com/tmljs1988/article/details/5766026#comments