单文档完美全屏,不会出现有时候全屏不了的情况

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;
}

参考

你可能感兴趣的:(全屏,单文档)