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