📄 mainfrm.cpp
字号:
#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 + -