MFC全屏

来源:互联网 发布:pl sql develop 编辑:程序博客网 时间:2024/05/16 16:58

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.csdn.net/tmljs1988/article/details/5766026#comments

原创粉丝点击