You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

418 lines
17 KiB
C++

// XTPMDIWndTab.h : header file
//
// This file is a part of the XTREME CONTROLS MFC class library.
// (c)1998-2012 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
//
/////////////////////////////////////////////////////////////////////////////
//{{AFX_CODEJOCK_PRIVATE
#if !defined(__XTPMDIWNDTAB_H__)
#define __XTPMDIWNDTAB_H__
//}}AFX_CODEJOCK_PRIVATE
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// forwards
class CXTPMDIWndTab;
//===========================================================================
// Summary:
// CXTPMDIClientWnd is a CWnd derived helper class for the CXTPMDIWndTab tab
// control. This class routes messages sent to the client window back
// to the tab control.
//===========================================================================
class _XTP_EXT_CLASS CXTPMDIClientWnd : public CWnd
{
public:
//-----------------------------------------------------------------------
// Summary:
// Constructs a CXTPMDIClientWnd object
// Parameters:
// pMDIWndTab - Pointer to a CXTPMDITabWnd object.
//-----------------------------------------------------------------------
CXTPMDIClientWnd(CXTPMDIWndTab* pMDIWndTab);
//-----------------------------------------------------------------------
// Summary:
// Destroys a CXTPMDIClientWnd object, handles cleanup and deallocation
//-----------------------------------------------------------------------
virtual ~CXTPMDIClientWnd();
public:
//-----------------------------------------------------------------------
// Summary:
// This member function will set the size of the gap between the client
// area and the tab control.
// Parameters:
// iSize - Amount in pixels of gap between the tab control and the client.
//-----------------------------------------------------------------------
void SetBorderGap(int iSize);
protected:
//{{AFX_CODEJOCK_PRIVATE
DECLARE_MESSAGE_MAP()
//{{AFX_VIRTUAL(CXTPMDIClientWnd)
virtual void CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType = adjustBorder);
//}}AFX_VIRTUAL
//{{AFX_MSG(CXTPMDIClientWnd)
afx_msg LRESULT OnMDICreate(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMDIDestroy(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMDIActivate(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
//}}AFX_CODEJOCK_PRIVATE
protected:
int m_iBorderGap; // Amount in pixels between the client and the tab control.
CXTPMDIWndTab* m_pMDIWndTab; // Pointer to the MDI tab control.
};
//////////////////////////////////////////////////////////////////////
AFX_INLINE void CXTPMDIClientWnd::SetBorderGap(int iBorderGap) {
m_iBorderGap = iBorderGap;
}
DECLATE_TABCTRL_BASE(CXTPMDIWndTabBase, CTabCtrl, CXTPTabBase)
// -------------------------------------------------------------------
// Summary:
// CXTPMDIWndTab class is used for creating a tabbed MDI document
// interface.
// Remarks:
// CXTPMDIWndTab is derived from CTabCtrl and CXTPTabCtrlBase and is
// used to create a tab control for a multiple document interface
// (MDI) application.
// Example:
// The following example demonstrates the use of CXTPMDIWndTab.
// <code>
// // Install the MDI tab window.
// m_wndMDITabWindow.Install(this, NULL, TRUE);
// m_wndMDITabWindow.SetBorderGap(1);
// </code>
// -------------------------------------------------------------------
class _XTP_EXT_CLASS CXTPMDIWndTab : public CXTPMDIWndTabBase
{
DECLARE_DYNAMIC(CXTPMDIWndTab)
// ----------------------------------------------------------------------
// Remarks:
// MDICHILD structure is used by the CXTPMDIWndTab class for
// maintaining information on each window in a MDI tab.
// See Also:
// CMDIChildList, CXTPMDIWndTab
// ----------------------------------------------------------------------
struct MDICHILD
{
int iItem; // Index of the item in the tab control.
HWND hWnd; // Window handle of the tab item.
CString strItem; // Tab label.
};
// ----------------------------------------------------------------------
// Summary:
// List for maintaining MDICHILD structures.
// Remarks:
// CList definition used by the CXTPMDIWndTab class to maintain a list
// \of MDICHILD structures representing each MDI child item in the
// tab control.
// See Also:
// CXTPMDIWndTab, MDICHILD
// ----------------------------------------------------------------------
typedef CList<MDICHILD*, MDICHILD*> CMDIChildList;
// ----------------------------------------------------------------------
// Summary:
// Map for maintaining HWND to HICON handle relationships.
// Remarks:
// CMap definition used by the CXTPMDIWndTab class to maintain
// a list of HWND to HICON handle relationships to map a MDI child
// window with the tab icon displayed.
// See Also:
// CXTPMDIWndTab
// -----------------------------------------------------------------
typedef CMap<HWND, HWND, HICON, HICON&> CIconWndMap;
// ----------------------------------------------------------------------
// Summary:
// Map for maintaining HWND to CString object relationships.
// Remarks:
// CMap definition used by the CXTPMDIWndTab class to maintain
// a list of HWND to CString object relationships to map a MDI child
// window with the tab label displayed.
// See Also:
// CXTPMDIWndTab
// -----------------------------------------------------------------
typedef CMap<HWND, HWND, CString, CString&> CStringMap;
public:
//-----------------------------------------------------------------------
// Summary:
// Constructs a CXTPMDIWndTab object
//-----------------------------------------------------------------------
CXTPMDIWndTab();
//-----------------------------------------------------------------------
// Summary:
// Destroys a CXTPMDIWndTab object, handles cleanup and deallocation
//-----------------------------------------------------------------------
virtual ~CXTPMDIWndTab();
public:
//-----------------------------------------------------------------------
// Summary:
// Call this member function to set the icon for the tab item specified
// by 'iIndex'.
// Parameters:
// iIndex - Zero-based index of the tab to set the tab icon for.
// hChildWnd - Valid HWND of the MDI child window to set the tab icon for.
// hIcon - Reference to an HICON handle that represents the tab icon.
// Returns:
// true if successful, otherwise returns false.
//-----------------------------------------------------------------------
bool SetTabIcon(int iIndex, HICON& hIcon);
bool SetTabIcon(HWND hChildWnd, HICON& hIcon); // <combine CXTPMDIWndTab::SetTabIcon@int@HICON&>
//-----------------------------------------------------------------------
// Summary:
// Call this member function to set the label for the tab item specified
// by 'iIndex'.
// Parameters:
// iIndex - Zero-based index of the tab to set the tab text for.
// hChildWnd - Valid HWND of the MDI child window to set the tab text for.
// strLabel - Reference to a CString object that represents the tab label.
// Returns:
// true if successful, otherwise returns false.
//-----------------------------------------------------------------------
bool SetTabLabel(int iIndex, CString& strLabel);
bool SetTabLabel(HWND hChildWnd, CString& strLabel); // <combine CXTPMDIWndTab::SetTabLabel@int@CString&>
//-----------------------------------------------------------------------
// Summary:
// This member function will install the MDI tab views with your application.
// Parameters:
// pMDIFrameWnd - Points to the parent MDI frame window.
// dwStyle - Style for the tab control. It can be any of the TCS_ values.
// bNoIcons - Set to TRUE for no icon to display
// Returns:
// TRUE if successful, otherwise returns FALSE.
//-----------------------------------------------------------------------
virtual BOOL Install(CMDIFrameWnd* pMDIFrameWnd, DWORD dwStyle = TCS_BOTTOM | TCS_HOTTRACK, BOOL bNoIcons = TRUE);
//-----------------------------------------------------------------------
// Summary:
// This member function will uninstall the MDI tab views from your application.
// Returns:
// TRUE if successful, otherwise returns FALSE.
//-----------------------------------------------------------------------
virtual BOOL UnInstall();
//-----------------------------------------------------------------------
// Summary:
// Call this member function to retrieve the tab index from the current
// cursor position.
// Parameters:
// point - Pointer to a CPoint object that contains the cursor screen
// coordinates. Use default for the current cursor position.
// Returns:
// The zero-based index of the tab, or -1 if no tab is at the specified point.
//-----------------------------------------------------------------------
int TabFromPoint(CPoint point) const;
//-----------------------------------------------------------------------
// Summary:
// This member function will return a pointer to the child frame associated
// with the tab item.
// Parameters:
// iIndex - Index of the tab control. If -1, then the tab under the mouse when
// the last right click was performed will be used.
// point - CPoint object that represents the cursor position.
// Returns:
// A CWnd object if successful, otherwise returns NULL.
//-----------------------------------------------------------------------
CMDIChildWnd* GetFrameWnd(int iIndex = -1) const;
CMDIChildWnd* GetFrameWnd(CPoint point) const; // <combine CXTPMDIWndTab::GetFrameWnd@int@const>
//-----------------------------------------------------------------------
// Summary:
// This member function is used to set the resource ID for the popup menu
// used by the tab control.
// Parameters:
// popupMenuID - ID for the tab control popup menu.
// nPos - Index position in the menu resource.
// nDefCmd - ID of the default menu command, will display bold.
//-----------------------------------------------------------------------
void SetMenuID(UINT popupMenuID, int nPos = 0, UINT nDefCmd = (UINT)-1);
//-----------------------------------------------------------------------
// Summary:
// This member function will set the size of the gap between the client
// area and the tab control.
// Parameters:
// iSize - Amount in pixels of gap between the tab control and the client.
//-----------------------------------------------------------------------
void SetBorderGap(int iSize);
//-----------------------------------------------------------------------
// Summary:
// This member function will get the text for the specified MDI child
// window.
// Parameters:
// hWnd - Handle to a valid CMDIChildWnd object.
// Returns:
// A const CString object that represents the document title.
//-----------------------------------------------------------------------
CString GetChildWndText(HWND hWnd) const;
protected:
//-----------------------------------------------------------------------
// Summary:
// This member function is called by the CXTPMDIWndTab class to
// perform initialization when the window is created or sub-classed.
// Returns:
// TRUE if the window was successfully initialized, otherwise FALSE.
//-----------------------------------------------------------------------
virtual BOOL Init();
//-----------------------------------------------------------------------
// Summary:
// This member function is called to initialize the font for the tab control
// associated with this view.
//-----------------------------------------------------------------------
virtual void InitializeFont();
//-----------------------------------------------------------------------
// Summary:
// This member function is called to insert a child frame into the MDI
// tab control.
// Parameters:
// pChildFrame - A pointer to a valid child frame window.
// bRecalcLayout - TRUE to force the MDI frame window to recalc the layout.
//-----------------------------------------------------------------------
virtual void InsertTabWnd(CMDIChildWnd* pChildFrame, BOOL bRecalcLayout = TRUE);
//-----------------------------------------------------------------------
// Summary:
// This member function is called by the tab control to ensure the current
// selection matches the active document.
// Returns:
// FALSE if there is no active document, otherwise returns TRUE.
//-----------------------------------------------------------------------
BOOL RefreshActiveSel();
//-----------------------------------------------------------------------
// Summary:
// This member function is called by the tab control to ensure the tab
// labels match their corresponding views.
//-----------------------------------------------------------------------
void RefreshTabLabels();
//-----------------------------------------------------------------------
// Summary:
// This member function is called by the tab control to ensure the stored
// indexes match their corresponding tab indexes.
//-----------------------------------------------------------------------
void RefreshIndexes();
//-----------------------------------------------------------------------
// Summary:
// Called when an WM_MDICREATE message is sent to a multiple-document
// interface (MDI) client window to create an MDI child window.
// Parameters:
// hWnd - handle to destination control
//-----------------------------------------------------------------------
virtual void OnMDICreate(HWND hWnd);
//-----------------------------------------------------------------------
// Summary:
// Called when an WM_MDIDESTROY message is sent to a multiple-document
// interface (MDI) client window to close an MDI child window.
// Parameters:
// hWnd - handle to destination control
//-----------------------------------------------------------------------
virtual void OnMDIDestroy(HWND hWnd);
//-----------------------------------------------------------------------
// Summary:
// Called when an WM_MDIACTIVATE message is sent to a multiple-document
// interface (MDI) client window to instruct the client window
// to activate a different MDI child window.
// Parameters:
// hWnd - handle to destination control
//-----------------------------------------------------------------------
virtual void OnMDIActivate(HWND hWnd);
//-----------------------------------------------------------------------
// Summary:
// Called to refresh the tab labels and frame window layout.
// Parameters:
// bDelayRecalc - TRUE to call DelayRecalcLayout for the parent frame.
//-----------------------------------------------------------------------
virtual void RecalcLayout(BOOL bDelayRecalc);
protected:
//{{AFX_CODEJOCK_PRIVATE
DECLARE_MESSAGE_MAP()
//{{AFX_MSG(CXTPMDIWndTab)
afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp);
afx_msg void OnNcPaint();
afx_msg void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDestroy();
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg void OnIdleUpdateCmdUI();
afx_msg void OnTabClose();
//}}AFX_MSG
//}}AFX_CODEJOCK_PRIVATE
protected:
int m_iBorderGap; // Amount in pixels between the client and the tab control.
int m_iHitTest; // Index of the tab that received a right click.
int m_nPos; // Index of the popup menu contained in the menu.
UINT m_nDefCmd; // Command ID of the default menu item for the popup menu.
UINT m_popupMenuID; // Popup menu resource ID.
HWND m_hActiveChild; // Active MDI child.
BOOL m_bNoIcons; // TRUE if no icons are used.
DWORD m_dwInitSignature; // Initialization state signature to synch up posted init requests.
CImageList m_imageList; // Tab image list.
CMDIFrameWnd* m_pMDIFrameWnd; // Points to the owner frame.
CMDIChildList m_arMDIChildern; // Array of the MDI windows added to the tab control.
CXTPMDIClientWnd* m_pMDIClientWnd; // Window that receives messages on behalf of the MDI client.
CIconWndMap m_mapTabIcons; // Hash table that maps icons to the MDI child frame windows.
CStringMap m_mapTabLabels; // Hash table that maps labels to the MDI child frame windows.
friend class CXTPMDIClientWnd;
};
//////////////////////////////////////////////////////////////////////
AFX_INLINE void CXTPMDIWndTab::SetMenuID(UINT popupMenuID, int nPos, UINT nDefCmd) {
m_popupMenuID = popupMenuID; m_nPos = nPos; m_nDefCmd = nDefCmd;
}
AFX_INLINE void CXTPMDIWndTab::SetBorderGap(int iBorderGap) {
m_iBorderGap = iBorderGap; m_pMDIClientWnd->SetBorderGap(iBorderGap + ::GetSystemMetrics(SM_CXSIZEFRAME));
}
#endif // !defined(__XTPMDIWNDTAB_H__)