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

📄 mainfrm.cpp

📁 全屏显示
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "FullView.h"
#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CLOSE()
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_WM_GETMINMAXINFO()
	ON_WM_SETTINGCHANGE()
	ON_COMMAND(ID_SET_SHOWMENU, OnSetShowmenu)
	ON_COMMAND(ID_SET_SHOWSCROLLBAR, OnSetShowscrollbar)
	ON_COMMAND(ID_VIEW_FULL_SCREEN, OnViewFullscreen)
	ON_COMMAND(ID_VIEW_TOGGLE_FULLSCREEN, OnViewToggleFullscreen)
	ON_COMMAND(ID_VIEW_TOOLBAR, OnViewToolbar)
	ON_COMMAND(ID_VIEW_STATUS_BAR, OnViewStatusBar)
	ON_UPDATE_COMMAND_UI(ID_SET_SHOWMENU, OnUpdateSetShowmenu)
	ON_UPDATE_COMMAND_UI(ID_SET_SHOWSCROLLBAR, OnUpdateSetShowscrollbar)
	ON_UPDATE_COMMAND_UI(ID_VIEW_FULL_SCREEN, OnUpdateViewFullscreen)
	ON_UPDATE_COMMAND_UI(ID_VIEW_STATUS_BAR, OnUpdateViewStatusBar)
	ON_UPDATE_COMMAND_UI(ID_VIEW_TOOLBAR, OnUpdateViewToolbar)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_DISPLAYCHANGE, OnDisplayChange)
	ON_WM_SYSCOMMAND()
END_MESSAGE_MAP()

static UINT indicators[] = {ID_SEPARATOR,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL};

BOOL CMainFrame::CalcFullScreenWndplChild()
{
	//得到活动的子窗口的指针;
	CMDIChildWnd * pChildFrame=MDIGetActive();
	if (!pChildFrame)
		return FALSE;
	else
	{
		CRect rectPotential;
		rectPotential.left=rectPotential.top=0;
		rectPotential.right = ::GetSystemMetrics(SM_CXSCREEN);
		rectPotential.bottom = ::GetSystemMetrics(SM_CYSCREEN);

		m_wndplFullScreenChild= *(m_mapHWndToWndpl[GetSafeHwnd()]);
		m_wndplFullScreenChild.showCmd = SW_SHOWMAXIMIZED;
		m_wndplFullScreenChild.rcNormalPosition = rectPotential;
		::AdjustWindowRect(&(m_wndplFullScreenChild.rcNormalPosition), pChildFrame->GetStyle(), FALSE);
		m_wndplFullScreenChild.ptMaxPosition.x=m_wndplFullScreenChild.rcNormalPosition.left;
		m_wndplFullScreenChild.ptMaxPosition.y=m_wndplFullScreenChild.rcNormalPosition.top;
		

		m_bNeedToCalcWndplChild=FALSE;
	}
	return TRUE;
}

BOOL CMainFrame::CalcFullScreenWndplMain()
{
	RECT rectPotential;
	if (!::SystemParametersInfo(SPI_GETWORKAREA, 0, &rectPotential, 0))
		::GetWindowRect(::GetDesktopWindow(), &rectPotential);
	else
	{
		rectPotential.right = ::GetSystemMetrics(SM_CXSCREEN);
		rectPotential.bottom = ::GetSystemMetrics(SM_CYSCREEN);
		rectPotential.right -= rectPotential.left;
		rectPotential.bottom -= rectPotential.top;
		rectPotential.left = -rectPotential.left;
		rectPotential.top = -rectPotential.top;
	}

	::AdjustWindowRect(&rectPotential, GetStyle(), !m_bShowMenuBarInFullScreenMode);
	rectPotential.bottom += ::GetSystemMetrics(SM_CYBORDER);
	m_wndplFullScreenMain= *(m_mapHWndToWndpl[GetSafeHwnd()]);
	m_wndplFullScreenMain.showCmd =  SW_SHOWNORMAL;
	m_wndplFullScreenMain.rcNormalPosition = rectPotential;
	m_wndplFullScreenMain.ptMaxPosition.x=m_wndplFullScreenMain.rcNormalPosition.left;
	m_wndplFullScreenMain.ptMaxPosition.y=m_wndplFullScreenMain.rcNormalPosition.top;

	return TRUE;
}

CMainFrame::CMainFrame()
{
	m_bIsFullScreenMode=FALSE;
	m_bNeedToCalcWndplChild=TRUE;//需要计算;
	m_bShowStatusBarInFullScreenMode=FALSE;//显示状态栏?
	m_bShowMenuBarInFullScreenMode=	AfxGetApp()->GetProfileInt("WindowStatus","ShowMenuBar",FALSE);//全屏时是否显示菜单栏;
	m_bShowStatusBarInFullScreenMode=AfxGetApp()->GetProfileInt("WindowStatus","ShowStatusBar",FALSE);//全屏时是否显示状态栏;
	m_bShowToolBarInFullScreenMode=AfxGetApp()->GetProfileInt("WindowStatus","ShowToolBar",FALSE); //全屏状态下显示工具栏?
	m_bShowScrollBar=AfxGetApp()->GetProfileInt("WindowStatus","ShowScrollBar",TRUE); //显示滚动条?

	//得到新的屏幕大小;
	WORD cxScreen = ::GetSystemMetrics(SM_CXSCREEN);//LOWORD
	WORD cyScreen = ::GetSystemMetrics(SM_CYSCREEN);//HIWORD
	m_dwOldScreenSize=MAKELPARAM(cxScreen,cyScreen);
}

CMainFrame::~CMainFrame()
{
}

BOOL CMainFrame::ExpandToFullScreen()
{
	//设置全屏标志;
	m_bIsFullScreenMode=TRUE;

	//计算大小;
	CalcFullScreenWndplMain();
	m_bNeedToCalcWndplChild=!CalcFullScreenWndplChild();

	//禁止“大小”和“最大化”系统菜单;
	ModifyStyle(WS_THICKFRAME|WS_MAXIMIZEBOX,0,0);
	//得到系统菜单的指针;
	CMenu * pMenu=GetSystemMenu(FALSE);
	//要加入的命令ID必需在系统命令范围之内;
	ASSERT((ID_GRAYEDMOVE & 0xFFF0) == ID_GRAYEDMOVE);
	ASSERT(ID_GRAYEDMOVE < 0xF000);
	//使“移动”菜单被禁用(替换掉原有的);
	CString strMove;
	pMenu->GetMenuString(SC_MOVE,strMove,MF_BYCOMMAND);
	pMenu->ModifyMenu(SC_MOVE,MF_BYCOMMAND|MF_STRING,ID_GRAYEDMOVE,strMove);
	pMenu->EnableMenuItem(ID_GRAYEDMOVE,MF_BYCOMMAND|MF_GRAYED);

	//锁住窗口不使之更新;
	LockWindowUpdate();

	//默认在有菜单时不显示全屏工具栏;
	ShowControlBar(&m_tbFullScreen,!m_bShowMenuBarInFullScreenMode,TRUE);//用TRUE重画效果较好;

	//设置全屏大小的WindowPlacement;
	SetWindowPlacement(&m_wndplFullScreenMain);

	UnlockWindowUpdate();

	return TRUE;
}

RECT CMainFrame::GetDesktopRect()
{
	RECT rectDesktop;
	if (!::SystemParametersInfo(SPI_GETWORKAREA, 0, &rectDesktop, 0))
		::GetWindowRect(::GetDesktopWindow(), &rectDesktop);
	else
	{
		rectDesktop.right = ::GetSystemMetrics(SM_CXSCREEN);
		rectDesktop.bottom = ::GetSystemMetrics(SM_CYSCREEN);
		rectDesktop.right -= rectDesktop.left;
		rectDesktop.bottom -= rectDesktop.top;
		rectDesktop.left = -rectDesktop.left;
		rectDesktop.top = -rectDesktop.top;
	}
	return rectDesktop;
}

BOOL CMainFrame::GetFullScreenChildsMMI(MINMAXINFO *lpMMI)
{
	if (!IsFullScreenMode())
		return FALSE;
	else
	{
		POINT pt;
		pt.x=m_wndplFullScreenChild.rcNormalPosition.right-m_wndplFullScreenChild.rcNormalPosition.left;
		pt.y=m_wndplFullScreenChild.rcNormalPosition.bottom-m_wndplFullScreenChild.rcNormalPosition.top;
		lpMMI->ptMaxSize = pt;
		lpMMI->ptMaxTrackSize = pt;
		lpMMI->ptMaxPosition = m_wndplFullScreenChild.ptMaxPosition;

		return TRUE;
	}
}

void CMainFrame::OnClose() 
{
    //将窗口的大小和位置写入注册表;
	WINDOWPLACEMENT wndpl;
	if (IsFullScreenMode())
		wndpl=*m_mapHWndToWndpl[GetSafeHwnd()];
	else
		GetWindowPlacement(&wndpl);

	AfxGetApp()->WriteProfileInt("WindowPos","VertPos",wndpl.rcNormalPosition.top);
	AfxGetApp()->WriteProfileInt("WindowPos","HorizPos",wndpl.rcNormalPosition.left);
	AfxGetApp()->WriteProfileInt("WindowPos","Height",wndpl.rcNormalPosition.bottom - wndpl.rcNormalPosition.top);
	AfxGetApp()->WriteProfileInt("WindowPos","Width",wndpl.rcNormalPosition.right - wndpl.rcNormalPosition.left);

	AfxGetApp()->WriteProfileInt("WindowStatus","IsFullScreen",IsFullScreenMode());
	AfxGetApp()->WriteProfileInt("WindowStatus","ShowMenuBar",m_bShowMenuBarInFullScreenMode);
	AfxGetApp()->WriteProfileInt("WindowStatus","ShowStatusBar",m_bShowStatusBarInFullScreenMode);
	AfxGetApp()->WriteProfileInt("WindowStatus","ShowToolBar",m_bShowToolBarInFullScreenMode);
	AfxGetApp()->WriteProfileInt("WindowStatus","ShowScrollBar",m_bShowScrollBar);
	CMDIFrameWnd::OnClose();
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	//若使用VC5,则可将CreateEX改为Create
	//并将有关ReBar工具栏的语句删掉或修改即可
	if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this) ||	!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("工具栏创建失败\n");
		return -1;
	}
	m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle()|CBRS_TOOLTIPS | CBRS_FLYBY);

	if (!m_wndDlgBar.Create(this, IDR_MAINFRAME, CBRS_ALIGN_TOP, AFX_IDW_DIALOGBAR))
	{
		TRACE0("对话栏创建失败\n");
		return -1;
	}

	if (!m_wndReBar.Create(this) ||	!m_wndReBar.AddBar(&m_wndToolBar) ||!m_wndReBar.AddBar(&m_wndDlgBar))
	{
		TRACE0("ReBar创建失败\n");
		return -1;
	}

	if (!m_wndStatusBar.Create(this) ||	!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("状态栏创建失败\n");
		return -1;
	}

	if (!m_tbFullScreen.CreateEx(this,TBSTYLE_FLAT, WS_CHILD | CBRS_ALIGN_TOP, CRect(0,0,0,0), IDR_FULLSCREEN) ||
		!m_tbFullScreen.LoadToolBar(IDR_FULLSCREEN))
	{
		TRACE0("全屏工具栏创建失败\n");
		return -1;
	}

	m_tbFullScreen.SetBarStyle(m_tbFullScreen.GetBarStyle()|CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);

	//写工具栏的名称;
	m_tbFullScreen.SetWindowText("全屏幕");

	//示例中不允许停靠;
	EnableDocking(CBRS_ALIGN_ANY);
	m_tbFullScreen.EnableDocking(0);

	//示例中任选位置显示,实际应用时应当
	//随其它工具栏的状态一起存入注册表;
	FloatControlBar(&m_tbFullScreen,CPoint(9,14));
		
	//取得主框架的WindowPlacement;
	WINDOWPLACEMENT * pWndpl=new WINDOWPLACEMENT;
	GetWindowPlacement(pWndpl);
	m_mapHWndToWndpl[GetSafeHwnd()]=pWndpl;

	//恢复上次的窗口状态;
    int y=AfxGetApp()->GetProfileInt("WindowPos","VertPos",lpCreateStruct->y);
    int x=AfxGetApp()->GetProfileInt("WindowPos","HorizPos",lpCreateStruct->x);
    int cy=AfxGetApp()->GetProfileInt("WindowPos","Height",pWndpl->rcNormalPosition.bottom-pWndpl->rcNormalPosition.top);
    int cx=AfxGetApp()->GetProfileInt("WindowPos","Width",pWndpl->rcNormalPosition.right-pWndpl->rcNormalPosition.left);
	SetWindowPos(NULL,x,y,cx,cy,SWP_NOZORDER);

	m_bIsFullScreenModeWhenLastShutDown=AfxGetApp()->GetProfileInt("WindowStatus","IsFullScreen",FALSE);
	if (m_bIsFullScreenModeWhenLastShutDown)//如果上次关闭程序时是全屏状态;
		OnViewFullscreen();

	return 0;
}

void CMainFrame::OnDestroy() 
{
	//删除在CMap中的映射;
	WINDOWPLACEMENT * pWndpl=m_mapHWndToWndpl[GetSafeHwnd()];
	delete pWndpl;
	m_mapHWndToWndpl.RemoveKey(GetSafeHwnd());

	CMDIFrameWnd::OnDestroy();
}

LRESULT CMainFrame::OnDisplayChange(WPARAM wParam, LPARAM lParam)

⌨️ 快捷键说明

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