DragonNest/Third/XTToolkitPro/Samples/CommandBars/CommonControls/MainFrm.cpp

626 lines
20 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
// MainFrm.cpp : implementation of the CMainFrame class
//
// This file is a part of the XTREME TOOLKIT PRO 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 PRO 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 "CommonControls.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_WM_HSCROLL()
ON_WM_CLOSE()
//}}AFX_MSG_MAP
ON_COMMAND(XTP_ID_CUSTOMIZE, OnCustomize)
ON_XTP_CREATECONTROL()
ON_UPDATE_COMMAND_UI(ID_BUTTON_DOC, OnUpdateButtonDoc)
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()
{
LOGFONT lfIcon;
VERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(lfIcon), &lfIcon, 0));
VERIFY(m_fontIcon.CreateFontIndirect(&lfIcon));
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// Create Status bar.
// Important: All control bars including the Status Bar
// must be created before the CommandBars....
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
}
// Initialize the command bars
if (!InitCommandBars())
return -1;
// Get a pointer to the command bars object.
CXTPCommandBars* pCommandBars = GetCommandBars();
if(pCommandBars == NULL)
{
TRACE0("Failed to create command bars object.\n");
return -1; // fail to create
}
// Add the menu bar
CXTPCommandBar* pMenuBar = pCommandBars->SetMenu(_T("Menu Bar"), IDR_MAINFRAME);
if(pMenuBar == NULL)
{
TRACE0("Failed to create menu bar.\n");
return -1; // fail to create
}
// Create ToolBar
CXTPToolBar* pToolBar = (CXTPToolBar*)pCommandBars->Add(_T("Standard"), xtpBarTop);
if (!pToolBar || !pToolBar->LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1;
}
// Create the AnimationBar
CXTPToolBar* pAnimationBar = (CXTPToolBar*)pCommandBars->Add(_T("Animation Bar"), xtpBarTop);
if (!pAnimationBar || !pAnimationBar->LoadToolBar(IDR_ANIMATIONBAR))
{
TRACE0("Failed to create toolbar\n");
return -1;
}
// Dock the AnimationBar to the right of the standard toolbar
DockRightOf(pAnimationBar, pToolBar);
// Create the SliderBar
CXTPToolBar* pSliderBar = (CXTPToolBar*)pCommandBars->Add(_T("Slider Bar"), xtpBarTop);
if (!pSliderBar || !pSliderBar->LoadToolBar(IDR_SLIDERBAR))
{
TRACE0("Failed to create toolbar\n");
return -1;
}
// Create the OptionsBar
CXTPToolBar* pOptionsBar = (CXTPToolBar*)pCommandBars->Add(_T("Options Bar"), xtpBarTop);
if (!pOptionsBar || !pOptionsBar->LoadToolBar(IDR_OPTIONSBAR))
{
TRACE0("Failed to create toolbar\n");
return -1;
}
// Dock the OptionsBar to the right of the SliderBar
DockRightOf(pOptionsBar, pSliderBar);
// Create the StaticBar
CXTPToolBar* pStaticBar = (CXTPToolBar*)pCommandBars->Add(_T("Static Bar"), xtpBarTop);
if (!pStaticBar || !pStaticBar->LoadToolBar(IDR_STATICBAR))
{
TRACE0("Failed to create toolbar\n");
return -1;
}
// Dock the StaticBar to the right of the OptionsBar
DockRightOf(pStaticBar, pOptionsBar);
// Load the previous state for command bars.
LoadCommandBars(_T("CommandBars"));
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CMDIFrameWnd::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
{
CMDIFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CMDIFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
int CMainFrame::OnCreateControl(LPCREATECONTROLSTRUCT lpCreateControl)
{
// This function is called by the Extreme Tool Kit application framework.
// This function handles the creation of the controls that are placed
// on the CommandBars. The LPCREATECONTROLSTRUCT structure contains information
// about the control to create.
#if _MSC_VER >= 1200 || defined (_XTP_INCLUDE_CONTROLS)
// Create the Calendar control
if (lpCreateControl->nID == IDC_CALENDAR)
{
// Create the calendar control.
// Note: The control does not use the DTS_UPDOWN style.
// DTP controls that do not use the DTS_UPDOWN style display
// an arrow button. If the user clicks this button, a month
// calendar control drops down. The user can select a specific
// date by clicking an area of the calendar.
if (!m_monthCal.Create(WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | DTS_SHORTDATEFORMAT,
CRect(0, 0, 200, 22), this, IDC_CALENDAR))
{
return FALSE;
}
// Use m_monthCal to create a new CXTPControlCustom* control.
CXTPControlCustom* pControlMonthCal = CXTPControlCustom::CreateControlCustom(&m_monthCal);
// Set the xtpFlagManualUpdate flag.
// Without this flag you must call the Enable member of
// CCmdUI in the ON_UPDATE_COMMAND_UI handler.
pControlMonthCal->SetFlags(xtpFlagManualUpdate);
lpCreateControl->pControl = pControlMonthCal;
return TRUE;
}
// Create the Date control
if (lpCreateControl->nID == IDC_DATE)
{
// Create the date control.
// Note: This control is created using the DTS_UPDOWN style.
// The DTS_UPDOWN style creates a control with a spin control
// positioned on the right side of the Date control.
if (!m_date.Create(WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | DTS_UPDOWN,
CRect(0, 0, 100, 22), this, IDC_DATE))
{
return FALSE;
}
// Create a new CXTPControlCustom* control from the m_date control.
CXTPControlCustom* pControlDate = CXTPControlCustom::CreateControlCustom(&m_date);
// Set the xtpFlagManualUpdate flag.
// Without this flag you must call the Enable member
// of CCmdUI in the ON_UPDATE_COMMAND_UI handler.
pControlDate->SetFlags(xtpFlagManualUpdate);
lpCreateControl->pControl = pControlDate;
return TRUE;
}
// Create the Time control
if (lpCreateControl->nID == IDC_TIME)
{
// Create the date control.
// Note: This control is created using the DTS_UPDOWN style.
// The DTS_UPDOWN style creates a control with a spin control
// positioned on the right side of the Time control.
if (!m_time.Create(WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | DTS_UPDOWN,
CRect(0, 0, 90, 22), this, IDC_TIME))
{
return FALSE;
}
// Set the format of the Time control.
m_time.SetFormat(_T("hh':'mm':'ss tt"));
// Create a CXTPControlCustom* from the m_time control.
CXTPControlCustom* pControlTime = CXTPControlCustom::CreateControlCustom(&m_time);
// Set the xtpFlagManualUpdate flag.
// Without this flag you must call the Enable member
// of CCmdUI in the ON_UPDATE_COMMAND_UI handler.
pControlTime->SetFlags(xtpFlagManualUpdate);
lpCreateControl->pControl = pControlTime;
return TRUE;
}
#endif
// Create the Animation control
if (lpCreateControl->nID == IDC_ANIMATION)
{
// Create the Animation control.
if (!m_wndAnimCtrl.Create(WS_TABSTOP | WS_CHILD | WS_VISIBLE | ACS_AUTOPLAY,
CRect(0, 0, 0, 0), this, IDC_ANIMATION))
{
return FALSE;
}
// Open the HeartBeat avi that is associated with the IDR_HEARTBEAT string resource.
m_wndAnimCtrl.Open(IDR_HEARTBEAT);
// Create a CXTPControlCustom* control from the m_wndAnimCtrl control.
CXTPControlCustom* pControlAnimation = CXTPControlCustom::CreateControlCustom(&m_wndAnimCtrl);
// Set the margins of the Animation control.
pControlAnimation->SetBorders(3, 3, 3, 3);
// Set the vertical draw options to xtpVerticalShow.
// This will draw the animation control when the Animation
// toolbar is docked vertically.
pControlAnimation->SetVerticalPositionOption(xtpVerticalShow);
lpCreateControl->pControl = pControlAnimation;
return TRUE;
}
// Create the Slider control
if (lpCreateControl->nID == IDC_SLIDER)
{
// Create the Slider control
if (!m_wndSlider.Create(TBS_HORZ | WS_CHILD | WS_VISIBLE,
CRect(0, 0, 200, 16), this, IDC_SLIDER))
{
return FALSE;
}
// Set the maximum range of the Slider control's scroll bar.
m_wndSlider.SetRangeMax(0xFF);
// Create a CXTPControlCustom* from the m_wndSlider control.
CXTPControlCustom* pControlSlider = CXTPControlCustom::CreateControlCustom(&m_wndSlider);
// Set the margins of the Slider control.
pControlSlider->SetBorders(3, 3, 3, 3);
// Set the vertical draw options to xtpVerticalButton.
// This will show a button in place of the Slider control
// when the Slider control toolbar is docked vertically.
pControlSlider->SetVerticalPositionOption(xtpVerticalButton);
lpCreateControl->pControl = pControlSlider;
return TRUE;
}
// Create the Option radio button
if (lpCreateControl->nID >= IDC_OPTION_HIDE && lpCreateControl->nID <= IDC_OPTION_BUTTON)
{
// Get the ID of the control currently being created
UINT nID = lpCreateControl->nID;
// Determine the index of the control
CButton& wndOption = m_wndOptions[nID - IDC_OPTION_HIDE];
// Create the Options radio button
if (!wndOption.Create(NULL, WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
CRect(0, 0, 100, 20), this, nID))
{
return FALSE;
}
// Use the radio button to create a CXTPControlCustom* control
CXTPControlCustom* pControlOption = CXTPControlCustom::CreateControlCustom(&wndOption);
// Set the ID of the custom control to the ID of the radio button
pControlOption->SetID(nID);
// Set the window text to the string resource associated with the button ID
wndOption.SetWindowText(pControlOption->GetCaption());
// Set the font of the radio button
wndOption.SetFont(&m_fontIcon);
// Check the first radio button on the Options toolbar.
wndOption.SetCheck(nID == IDC_OPTION_HIDE);
// Set the vertical draw option to hide when the Option toolbar is drawn vertically.
pControlOption->SetVerticalPositionOption(xtpVerticalHide);
// Set the xtpFlagManualUpdate flag.
// Without this flag you must call the Enable member of
// CCmdUI in the ON_UPDATE_COMMAND_UI handler.
pControlOption->SetFlags(xtpFlagManualUpdate);
lpCreateControl->pControl = pControlOption;
return TRUE;
}
// Create the Static control
if (lpCreateControl->nID == ID_BUTTON_DOC)
{
CXTPControl* pControlStatic = new CControlStatic();
lpCreateControl->pControl = pControlStatic;
return TRUE;
}
return FALSE;
}
void CMainFrame::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// This member function is called when the Slider control is scrolled.
// Determine if the WM_HSCROLL message is from the Slider control's scroll bar.
if ((CSliderCtrl*)pScrollBar == &m_wndSlider)
{
CMDIChildWnd* pChild = MDIGetActive(); // Get the active child window.
if (pChild)
{
// Send a WM_HSCROLL message to the active child window.
pChild->GetActiveView()->SendMessage(WM_HSCROLL, 0, (LPARAM)m_wndSlider.GetSafeHwnd());
}
}
// Let the base class handle the message.
CMDIFrameWnd::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CMainFrame::OnUpdateButtonDoc(CCmdUI* pCmdUI)
{
// This is the Command UI handler function for the Static control.
// Use the DYNAMIC_DOWNCAST macro to cast the CWnd* pCmdUI->m_pOther to a CXTPCommandBar* object.
CXTPCommandBar* pCommandBar = DYNAMIC_DOWNCAST(CXTPCommandBar, pCmdUI->m_pOther);
if (!pCommandBar)
return;
// Use the DYNAMIC_DOWNCAST macro to cast the CXTPControl* object to a CControlStatic* object.
CControlStatic* pControl = DYNAMIC_DOWNCAST(CControlStatic, pCommandBar->GetControl(pCmdUI->m_nIndex));
if (!pControl)
return;
// nCount is used to count the number of open child windows.
int nCount = 0;
// Get a pointer to the first child window.
CWnd* pWnd = CWnd::FromHandle(m_hWndMDIClient)->GetWindow(GW_CHILD);
while (pWnd)
{
nCount ++;
pWnd = pWnd->GetWindow(GW_HWNDNEXT); // Returns the next window on the window manager's list.
}
// Create the string caption for the Static control
CString strCaption;
strCaption.Format(_T("Opened Documents: %i"), nCount);
// Set the caption on the Static control
pControl->SetCaption(strCaption);
// Enable the Static control if the number of child windows is greater than 0.
pCmdUI->Enable(nCount > 0);
}
void CMainFrame::OnClose()
{
// Save the current state for command bars.
SaveCommandBars(_T("CommandBars"));
// TODO: Add your message handler code here and/or call default
CMDIFrameWnd::OnClose();
}
void CMainFrame::OnCustomize()
{
// Get a pointer to the command bars object.
CXTPCommandBars* pCommandBars = GetCommandBars();
if (pCommandBars == NULL)
return;
// Instantiate the customize dialog
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* pPageCommands = dlg.GetCommandsPage();
pPageCommands->AddCategories(IDR_COMMONCTYPE);
// Initialize the commands page page.
pPageCommands->InsertAllCommandsCategory();
pPageCommands->InsertBuiltInMenus(IDR_COMMONCTYPE);
pPageCommands->InsertNewMenuCategory();
// Display the customize dialog.
dlg.DoModal();
}
///////////////////////////////////////////////////////////////////
// CControlStatic
IMPLEMENT_XTP_CONTROL(CControlStatic, CXTPControl)
CSize CControlStatic::GetSize(CDC* pDC)
{
// This function is used to determine the size
// of the bounding rectangle of the text. The
// function returns the size of the rectangle in
// a CSize object.
// Determine if the toolbar is docked horizontally or vertically.
BOOL bVert = GetParent()->GetPosition() == xtpBarRight || GetParent()->GetPosition() == xtpBarLeft;
// Instantiate an empty CRect object to hold the
// size of the bounding rectangle of the text.
CXTPEmptyRect rcText;
// Function declaration for the DrawTextEx function:
// CSize DrawTextEx(
// CDC* pDC, A pointer to the current device context.
// CString str, A CString object that contains the text to draw.
// CRect rcText, A CRect object that is used to hold the size of the bounding rectangle of the text.
// BOOL bDraw, If TRUE, then the text is drawn. If FALSE, then the function returns the size of the bounding rectangle of the text.
// BOOL bVert, TRUE if the toolbar is docked in a vertical position.
// BOOL bCentered, TRUE if the text is drawn centered.
// BOOL bTriangled, If TRUE, then an arrow is drawn at the end of the text.
// BOOL bEmbosssed = FALSE, TRUE to draw the text embossed.
// );
// Do not draw the text, just get the size of the bounding rectangle of the text.
CSize sz = GetPaintManager()->DrawControlText(pDC, this, &rcText, FALSE, bVert, FALSE, FALSE);
// If the toolbar is docked in a vertical position,
// then the minimum width of the bounding rectangle is 22.
// The height of the bounding rectangle is the length of the text.
if (bVert)
return CSize(max(22, sz.cx), sz.cy);
// If the toolbar is drawn in a horizontal position, then
// the length of the bounding rectangle is the length of the text.
// The height of the bounding rectangle is a minimum of 22.
return CSize(sz.cx, max(22, sz.cy));
}
void CControlStatic::Draw(CDC* pDC)
{
// Determine if the toolbar is docked horizontally or vertically.
BOOL bVert = GetParent()->GetPosition() == xtpBarRight || GetParent()->GetPosition() == xtpBarLeft;
// Get the bounding rectangle of the control.
CRect rcText = GetRect();
// Function declaration for DrawControlEntry:
// DrawControlEntry(
// CDC* pDC, Pointer to a valid device context
// CRect rc, Rectangle to draw.
// BOOL bEnabled, TRUE if the control is enabled.
// BOOL bSelected, TRUE if the control is selected.
// BOOL bPressed, TRUE if the control is pushed.
// BOOL bChecked, TRUE if the control is checked.
// BOOL bPopuped, TRUE if the control is popuped.
// XTPBarPosition barPosition, Parent's bar position.
// );
// This method is called to fill the control's face.
pDC->SetTextColor(GetPaintManager()->GetRectangleTextColor(FALSE, FALSE, GetEnabled(), FALSE, FALSE, GetParent()->GetType(), GetParent()->GetPosition()));
// Function declaration for the DrawTextEx function:
// CSize DrawTextEx(
// CDC* pDC, A pointer to the current device context.
// CString str, A CString object that contains the text to draw.
// CRect rcText, A CRect object that is used to hold the size of the bounding rectangle of the text.
// BOOL bDraw, If TRUE, then the text is drawn. If FALSE, then the function returns the size of the bounding rectangle of the text.
// BOOL bVert, TRUE if the toolbar is docked in a vertical position.
// BOOL bCentered, TRUE if the text is drawn centered.
// BOOL bTriangled, If TRUE, then an arrow is drawn at the end of the text.
// BOOL bEmbosssed = FALSE, TRUE to draw the text embossed.
// );
// GetEnabled() returns TRUE if the control is enabled; otherwise FALSE.
GetPaintManager()->DrawControlText(pDC, this, &rcText, TRUE, bVert, TRUE, FALSE);
}
///////////////////////////////////////////////////////////////////
// CButtonOptions
BEGIN_MESSAGE_MAP(CButtonOptions, CButton)
//{{AFX_MSG_MAP(CButtonOptions)
ON_CONTROL_REFLECT(BN_CLICKED, OnOptionShow)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CButtonOptions::OnOptionShow()
{
// This function sets the vertical draw behavior for the Option
// buttons on the Options toolbar if the toolbar is docked vertically.
// The three possible options are to hide the control, show the control,
// or to draw the control as a button. These options are defined as an
// enum in the Extreme Tool Kit as follows:
//
// enum XTPControlCustomVerticalOptions
// {
// xtpVerticalHide, // To hide control if parent toolbar vertically docked.
// xtpVerticalShow, // To show control if parent toolbar vertically docked.
// xtpVerticalButton // To show control as a button.
// };
// Get a pointer to the CommandBar.
CXTPCommandBar* pCommandBar = DYNAMIC_DOWNCAST(CXTPCommandBar, GetParent());
if (pCommandBar)
{
// Get the ID of the currently selected Options button on the Options toolbar.
int nID = ::GetDlgCtrlID(m_hWnd);
// Loop through all of the controls on the Options CommnadBar.
for (int i = 0; i < pCommandBar->GetControls()->GetCount(); i++)
{
// Use the DYNAMIC_DOWNCAST macro to cast the CButtonOptions control to a CXTPControlCustom control.
CXTPControlCustom* pControl = DYNAMIC_DOWNCAST(CXTPControlCustom, pCommandBar->GetControl(i));
if (pControl)
{
// Set the control's vertical draw style while the toolbar is docked vertically.
switch(nID)
{
case IDC_OPTION_HIDE: // Option "Hide Vertically" button is selected.
pControl->SetVerticalPositionOption(xtpVerticalHide);
break;
case IDC_OPTION_SHOW: // Options "Show Vertically" button is selected.
pControl->SetVerticalPositionOption(xtpVerticalShow);
break;
case IDC_OPTION_BUTTON: // Options "Show as Button" button is selected.
pControl->SetVerticalPositionOption(xtpVerticalButton);
};
}
}
}
}