MFC MDI 全屏实现

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);//显示正常的主窗口
}

3. 接着,在子窗口的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;
}


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.总结:

要实现全屏效果,可隐藏标题,菜单和工具,状态栏等,然后把子窗口最大化即可.本文还有一些缺陷,如没有考虑到滚动条等.

你可能感兴趣的:(框架,null,Class,mfc,工具,border)