www.pudn.com > ViewModeSource.rar > MainFrm.cpp


////////////////////////////////////////////////////////////////////////////// 
//类名:CMainFrame 
//功能:主框架操作类 
//作者:徐景周(jingzhou_xu@163.net) 
//组织:未来工作室(Future Studio) 
//日期:2002.8.1 
///////////////////////////////////////////////////////////////////////////// 
#include "stdafx.h" 
#include "ViewMode.h" 
 
#include "MainFrm.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
static HMENU hMenu = NULL;  //设置静态菜单句柄 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame 
 
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) 
 
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) 
	//{{AFX_MSG_MAP(CMainFrame) 
	ON_WM_CREATE() 
	ON_COMMAND(ID_VIEW_NORMAL, OnViewNormal) 
	ON_COMMAND(ID_VIEW_SIMPLE, OnViewSimple) 
	ON_COMMAND(ID_VIEW_COMPACT, OnViewCompact) 
	ON_UPDATE_COMMAND_UI(ID_VIEW_COMPACT, OnUpdateViewCompact) 
	ON_UPDATE_COMMAND_UI(ID_VIEW_NORMAL, OnUpdateViewNormal) 
	ON_UPDATE_COMMAND_UI(ID_VIEW_SIMPLE, OnUpdateViewSimple) 
	ON_COMMAND(ID_EXIT, OnExit) 
	ON_WM_INITMENUPOPUP() 
	ON_WM_MEASUREITEM() 
	ON_WM_MENUCHAR() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
static UINT indicators[] = 
{ 
	ID_SEPARATOR,           // status line indicator 
	ID_INDICATOR_CAPS, 
	ID_INDICATOR_NUM, 
	ID_INDICATOR_SCRL, 
}; 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame construction/destruction 
 
CMainFrame::CMainFrame() 
{ 
	// TODO: add member initialization code here 
	 
} 
 
CMainFrame::~CMainFrame() 
{ 
} 
 
// --------------------------------------------------------------------------- 
// 名称:  OnCreate 
// 功能:  创建窗体 
// 作者:  徐景周(jingzhou xu) 
// 组织:  未来工作室(Future Studio) 
// --------------------------------------------------------------------------- 
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
	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("Failed to create toolbar\n"); 
		return -1;      // fail to create 
	} 
 
	if (!m_wndStatusBar.Create(this) || 
		!m_wndStatusBar.SetIndicators(indicators, 
		  sizeof(indicators)/sizeof(UINT))) 
	{ 
		TRACE0("Failed to create status bar\n"); 
		return -1;      // fail to create 
	} 
 
	//----------------------------------------------------------------------------- 
	//设置工具条显示风格为图标加下方文本方式 
	CString strButton; 
	CRect rectButton; 
	for(int i = 0; i < m_wndToolBar.GetCount(); i++)		//为每个按钮增加文本 
	{ 
		UINT id = m_wndToolBar.GetItemID(i); 
		if(!strButton.LoadString(id)) continue; 
		int j = strButton.Find(_T('\n')); 
		if(j < 0) continue; 
		strButton = strButton.Right(strButton.GetLength() - j - 1); 
		m_wndToolBar.SetButtonText(i,strButton);  
	} 
	m_wndToolBar.GetItemRect(0,&rectButton);				//调整新的工具条大小 
	m_wndToolBar.SetSizes(rectButton.Size(),CSize(16,15)); 
	//----------------------------------------------------------------------------- 
 
 
	// TODO: Delete these three lines if you don't want the toolbar to 
	//  be dockable 
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 
	EnableDocking(CBRS_ALIGN_ANY); 
	DockControlBar(&m_wndToolBar); 
 
	//显示模式默认显示为正常 
	m_nViewType = 0; 
 
	//获取窗体、客户区及工具条大小 
	GetWindowRect( &m_WindowRect); 
	GetClientRect( &m_ClientRect); 
 
	//初始化置菜单为XP风格显示,jingzhou xu 
	BCMenu::SetMenuDrawMode(BCMENU_DRAWMODE_XP); 
	m_menu.LoadMenu(IDR_MAINFRAME); 
	static UINT uToolBars[] = { IDR_MAINFRAME,  
		                      }; 
	m_menu.LoadToolbars( uToolBars, sizeof(uToolBars)/sizeof(UINT) ); 
	OnUpdateFrameMenu(m_menu.m_hMenu ); 
 
	return 0; 
} 
 
// --------------------------------------------------------- 
//	名称: OnInitMenuPopup 
//	功能: 加此涵数,使动态新增菜单条同步以XP风格显示 
//	变量: pPopupMenu -- 弹出菜单,nIndex -- 索引,bSysMenu -- 是否系统菜单 
//	返回: 无 
//	编写: 徐景周,2002.4.8 
//  组织:未来工作室(Future Studio) 
// --------------------------------------------------------- 
void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)  
{ 
	CFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); 
	 
	if(!bSysMenu){ 
		if(BCMenu::IsMenu(pPopupMenu)) BCMenu::UpdateMenu(pPopupMenu); 
	}	 
} 
 
// --------------------------------------------------------- 
//	名称: OnInitMenuPopup 
//	功能: 重新测量以XP风格菜单条 
//	返回: 无 
//	编写: 徐景周,2002.4.8 
//  组织:未来工作室(Future Studio) 
// --------------------------------------------------------- 
void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)  
{ 
	BOOL setflag=FALSE; 
	if(lpMeasureItemStruct->CtlType==ODT_MENU){ 
		if(IsMenu((HMENU)lpMeasureItemStruct->itemID)&&BCMenu::IsMenu((HMENU)lpMeasureItemStruct->itemID)){ 
			m_menu.MeasureItem(lpMeasureItemStruct); 
			setflag=TRUE; 
		} 
	} 
	if(!setflag)CWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);	 
} 
 
// --------------------------------------------------------- 
//	名称: OnMenuChar 
//	功能: 重新绘制以XP风格菜单条 
//	返回: 无 
//	编写: 徐景周,2002.4.8 
//  组织:未来工作室(Future Studio) 
// --------------------------------------------------------- 
LRESULT CMainFrame::OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu)  
{ 
	LRESULT lresult; 
	if(BCMenu::IsMenu(pMenu)) 
		lresult=BCMenu::FindKeyboardShortcut(nChar, nFlags, pMenu); 
	else 
		lresult=CWnd::OnMenuChar(nChar, nFlags, pMenu); 
 
	return(lresult); 
	 
} 
 
// --------------------------------------------------------------------------- 
// 名称:  PreCreateWindow 
// 功能:  设置窗体显示风格 
// 作者:  徐景周(jingzhou xu) 
// 组织:  未来工作室(Future Studio) 
// --------------------------------------------------------------------------- 
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	if( !CFrameWnd::PreCreateWindow(cs) ) 
		return FALSE; 
 
	//自定义窗体显示位置 
	cs.x = 100;	 
	cs.y = 100; 
 
	//自定义窗体显示风格 
	cs.style &= ~FWS_ADDTOTITLE; 
	cs.style &= ~WS_THICKFRAME;  
	cs.style &= ~WS_MAXIMIZEBOX; 
 
	return TRUE; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame diagnostics 
 
#ifdef _DEBUG 
void CMainFrame::AssertValid() const 
{ 
	CFrameWnd::AssertValid(); 
} 
 
void CMainFrame::Dump(CDumpContext& dc) const 
{ 
	CFrameWnd::Dump(dc); 
} 
 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame message handlers 
 
// --------------------------------------------------------------------------- 
// 名称:  ViewMode 
// 功能:  多种显示模式[其中当 =0:正常模式,=1:简洁模式(无视图),=2:精简模式(只有工具条)] 
// 作者:  徐景周(jingzhou xu) 
// 组织:  未来工作室(Future Studio) 
// --------------------------------------------------------------------------- 
void CMainFrame::ViewMode(int nViewType) 
{ 
	CRect ClientRect; 
	CRect WindowRect; 
	CRect ToolbarRect; 
	CRect StatusbarRect; 
 
	//获取窗体、客户区及工具条大小 
	WindowRect = m_WindowRect; 
	ClientRect = m_ClientRect; 
	m_wndToolBar.GetWindowRect(&ToolbarRect); 
 
	//获取边框及标题栏大小 
	int borderHeight = GetSystemMetrics(SM_CYBORDER); 
	int captionHeight = GetSystemMetrics(SM_CYCAPTION); 
 
	//获取状态条大小 
	CStatusBar* pStatus = (CStatusBar*) AfxGetApp()->m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR);	 
	pStatus->GetWindowRect(&StatusbarRect); 
 
	//停靠工具条 
	DockControlBar(&m_wndToolBar);	 
 
	int CompactCx;							//新窗体宽 
	int CompactCy;							//新窗体高 
 
	//以多种模式显示 
	switch(nViewType) 
	{ 
	case 0:                                 //正常显示模式 
		{ 
			//显示菜单 
			if ( hMenu != NULL )	 
				::SetMenu( m_hWnd, hMenu ); 
			 
			//显示状态条 
			pStatus->ShowWindow(SW_SHOW); 
 
			//新窗体宽、高 
			CompactCx=WindowRect.Width(); 
			CompactCy=WindowRect.Height(); 
		} 
		break; 
	case 1:									//简洁显示模式 
		{ 
			//显示菜单 
			if ( hMenu != NULL )	 
				::SetMenu( m_hWnd, hMenu ); 
			 
			//隐藏状态条 
			pStatus->ShowWindow(SW_HIDE); 
			 
			//新窗体宽、高 
			CompactCx=WindowRect.Width(); 
			CompactCy=WindowRect.Height() - ClientRect.Height() + ToolbarRect.Height() - borderHeight; 
		} 
		break; 
	case 2:									//精简显示模式 
		{ 
			//隐藏菜单 
			hMenu = ::GetMenu(m_hWnd);	 
				::SetMenu( m_hWnd, NULL ); 
			 
			//隐藏状态条 
			pStatus->ShowWindow(SW_HIDE); 
			 
			//新窗体宽、高 
			CompactCx=WindowRect.Width(); 
			CompactCy=captionHeight + ToolbarRect.Height() + borderHeight*2; 
		} 
		break; 
	} 
 
	//设置新窗体显示 
	SetWindowPos( &wndTop, WindowRect.left, WindowRect.top, CompactCx, CompactCy, SWP_SHOWWINDOW);   
 
} 
 
// --------------------------------------------------------------------------- 
// 名称:  OnViewNormal 
// 功能:  正常显示模式 
// 作者:  徐景周(jingzhou xu) 
// 组织:  未来工作室(Future Studio) 
// --------------------------------------------------------------------------- 
void CMainFrame::OnViewNormal()  
{ 
	ViewMode(0); 
	m_nViewType = 0; 
} 
 
// --------------------------------------------------------------------------- 
// 名称:  OnViewSimple 
// 功能:  简洁显示模式(无视图) 
// 作者:  徐景周(jingzhou xu) 
// 组织:  未来工作室(Future Studio) 
// --------------------------------------------------------------------------- 
void CMainFrame::OnViewSimple()  
{ 
	ViewMode(1); 
	m_nViewType = 1; 
} 
 
// --------------------------------------------------------------------------- 
// 名称:  OnViewCompact 
// 功能:  精简显示模式(仅工具条) 
// 作者:  徐景周(jingzhou xu) 
// 组织:  未来工作室(Future Studio) 
// --------------------------------------------------------------------------- 
void CMainFrame::OnViewCompact()  
{ 
	ViewMode(2); 
	m_nViewType = 2; 
} 
 
// --------------------------------------------------------------------------- 
// 名称:  OnUpdateViewCompact 
// 功能:  更新精简模式状态 
// 作者:  徐景周(jingzhou xu) 
// 组织:  未来工作室(Future Studio) 
// --------------------------------------------------------------------------- 
void CMainFrame::OnUpdateViewCompact(CCmdUI* pCmdUI)  
{ 
	if(m_nViewType == 2) 
		pCmdUI->SetCheck(TRUE); 
	else 
		pCmdUI->SetCheck(FALSE); 
} 
 
// --------------------------------------------------------------------------- 
// 名称: OnUpdateViewNormal 
// 功能:  更新正常模式状态 
// 作者:  徐景周(jingzhou xu) 
// 组织:  未来工作室(Future Studio) 
// --------------------------------------------------------------------------- 
void CMainFrame::OnUpdateViewNormal(CCmdUI* pCmdUI)  
{ 
	if(m_nViewType == 0) 
		pCmdUI->SetCheck(TRUE); 
	else 
		pCmdUI->SetCheck(FALSE); 
} 
 
// --------------------------------------------------------------------------- 
// 名称: OnUpdateViewSimple 
// 功能:  更新简洁模式状态 
// 作者:  徐景周(jingzhou xu) 
// 组织:  未来工作室(Future Studio) 
// --------------------------------------------------------------------------- 
void CMainFrame::OnUpdateViewSimple(CCmdUI* pCmdUI)  
{ 
	if(m_nViewType == 1) 
		pCmdUI->SetCheck(TRUE); 
	else 
		pCmdUI->SetCheck(FALSE); 
} 
 
// --------------------------------------------------------------------------- 
// 名称:  OnExit 
// 功能:  退出程序 
// 作者:  徐景周(jingzhou xu) 
// 组织:  未来工作室(Future Studio) 
// --------------------------------------------------------------------------- 
void CMainFrame::OnExit()  
{ 
	SendMessage(WM_CLOSE,0,0);	 
}