⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.cpp

📁 全屏显示
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	CMDIFrameWnd::OnDisplayChange(wParam, lParam);
 
	//若当前处于全屏状态,而且屏幕的大小改变;
	if(IsFullScreenMode() && m_dwOldScreenSize!=lParam)
	{
		//重新设置全屏状态;
		ExpandToFullScreen();
		//保存屏幕大小;
		m_dwOldScreenSize=lParam;
	}
	return 0;
}

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
{
	if (IsFullScreenMode())
	{
		//在全屏状态下提供MINMAXINFO信息
		POINT pt;
		pt.x=m_wndplFullScreenMain.rcNormalPosition.right-m_wndplFullScreenMain.rcNormalPosition.left;
		pt.y=m_wndplFullScreenMain.rcNormalPosition.bottom-m_wndplFullScreenMain.rcNormalPosition.top;
		lpMMI->ptMaxSize = 	lpMMI->ptMaxTrackSize = pt;
		lpMMI->ptMaxPosition.x = m_wndplFullScreenMain.ptMaxPosition.x;
		lpMMI->ptMaxPosition.y = m_wndplFullScreenMain.ptMaxPosition.y;
	}
	else
		CMDIFrameWnd::OnGetMinMaxInfo(lpMMI);  
}

void CMainFrame::OnSetShowmenu() 
{
	m_bShowMenuBarInFullScreenMode=!m_bShowMenuBarInFullScreenMode;
	if (IsFullScreenMode())
	{
		//重新扩展到全屏;
		ExpandToFullScreen();
	}
}

void CMainFrame::OnSetShowscrollbar() 
{
	m_bShowScrollBar=!m_bShowScrollBar;
	HWND hWnd;
	WINDOWPLACEMENT * pWndpl;
	UINT uStyle;
	POSITION pos=m_mapHWndToWndpl.GetStartPosition();
	while(pos)
	{
		m_mapHWndToWndpl.GetNextAssoc(pos,hWnd,pWndpl);
		if (hWnd!=GetSafeHwnd())
		{
			//取得风格;
			uStyle=::GetWindowLong(hWnd,GWL_STYLE);
			//据情况取舍;
			if (m_bShowScrollBar)
				uStyle|=WS_HSCROLL|WS_VSCROLL;
			else
				uStyle&=~(WS_HSCROLL|WS_VSCROLL);
			//写回风格并刷新窗口;
			::SetWindowLong(hWnd,GWL_STYLE,uStyle);
			::SetWindowPos(hWnd,NULL,0,0,0,0,SWP_NOACTIVATE|SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
		}
	}
}

void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR lpszSection) 
{
	CMDIFrameWnd::OnSettingChange(uFlags, lpszSection);
 
	//若当前处于全屏状态,而且界面元素的大小改变;
	if(IsFullScreenMode() && uFlags==SPI_SETNONCLIENTMETRICS)
	{
		//重新设置全屏状态;
		ExpandToFullScreen();
	}
}

void CMainFrame::OnSysCommand(UINT nID, LONG lParam)
{
	//取得项级窗口的指针;
	CFrameWnd* pFrameWnd = GetTopLevelFrame();
	ASSERT_VALID(pFrameWnd);

	//在全屏和非帮助状态下;
	if (!pFrameWnd->m_bHelpMode && IsFullScreenMode())
	{
		switch(nID)
		{
		case SC_SIZE:
		case SC_MAXIMIZE://加入对系统挂钩程序的支持;
		case SC_MOVE:
		case ID_GRAYEDMOVE://自行加入的命令;
			break;//什么也不做;
		default:
			CMDIFrameWnd::OnSysCommand(nID,lParam);
			break;
		}
	}
	else
		CMDIFrameWnd::OnSysCommand(nID, lParam);
}

void CMainFrame::OnUpdateSetShowmenu(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_bShowMenuBarInFullScreenMode);	
}

void CMainFrame::OnUpdateSetShowscrollbar(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(ShowScrollBar());
}

void CMainFrame::OnUpdateViewFullscreen(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(IsFullScreenMode());
}

void CMainFrame::OnUpdateViewStatusBar(CCmdUI* pCmdUI) 
{
	CControlBar* pBar = GetControlBar(AFX_IDW_STATUS_BAR);
	if (pBar != NULL)
	{
		if(pBar->GetStyle() & WS_VISIBLE)
			pCmdUI->SetCheck(1);
		else
			pCmdUI->SetCheck(0);
	}
}

void CMainFrame::OnUpdateViewToolbar(CCmdUI* pCmdUI) 
{
	CControlBar* pBar = GetControlBar(AFX_IDW_REBAR);
	if (pBar != NULL)
	{
		if(pBar->GetStyle() & WS_VISIBLE)
			pCmdUI->SetCheck(1);
		else
			pCmdUI->SetCheck(0);
	}
}
void CMainFrame::OnViewFullscreen() 
{
	if(IsFullScreenMode()) 
	{
		//退出全屏模式;
		RestoreToNormal();
	}
	else //进入全屏模式;
	{
		//处理工具栏和状态栏的显示或隐藏;
		m_bHadToolBar = m_wndReBar.IsWindowVisible();
		m_bHadStatusBar = m_wndStatusBar.IsWindowVisible();
		ShowControlBar(&m_wndReBar, FALSE||m_bShowToolBarInFullScreenMode, FALSE);
		ShowControlBar(&m_wndStatusBar,FALSE||m_bShowStatusBarInFullScreenMode, FALSE);

		//重新取得各子框架的WindowPlacement;
		HWND hWnd;
		WINDOWPLACEMENT * pWndpl;
		POSITION pos=m_mapHWndToWndpl.GetStartPosition();
		while(pos)
		{
			m_mapHWndToWndpl.GetNextAssoc(pos,hWnd,pWndpl);
			::GetWindowPlacement(hWnd,pWndpl);
		}
		
		//扩大到全屏幕;
		ExpandToFullScreen();
	}
}

void CMainFrame::OnViewStatusBar() 
{
	CControlBar* pBar = GetControlBar(AFX_IDW_STATUS_BAR);
	if (pBar != NULL)
	{
		ShowControlBar(pBar, (pBar->GetStyle() & WS_VISIBLE) == 0, FALSE);
		//如果用户在全屏状态下选择显示了状态栏,则下次进入全屏状态时就不隐藏它;
		if (IsFullScreenMode())
		{
			if ( pBar->GetStyle() & WS_VISIBLE)
				m_bShowStatusBarInFullScreenMode=TRUE;
			else
				m_bShowStatusBarInFullScreenMode=FALSE;
		}
	}
}

void CMainFrame::OnViewToggleFullscreen() 
{
	//功能同OnViewFullscreen(),所以直接调用;这是一个单态的命令按钮,不保持被按下的状态;
	OnViewFullscreen();
}

void CMainFrame::OnViewToolbar() 
{
	CControlBar* pBar = GetControlBar(AFX_IDW_REBAR);
	if (pBar != NULL)
	{
		ShowControlBar(pBar, (pBar->GetStyle() & WS_VISIBLE) == 0, FALSE);
		//如果用户在全屏状态下选择显示了工具栏,则下次进入全屏状态时就不隐藏它;
		if (IsFullScreenMode())
		{
			if ( pBar->GetStyle() & WS_VISIBLE)
				m_bShowToolBarInFullScreenMode=TRUE;
			else
				m_bShowToolBarInFullScreenMode=FALSE;
		}
	}
}

BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) 
{
	if (pMsg->message==WM_KEYDOWN && IsFullScreenMode() && pMsg->wParam==VK_ESCAPE)
	{
		RestoreToNormal();
		return TRUE;
	}
	else
		return CMDIFrameWnd::PreTranslateMessage(pMsg);
}

BOOL CMainFrame::RestoreToNormal()
{
	//设置全屏标志
	m_bIsFullScreenMode=FALSE;
	//设置需要计算的标志;
	m_bNeedToCalcWndplChild=TRUE;

	//取消禁止“大小”和“最大化”系统菜单;
	ModifyStyle(0,WS_THICKFRAME|WS_MAXIMIZEBOX,0);
	//得到系统菜单的指针;
	CMenu * pMenu=GetSystemMenu(FALSE);
	//复原“移动”菜单;
	pMenu->ModifyMenu(ID_GRAYEDMOVE,MF_BYCOMMAND|MF_STRING,SC_MOVE,"移动(&M)");

	//锁住窗口不使之更新;
	LockWindowUpdate();
	
	//处理工具栏和状态栏的显示或隐藏;
	ShowControlBar(&m_wndReBar, m_bHadToolBar, FALSE);
	ShowControlBar(&m_wndStatusBar, m_bHadStatusBar, FALSE);
	ShowControlBar(&m_tbFullScreen,FALSE,TRUE);

	//判断子窗口是否为最大化的;
	BOOL bChildMaximized=FALSE;
	CMDIChildWnd * pChildFrame=MDIGetActive();
	if (pChildFrame && pChildFrame->GetStyle() & WS_MAXIMIZE)
	{
		bChildMaximized=TRUE;
	}

	//恢复所有窗口到普通状态;
	HWND hWnd;
	WINDOWPLACEMENT * pWndpl;
	POSITION pos=m_mapHWndToWndpl.GetStartPosition();
	while(pos)
	{
		m_mapHWndToWndpl.GetNextAssoc(pos,hWnd,pWndpl);
		//设置所有的窗口的WindowPlacement为原先的值;
		::SetWindowPlacement(hWnd,pWndpl);

		TRACE1("flags %d\n",pWndpl->flags);
		TRACE1("showCmd %d\n",pWndpl->showCmd);
		TRACE1("ptMinPosition.x %d\n",pWndpl->ptMinPosition.x);
		TRACE1("ptMinPosition.y %d\n",pWndpl->ptMinPosition.y);
		TRACE1("ptMaxPosition.x %d\n",pWndpl->ptMaxPosition.x);
		TRACE1("ptMaxPosition.y %d\n",pWndpl->ptMaxPosition.y);
		TRACE1("rcNormalPosition.left %d\n",pWndpl->rcNormalPosition.left);
		TRACE1("rcNormalPosition.top %d\n",pWndpl->rcNormalPosition.top);
		TRACE1("rcNormalPosition.right %d\n",pWndpl->rcNormalPosition.right);
		TRACE1("rcNormalPosition.bottom %d\n\n",pWndpl->rcNormalPosition.bottom);

	}

	//使窗口可更新;
	UnlockWindowUpdate();
	return TRUE;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -