www.pudn.com > TreePropSheetEx.rar > TreePropSheetSplitter.h


// TreePropSheetSplitter.h 
// 
///////////////////////////////////////////////////////////////////////////// 
// 
// Copyright (C) 2004 by Yves Tkaczyk 
// (http://www.tkaczyk.net - yves@tkaczyk.net) 
// 
// The contents of this file are subject to the Artistic License (the "License"). 
// You may not use this file except in compliance with the License.  
// You may obtain a copy of the License at: 
// http://www.opensource.org/licenses/artistic-license.html 
// 
// Documentation: http://www.codeproject.com/property/treepropsheetex.asp 
// CVS tree:      http://sourceforge.net/projects/treepropsheetex 
// 
//  /******************************************************************** 
//  * 
//  * This code is an update of SimpleSplitter written by Robert A. T. Kaldy and  
//  * published on code project at http://www.codeproject.com/splitter/kaldysimplesplitter.asp. 
//  * 
//  *  //  CSimpleSplitter 
//  *  // 
//  *  //  Splitter window with CWnd-derived panes 
//  *  //  (C) Robert A. T. Kaldy  
//  *  //  last updated on 11.2.2004 
//  * 
//  *********************************************************************/ 
// 
///////////////////////////////////////////////////////////////////////////// 
 
// 
//  CSimpleSplitter 
// 
//  Splitter window with CWnd-derived panes 
//  (C) Robert A. T. Kaldy  
//  last updated on 11.2.2004 
 
 
#ifndef _TREEPROPSHEET_TREEPROPSHEETSPLITTER_H__INCLUDED_ 
#define _TREEPROPSHEET_TREEPROPSHEETSPLITTER_H__INCLUDED_ 
 
#define SSP_HORZ		1 
#define SSP_VERT		2 
 
namespace TreePropSheet 
{ 
 
/*! \brief Splitter class to TreePropSheetEx 
 
  @version 0.1 Initial release 
  @version 0.2 (08/2004) Added individual minimum pane sizes 
  @author Robert A. T. Kaldy (original CSimpleSplitter) 
  @author Yves Tkaczyk   
  @date 07/2004 */ 
class CTreePropSheetSplitter 
 : public CWnd 
{ 
public: 
	CTreePropSheetSplitter(const int nPanes, const UINT nOrientation = SSP_HORZ, const int nMinSize = 50, const int nBarThickness = 5); 
  CTreePropSheetSplitter(const int nPanes, const UINT nOrientation, const int* pzMinSize, const int nBarThickness); 
	~CTreePropSheetSplitter(); 
 
	BOOL Create(CWnd* pParent,const CRect& rect,UINT nID = AFX_IDW_PANE_FIRST); 
	BOOL Create(CWnd* pParent, UINT nID = AFX_IDW_PANE_FIRST); 
	BOOL CreatePane(int nIndex, CWnd* pPaneWnd, DWORD dwStyle, DWORD dwExStyle, LPCTSTR lpszClassName = NULL); 
	 
// Methods 
  /*! Returns the number of panes. 
    @retval Number of panes as set in constructor. */ 
   int GetPaneCount() const 
  { 
    return m_nPanes;  
  } 
	 
  /*! Associates a winodw with the specified pane. 
    @param nIndex Index to pane. Must be smaller than the total number of panes.  
    @param pPaneWnd Window to the registered with the pane. */ 
  void SetPane(int nIndex, CWnd* pPaneWnd); 
	 
  /*! Returns the window associated with the specified pane.  
    @retval Window associated with pane. */ 
  CWnd* GetPane(int nIndex) const; 
	 
  /*! Activate the specified pane. The focus is given to the associated window.  
    @param nIndex Index to pane to activiate. */ 
  virtual void SetActivePane(int nIndex); 
	 
  /*! Returns the current active pane. 
  @param nIndex Is set to the current active pane. Must be smaller than the total  
                number of panes. 
  @retval Pointer to current active pane or NULL if there is no pane with focus. */ 
  CWnd* GetActivePane(int& nIndex) const; 
	 
  /*! Set the size of each pane.  
    @param sizes Array of integer represneting pane size. */ 
  void SetPaneSizes(const int* sizes); 
	 
  /*! Returns the pane's rectangle for the specified pane.  
    @param nIndex Pane for which rectangle is queried. Must be smaller than the total 
                  number of panes. 
    @param rcPane Receive the specified pane rectangle. */ 
  void GetPaneRect(int nIndex, CRect& rcPane) const; 
	 
  /*! Returns the rectangle of the specified bar. The bar is the 
     portion of the window grabbed by the user for resizing. 
    @param nIndex Pane for which rectangle is queried. Must be smaller than the total 
                  number of panes - 1. 
    @param rcBar Receive the specified bar rectangle. */ 
  void GetBarRect(int nIndex, CRect& rcBar) const; 
 
  /*! Indicates which panes should be frozen. If possible, 
      frozen panes are not resized when the splitter window 
      is resized. 
    @param frozenPanes Array of boolean. Each bool represents a pane. If the value 
                       is true, the pane is frozen. */ 
  void SetFrozenPanes(const bool* frozenPanes); 
 
  /*! Unfreeze all panes. */  
  void ResetFrozenPanes(); 
 
  /*! Indicates if the splitter should refresh all panes 
      when the user is moving a bar.  
    @param bRealtime True to have real-time update. */ 
  void SetRealtimeUpdate(const bool bRealtime); 
 
  /*! Returns true if the splitter is in real-time mode.  
    @retval bool True if in real-time mode. */ 
  bool IsRealtimeUpdate() const; 
 
  /*! Indicates if the user can resize the panes.  
    @param bAllowUserResizing True if the user can resize the panes. */  
  void SetAllowUserResizing(const bool bAllowUserResizing); 
 
  /*! Returns true if user is allowed to resize the panes.  
    @retval bool True if panes are user resizable. */ 
  bool IsAllowUserResizing() const; 
 
// Overridables 
  /*! Update the provided area on the parent window. This can be overriden if  
      necessary. */ 
  virtual void UpdateParentRect(LPCRECT lpRectUpdate ); 
 
protected: 
	void RecalcLayout(); 
	void ResizePanes(); 
	void InvertTracker(); 
  void GetAdjustedClientRect(CRect* rRect) const; 
	 
	//{{AFX_MSG(CTreePropSheetSplitter) 
	afx_msg void OnPaint(); 
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point); 
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point); 
	afx_msg void OnMouseMove(UINT nFlags, CPoint point); 
	afx_msg void OnSize(UINT nType, int cx, int cy); 
	afx_msg BOOL OnNcCreate(LPCREATESTRUCT lpCreateStruct); 
	afx_msg void OnWindowPosChanging(WINDOWPOS FAR* lpwndpos); 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
 
// Helpers 
protected: 
  /*! Returns a handle to the appropriate cursor based on the resizing 
      mode and the slitter type (horizontal or vertical). 
      The cursor is loaded as a shared resource (LR_SHARED) and does not 
      need to be destroyed. 
    @return HCURSOR Handle to cursor or NULL if creation failed. */ 
  HCURSOR GetCursorHandle() const; 
private: 
  /*! Common part of instance initialization. */ 
  void CommonInit(); 
 
// Members 
protected: 
	const int m_nPanes; 
	const UINT m_nOrientation; 
  const int m_nBarThickness; 
 
	int m_nTrackIndex, m_nTracker, m_nTrackerLength, m_nTrackerMouseOffset; 
	 
	CWnd** m_pane; 
	int *m_size, *m_orig; 
  /*! Array of minimum pane sizes. */ 
  int* m_pzMinSize; 
  /*! Array of bools describing the frozen panes. */ 
  bool *m_frozen; 
  /*! Number of forzen panes. */ 
  int m_nFrozenPaneCount; 
  /*! Flag indicating if the splitter should refreshed its panes in realtime. */ 
  bool m_bRealtimeUpdate; 
  /*! Flag indicating if the user can resize the panes. */ 
  bool m_bAllowUserResizing; 
}; 
 
};  // namespace TreePropSheet 
 
#endif  // _TREEPROPSHEET_TREEPROPSHEETSPLITTER_H__INCLUDED_