CMainFrame.h中加入
void FullScreenModeOn(); void FullScreenModeOff(); CStatusBar m_wndStatusBar; CToolBar m_wndToolBar; CRect m_mainRect; bool m_bStatusBarWasVisible, m_bToolBarWasVisible;
cpp中
OnCreate函数
if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; ////////////////////////////////////////////////////////////////////////////////////不创建菜单栏状态栏工具栏 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("未能创建工具栏\n"); return -1; // 未能创建 } if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("未能创建状态栏\n"); return -1; // 未能创建 } // TODO: 如果不需要工具栏可停靠,则删除这三行 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); //////////////////////////////////////////////////////////////////////////////// //设置全屏 //{ //ModifyStyle(WS_CAPTION,0); ModifyStyle(WS_CAPTION,WS_DLGFRAME,SWP_FRAMECHANGED); SetMenu(NULL); //} FullScreenModeOn(); //::PostMessage(GetSafeHwnd(),WM_USER_CREATEDONE,0,0); return 0;
全屏开函数
void CMainFrame::FullScreenModeOn() { //GetWindowPlacement( &m_OldWndPlacement); //CRect WindowRect; //GetWindowRect(&WindowRect); //CRect ClientRect; //RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect); //ClientToScreen(&ClientRect); //// 获取屏幕的分辨率 //int nFullWidth=GetSystemMetrics(SM_CXSCREEN); //int nFullHeight=GetSystemMetrics(SM_CYSCREEN); //MoveWindow(0, 0, nFullWidth, nFullHeight); ////将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域, ////将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区位置间的差值, 就得到全屏显示的窗口位置 //m_FullScreenRect.left = WindowRect.left - ClientRect.left-2; //m_FullScreenRect.top = WindowRect.top - ClientRect.top-2; //m_FullScreenRect.right = WindowRect.right - ClientRect.right + nFullWidth+20; //m_FullScreenRect.bottom = WindowRect.bottom - ClientRect.bottom + nFullHeight+20; //m_bFullScreenMode = TRUE; ////设置全屏显示标志为 TRUE ////进入全屏显示状态 //WINDOWPLACEMENT wndpl; //wndpl.length=sizeof(WINDOWPLACEMENT); //wndpl.flags=0; //wndpl.showCmd=SW_SHOWNORMAL; //wndpl.rcNormalPosition=m_FullScreenRect; //SetWindowPlacement(&wndpl); //m_bFullScreenMode=true; ///////////////////////////////////////////方法二,需要将创建工具栏那块取消注释 m_bToolBarWasVisible=(m_wndToolBar.IsWindowVisible()!=0);//隐藏工具栏之前工具栏的显示状态 m_wndToolBar.ShowWindow(SW_HIDE);//隐藏工具栏 m_bStatusBarWasVisible=(m_wndStatusBar.IsWindowVisible()!=0);//隐藏状态栏之前状态栏的显示状态 m_wndStatusBar.ShowWindow(SW_HIDE);//隐藏状态栏 //SetMenu(NULL); GetWindowRect(&m_mainRect); LONG style=::GetWindowLong(m_hWnd,GWL_STYLE); style&=~(WS_CAPTION|WS_THICKFRAME); ::SetWindowLong(m_hWnd,GWL_STYLE,style); //得到当前系统的分辨率 int screenx=GetSystemMetrics(SM_CXSCREEN); int screeny=GetSystemMetrics(SM_CYSCREEN); // 全屏显示 SetWindowPos(NULL,-10,-10,screenx+20,screeny+20,SWP_NOZORDER); style=::GetWindowLong(this->m_hWnd,GWL_STYLE); //设置全屏显示标志 m_bFullScreenMode=true; //在其他窗体隐藏好后,将编辑视图放大到满屏 //this->ShowWindow (SW_SHOWMAXIMIZED); }
注意 LONG style=::GetWindowLong(m_hWnd,GWL_STYLE);
style&=~(WS_CAPTION|WS_THICKFRAME);
大多数全屏方法只是 style&=~WS_CAPTION; 而缺少WS_THICKFRAME造成了有时候会出现角边的情况。
全屏关函数
void CMainFrame::FullScreenModeOff() { //ShowWindow(SW_HIDE); //SetWindowPlacement(&m_OldWndPlacement); //m_bFullScreenMode=false; /////////////////////////////////////////////2 //恢复窗口标题 LONG style=::GetWindowLong(m_hWnd,GWL_STYLE); style|=WS_CAPTION; ::SetWindowLong(m_hWnd,GWL_STYLE,style); //如果需要,显示工具栏 if(m_bToolBarWasVisible) m_wndToolBar.ShowWindow(SW_SHOW); //如果需要,显示状态栏 if(m_bStatusBarWasVisible) m_wndStatusBar.ShowWindow(SW_SHOW); //恢复窗口以前的大小 MoveWindow(&m_mainRect); //设置全屏显示标志 m_bFullScreenMode=false; }
参考