DragonNest/Third/XTToolkitPro/Samples/Controls/MDITabWindows/MainFrm.cpp
2024-12-19 09:48:26 +08:00

453 lines
10 KiB
C++

// MainFrm.cpp : implementation of the CMainFrame class
//
// This file is a part of the XTREME TOOLKIT MFC class library.
// (c)1998-2008 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO
// BE RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED
// WRITTEN CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS
// OUTLINED IN THE XTREME TOOLKIT LICENSE AGREEMENT. CODEJOCK SOFTWARE
// GRANTS TO YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE
// THIS SOFTWARE ON A SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MDITabWindows.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(IDC_ACTIVATE, OnActivate)
ON_COMMAND(IDC_CLOSEDOCUMENT, OnClosedocument)
ON_COMMAND(IDC_HIDETABS, OnHidetabs)
ON_COMMAND(IDC_ALIGNTABLEFT, OnAligntableft)
ON_COMMAND(IDC_ALIGNTABTOP, OnAligntabtop)
ON_COMMAND(IDC_ALIGNTABRIGHT, OnAligntabright)
ON_COMMAND(IDC_ALIGNTABBOTTOM, OnAligntabbottom)
ON_UPDATE_COMMAND_UI(IDC_ALIGNTABLEFT, OnUpdateAligntableft)
ON_UPDATE_COMMAND_UI(IDC_ALIGNTABTOP, OnUpdateAligntabtop)
ON_UPDATE_COMMAND_UI(IDC_ALIGNTABRIGHT, OnUpdateAligntabright)
ON_UPDATE_COMMAND_UI(IDC_ALIGNTABBOTTOM, OnUpdateAligntabbottom)
ON_COMMAND(ID_SHOW_MDITABS, OnShowMditabs)
ON_UPDATE_COMMAND_UI(ID_SHOW_MDITABS, OnUpdateShowMditabs)
ON_COMMAND(ID_VIEW_THEME_OFFICEXP, OnViewThemeOfficeXP)
ON_UPDATE_COMMAND_UI(ID_VIEW_THEME_OFFICEXP, OnUpdateViewThemeOfficeXP)
ON_UPDATE_COMMAND_UI(ID_WINDOW_CASCADE, OnUpdateWindowCascade)
ON_UPDATE_COMMAND_UI(ID_WINDOW_TILE_HORZ, OnUpdateWindowTileHorz)
ON_UPDATE_COMMAND_UI(ID_WINDOW_ARRANGE, OnUpdateWindowArrange)
//}}AFX_MSG_MAP
ON_WM_CLOSE()
ON_COMMAND(XTP_ID_CUSTOMIZE, OnCustomize)
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
static UINT toolbars[] =
{
IDR_MAINFRAME,
IDR_TAB_POPUP,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
m_bMDIActive = TRUE;
m_bAlignment[0] = FALSE; // left
m_bAlignment[1] = TRUE; // top
m_bAlignment[2] = FALSE; // right
m_bAlignment[3] = FALSE; // bottom
// initialize themes.
m_iTheme = m_regMgr.GetProfileInt(
_T("Settings"), _T("Theme"), xtThemeOfficeXP);
}
CMainFrame::~CMainFrame()
{
m_regMgr.WriteProfileInt(
_T("Settings"), _T("Theme"), m_iTheme);
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMainFrameBase::OnCreate(lpCreateStruct) == -1)
return -1;
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
}
if (!InitCommandBars())
return -1;
CXTPCommandBars* pCommandBars = GetCommandBars();
if(pCommandBars == NULL)
{
TRACE0("Failed to create command bars object.\n");
return -1; // fail to create
}
pCommandBars->SetMenu(_T("Menu Bar"), IDR_MAINFRAME);
CXTPToolBar* pCommandBar = (CXTPToolBar*)pCommandBars->Add(_T("Standard"), xtpBarTop);
if (!pCommandBar ||
!pCommandBar->LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1;
}
// Load the previous state for command bars.
LoadCommandBars(_T("CommandBars"));
SetTheme(m_iTheme);
// Install the MDI tab window and set the popup menu id.
m_wndMDITabWindow.Install(this, NULL, (m_iTheme == xtThemeOfficeXP));
// Set the menu id for the tab control, make IDC_ACTIVATE the
// default menu item.
m_wndMDITabWindow.SetMenuID(IDR_TAB_POPUP, 0, IDC_ACTIVATE);
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CMainFrameBase::PreCreateWindow(cs) )
return FALSE;
cs.lpszClass = _T("XTPMainFrame");
CXTPDrawHelpers::RegisterWndClass(AfxGetInstanceHandle(), cs.lpszClass,
CS_DBLCLKS, AfxGetApp()->LoadIcon(IDR_MAINFRAME));
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CMainFrameBase::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CMainFrameBase::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::ToggleMDITabs()
{
m_bMDIActive = !m_bMDIActive;
if ( m_bMDIActive )
{
SetMDITabStyle();
// make sure the MDI child is maximized.
CFrameWnd* pChild = GetActiveFrame();
if ( pChild && ::IsWindow( pChild->m_hWnd ) )
{
DWORD dwStyle = ::GetWindowLong( pChild->m_hWnd, GWL_STYLE );
if ( ( dwStyle & WS_MAXIMIZE ) != WS_MAXIMIZE )
{
pChild->ShowWindow( SW_MAXIMIZE );
}
}
}
else
{
m_wndMDITabWindow.UnInstall( );
}
}
void CMainFrame::HideMDITabs()
{
// TODO: Add your command handler code here
m_wndMDITabWindow.UnInstall();
m_bMDIActive = FALSE;
}
void CMainFrame::SetMDITabStyle()
{
DWORD dwStyle = TCS_HOTTRACK;
// left align
if (m_bAlignment[0]) {
dwStyle |= TCS_VERTICAL;
}
// right align
else if (m_bAlignment[2]) {
dwStyle |= TCS_VERTICAL|TCS_RIGHT;
}
// bottom align
else if (m_bAlignment[3]) {
dwStyle |= TCS_BOTTOM;
}
// Update the tab control.
m_wndMDITabWindow.UnInstall( );
m_wndMDITabWindow.Install(this, dwStyle, FALSE);
// TODO: Uncomment this line if you want to change the border size between
// the client and tab control.
// m_wndMDITabWindow.SetBorderGap(10);
}
void CMainFrame::OnShowMditabs()
{
ToggleMDITabs();
}
void CMainFrame::OnUpdateShowMditabs(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_bMDIActive);
}
void CMainFrame::OnActivate()
{
// TODO: Add your command handler code here
CMDIChildWnd* pChildFrame = (CMDIChildWnd *)m_wndMDITabWindow.GetFrameWnd();
ASSERT_VALID(pChildFrame);
MDIActivate(pChildFrame);
}
void CMainFrame::OnClosedocument()
{
// TODO: Add your command handler code here
CMDIChildWnd* pChildFrame = (CMDIChildWnd *)m_wndMDITabWindow.GetFrameWnd();
ASSERT_VALID(pChildFrame);
pChildFrame->SendMessage(WM_CLOSE);
}
void CMainFrame::OnHidetabs()
{
HideMDITabs();
}
void CMainFrame::SetAlignment(ALIGNMENT eAlign)
{
if (!m_bAlignment[eAlign])
{
int i;
for (i = 0; i < _countof(m_bAlignment); ++i)
m_bAlignment[i] = FALSE;
m_bAlignment[eAlign] = TRUE;
m_wndMDITabWindow.UnInstall();
SetMDITabStyle();
}
}
void CMainFrame::OnAligntableft()
{
SetAlignment(left);
}
void CMainFrame::OnUpdateAligntableft(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(m_bAlignment[left]);
}
void CMainFrame::OnAligntabtop()
{
SetAlignment(top);
}
void CMainFrame::OnUpdateAligntabtop(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(m_bAlignment[top]);
}
void CMainFrame::OnAligntabright()
{
SetAlignment(right);
}
void CMainFrame::OnUpdateAligntabright(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(m_bAlignment[right]);
}
void CMainFrame::OnAligntabbottom()
{
SetAlignment(bottom);
}
void CMainFrame::OnUpdateAligntabbottom(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(m_bAlignment[bottom]);
}
void CMainFrame::SetTheme(int iTheme)
{
m_iTheme = iTheme;
XTThemeManager()->SetTheme((XTThemeStyle)m_iTheme);
XTPPaintManager()->SetTheme((XTPPaintTheme)m_iTheme);
if ( ::IsWindow( m_wndMDITabWindow.m_hWnd ) )
{
if (m_iTheme == xtThemeOfficeXP)
{
m_wndMDITabWindow.SetBorderGap( 1 );
}
else
{
m_wndMDITabWindow.SetBorderGap( 5 );
}
}
CRect r;
GetWindowRect(&r);
r.InflateRect(0,0,1,0);
SetWindowPos(NULL, 0,0,r.Width(), r.Height(),
SWP_NOMOVE|SWP_FRAMECHANGED);
r.InflateRect(0,0,-1,0);
SetWindowPos(NULL, 0,0,r.Width(), r.Height(),
SWP_NOMOVE|SWP_FRAMECHANGED);
RedrawWindow( NULL, NULL,
RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN );
RecalcLayout();
}
void CMainFrame::OnViewThemeOfficeXP()
{
SetTheme((m_iTheme == xtThemeOfficeXP)? xtThemeDefault: xtThemeOfficeXP);
}
void CMainFrame::OnUpdateViewThemeOfficeXP(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_iTheme == xtThemeOfficeXP);
}
void CMainFrame::OnUpdateWindowCascade(CCmdUI* pCmdUI)
{
pCmdUI->Enable(TRUE);
}
void CMainFrame::OnUpdateWindowTileHorz(CCmdUI* pCmdUI)
{
pCmdUI->Enable(TRUE);
}
void CMainFrame::OnUpdateWindowArrange(CCmdUI* pCmdUI)
{
pCmdUI->Enable(TRUE);
}
BEGIN_MESSAGE_MAP(CMDIWndTab, CXTMDIWndTab)
ON_WM_RBUTTONDOWN()
END_MESSAGE_MAP()
void CMDIWndTab::OnRButtonDown(UINT /*nFlags*/, CPoint point)
{
// Get the tab index based upon the cursor position.
m_iHitTest = TabFromPoint(point);
if (m_iHitTest != -1)
{
if (m_popupMenuID != 0)
{
CPoint pt = point;
ClientToScreen(&pt);
CMenu popupMenu;
VERIFY(popupMenu.LoadMenu(m_popupMenuID));
CMenu* pPopup = popupMenu.GetSubMenu(m_nPos);
ASSERT(pPopup != NULL);
if (m_nDefCmd != 0) {
::SetMenuDefaultItem(pPopup->m_hMenu, m_nDefCmd, FALSE);
}
CWnd* pWndPopupOwner = GetOwner();
ASSERT_VALID(pWndPopupOwner);
CXTPCommandBars::TrackPopupMenu(pPopup, TPM_RIGHTBUTTON,
pt.x, pt.y, AfxGetMainWnd(), 0, 0, ((CXTPMDIFrameWnd*)AfxGetMainWnd())->GetCommandBars());
}
}
}
void CMainFrame::OnCustomize()
{
// Get a pointer to the Command Bar object.
CXTPCommandBars* pCommandBars = GetCommandBars();
if(pCommandBars != NULL)
{
// Instanciate the customize dialog object.
CXTPCustomizeSheet dlg(pCommandBars);
// Add the options page to the customize dialog.
CXTPCustomizeOptionsPage pageOptions(&dlg);
dlg.AddPage(&pageOptions);
// Add the commands page to the customize dialog.
CXTPCustomizeCommandsPage* pCommands = dlg.GetCommandsPage();
pCommands->AddCategories(IDR_MDITABTYPE);
// Use the command bar manager to initialize the
// customize dialog.
pCommands->InsertAllCommandsCategory();
pCommands->InsertBuiltInMenus(IDR_MDITABTYPE);
pCommands->InsertNewMenuCategory();
// Dispaly the dialog.
dlg.DoModal();
}
}
void CMainFrame::OnClose()
{
// Save the current state for toolbars and menus.
SaveCommandBars(_T("CommandBars"));
CMainFrameBase::OnClose();
}