424 lines
15 KiB
C++
424 lines
15 KiB
C++
// ===================================================================================
|
||
// Class Specification : COXSizeControlBar
|
||
// ===================================================================================
|
||
|
||
// Header file : OXSizeCtrlBar.h
|
||
|
||
// Version: 9.3
|
||
|
||
// This software along with its related components, documentation and files ("The Libraries")
|
||
// is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
|
||
// governed by a software license agreement ("Agreement"). Copies of the Agreement are
|
||
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
|
||
// to obtain this file, or directly from our office. For a copy of the license governing
|
||
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
|
||
// Some portions Copyright (C)1994-5 Micro Focus Inc, 2465 East Bayshore Rd, Palo Alto, CA 94303.
|
||
|
||
// //////////////////////////////////////////////////////////////////////////
|
||
|
||
// Properties:
|
||
// NO Abstract class (does not have any objects)
|
||
// YES Derived from CControlBar
|
||
|
||
// YES Is a Cwnd.
|
||
// YES Two stage creation (constructor & Create())
|
||
// YES Has a message map
|
||
// NO Needs a resource (template)
|
||
|
||
// NO Persistent objects (saveable on disk)
|
||
// NO Uses exceptions
|
||
|
||
// //////////////////////////////////////////////////////////////////////////
|
||
|
||
// Desciption :
|
||
//
|
||
// This class provides the basic behaviour for control bars that can be resized,
|
||
// both when docked and floating. The resizing is free-form, ie there are no
|
||
// discrete steps, and the bar has difference sizes, depending on whether it is
|
||
// docked vertically, horizontally or floating.
|
||
// To implement this feature in your application you must:
|
||
// 1. Derive you main frame window (usually CMainFrame) from either
|
||
// COXFrameWndSizeDock (instead of CFrameWnd, for SDI apps), or
|
||
// COXMDIFrameWndSizeDock (instead of CMDIFrameWnd, for MDI apps).
|
||
// 2. Derive any specific control bars you need from COXSizeControlBar,
|
||
// and/or make use of COXSizeDialogBar and COXSizeToolBar.
|
||
|
||
// You may combine both sizeable (COXSizeControlBar-derived) and non-sizeable
|
||
// (CControlBar-derived) controls bars in the same application. To best get to
|
||
// grips with writing to these classes, read the implementation summary and
|
||
// look at the example. In general the steps you’ll go through are pretty
|
||
// much the same as with MFC’s CControlBar.
|
||
|
||
// 1. Construct the MFC COXSize...Bar object, either using new, or on the stack.
|
||
// Note that the constructor takes a parameter. If you wish to create an
|
||
// object on the stack, then you may find it easier to use the
|
||
// SetSizeDockStyle() function, immediately after constructing the
|
||
// object, than specifying a parameter to the constructor.
|
||
// 2. Use Create() to create the bar.
|
||
// 3. Use EnableDocking().
|
||
// 4. Float or Dock the bar. Generally, CControlBars don’t work with much
|
||
// sense until you done this step.
|
||
|
||
// One feature you may find useful in deriving from COXSizeControlBar, is that
|
||
// WM_COMMAND notifications to be handled locally inside the derived class,
|
||
// as well as via the standard routing mechanism. E.g. if you have a button
|
||
// control on a COXSizeControlBar derived class, you can implement the
|
||
// ON_COMMAND handler either in your derived class, OR, in the view, frame, etc.
|
||
// as with normal CControlBars.
|
||
|
||
// Remark:
|
||
//
|
||
|
||
// Prerequisites (necessary conditions):
|
||
// ***
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
|
||
#ifndef __SIZECTRLBAR_H__
|
||
#define __SIZECTRLBAR_H__
|
||
|
||
#if _MSC_VER >= 1000
|
||
#pragma once
|
||
#endif // _MSC_VER >= 1000
|
||
|
||
#include "OXDllExt.h"
|
||
#include "OXMainRes.h"
|
||
|
||
#ifdef IsMaximized
|
||
#undef IsMaximized
|
||
#endif
|
||
|
||
// closing the floating window closes the control bar
|
||
#define SZBARF_DESTROY_ON_CLOSE 0x00000001
|
||
// keeps window in an array, so it can be deleted
|
||
#define SZBARF_AUTOTIDY 0x00000002
|
||
|
||
|
||
// standard mouse handling for the menu
|
||
#define SZBARF_STDMOUSECLICKS 0x00000004
|
||
|
||
// auto-size dialog bars
|
||
#define SZBARF_DLGAUTOSIZE 0x00000008
|
||
|
||
// allow bar to float in an MDI window
|
||
#define SZBARF_ALLOW_MDI_FLOAT 0x00000010
|
||
|
||
// will not display gripper
|
||
#define SZBARF_NOGRIPPER 0x00000020
|
||
|
||
// will not display close button (close button will be displayed unless
|
||
// SZBARF_NOGRIPPER style is specified)
|
||
#define SZBARF_NOCLOSEBTN 0x00000040
|
||
|
||
// will not display resize button (resize button will be displayed unless
|
||
// SZBARF_NOGRIPPER style is specified)
|
||
#define SZBARF_NORESIZEBTN 0x00000080
|
||
|
||
// will not display bar caption on the gripper (caption will be displayed unless
|
||
// SZBARF_NOGRIPPER style is specified)
|
||
#define SZBARF_NOCAPTION 0x00000100
|
||
|
||
// displays the gripper as window caption bar (filled with solid color defined
|
||
// for standard windows caption bars)
|
||
#define SZBARF_SOLIDGRIPPER 0x00000200
|
||
|
||
// Provide Visual Studio .NET style of docking - detachable tab windows, etc.
|
||
#define SZBARF_VS7STYLEDOCKING 0x00000400
|
||
|
||
|
||
|
||
#define CBRS_MOVED_BY_USER 0x0001L // set if dragged by user
|
||
|
||
|
||
#define ID_CONTAINER_GAP 5
|
||
#define ID_BUTTON_SIDE 11
|
||
#define ID_TEXT_OFFSET 6
|
||
#define ID_TEXTGRIPPER_MARGIN 3
|
||
#define ID_GRIPPER_MINSIZE 6
|
||
|
||
class COXDockbarSkin;
|
||
class COXSizeDockBar;
|
||
|
||
class OX_CLASS_DECL COXSizeControlBar : public CControlBar
|
||
{
|
||
friend class COXDockbarSkinClassic;
|
||
friend class COXDockbarSkinXP;
|
||
friend class COXDockbarSkin2003;
|
||
friend class COXSizableMiniDockFrameWnd;
|
||
friend class COXDockTabCtrl;
|
||
friend class COXSkin2003;
|
||
|
||
//DECLARE_DYNCREATE(COXSizeControlBar)
|
||
DECLARE_DYNAMIC(COXSizeControlBar)
|
||
|
||
// Data members -------------------------------------------------------------
|
||
public:
|
||
|
||
CSize m_FloatSize; // size when floating
|
||
CSize m_HorzDockSize; // size when docked horizontal
|
||
CSize m_VertDockSize; // size when docked vertical
|
||
// - size reflects the current docked size of the window (I do nothing clever for stretched)
|
||
// - height is generally shared across the rows
|
||
CSize m_SavedDockSize; // size before maximizing
|
||
|
||
CPoint m_FloatingPosition; // floating position
|
||
DWORD m_dwAllowDockingState; // saved enable style for allow docking on/off
|
||
int m_Style; // style flags
|
||
CSize m_PrevSize;
|
||
BOOL m_bPrevFloating; // Indicates if control bar is floating
|
||
BOOL m_bDragging; // Indicates if the control is currently being dragged
|
||
BOOL m_bOkToDrag; // Indicates if it is okay to start dragging
|
||
int m_iLastTabPosition; // Position in the tab control when last tabbed
|
||
|
||
protected:
|
||
CRect m_rectGripper; // gripper rect
|
||
CRect m_rectCloseBtn; // close button rect
|
||
CRect m_rectResizeBtn; // Resize button rect
|
||
CPoint m_ptOffset;
|
||
BOOL m_bDelayRecalcLayout;
|
||
BOOL m_bClientBorder; // determines whether a client border should be drawn
|
||
|
||
typedef enum _tagSIZEBARBTN
|
||
{
|
||
CLOSEBTN=-3,
|
||
RESIZEBTN=-2,
|
||
NONE=-1
|
||
} SIZEBARBTN;
|
||
|
||
SIZEBARBTN m_pressedBtn;
|
||
|
||
BOOL m_bMaximized;
|
||
|
||
BOOL m_bActive;
|
||
|
||
private :
|
||
|
||
static CObArray* m_parrAllocBars; // array of dynamically allocated bars
|
||
CPoint m_ptLButtonDown;
|
||
COXDockbarSkin* m_pDockbarSkin;
|
||
COXDockbarSkin* GetDockbarSkin();
|
||
static LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);
|
||
static HHOOK m_hMouseHook;
|
||
static HWND m_hwndPrevMouseMoveWnd;
|
||
|
||
// Member functions ---------------------------------------------------------
|
||
public:
|
||
BOOL IsShown();
|
||
COXDockTabCtrl* GetDockTabCtrl();
|
||
void ShowBar(BOOL bShow);
|
||
|
||
COXSizeControlBar(int nStyle = SZBARF_STDMOUSECLICKS);
|
||
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns :
|
||
// --- Effect : Clears array of dynamically allocated bars
|
||
static void TidyUp(CFrameWnd* pTopLevelFrame);
|
||
|
||
|
||
// --- In : nStyle : the look and feel of the controlbar
|
||
//
|
||
// SZBARF_DESTROY_ON_CLOSE When set, clicking the close button on
|
||
// the floating frame causes the control bar
|
||
// to be closed and destroyed. Normally,
|
||
// the control bar would just be hidden.
|
||
//
|
||
// SZBARF_AUTOTIDY MFC CControlBar objects cannot be deleted
|
||
// from PostNCDestroy(). Normally CControlBar
|
||
// objects are allocated within another object
|
||
// (e.g. CMainFrame) so the destructors are
|
||
// called when that object is deleted.
|
||
// If you allocate control bars dynamically
|
||
// (as is often useful with sizeable control
|
||
// bars), then you will get memory leaks.
|
||
// Setting this flag causes all allocated
|
||
// COXSizeControlBars to be tracked, and
|
||
// deleted automatically when the frame window
|
||
// is destroyed.
|
||
//
|
||
// SZBARF_STDMOUSECLICKS The control bar will respond to standard
|
||
// mouse events, such as double click on the
|
||
// title bar to dock, pop up a context menu
|
||
// to hide or enable/disable docking.
|
||
//
|
||
// SZBARF_DLGAUTOSIZE Use in conjunction with dialog bars. The
|
||
// gadgets on the dialog bar will resize to
|
||
// fit the new window. This is a simple linear
|
||
// mapping based on the original sizes &
|
||
// positions in the dialog resource, but it
|
||
// does work surprisingly well.
|
||
//
|
||
// SZBARF_ALLOW_MDI_FLOAT When set, the context menu will allow the
|
||
// user to float the bar as an MDI child
|
||
// window.
|
||
//
|
||
// --- Out :
|
||
// --- Returns :
|
||
// --- Effect : Constructor of object
|
||
// It will initialize the internal state.
|
||
virtual BOOL Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName,
|
||
DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID,
|
||
CCreateContext* pContext = NULL);
|
||
|
||
|
||
// --- In : pParent : Points to the parent frame window of the control. Should be derived
|
||
// from either COXMDIFrameWndSizeDock, or COXFrameWndSizeDock.
|
||
// lpszTitle : Specifies the control’s caption - used in the floating frame window,
|
||
// when the bar is undocked.
|
||
// nID : the window ID of the controlbar
|
||
// dwStyle : The styles of the controlbar (See CControlBar for styles)
|
||
// rect : the initial size and placement of the controlbar (in client coordinates)
|
||
// --- Out :
|
||
// --- Returns : succeeded or not
|
||
// --- Effect : Creates the control bar. You should use the WS_VISIBLE style when creating
|
||
// your toolbar, otherwise the initially size may be incorrect.
|
||
BOOL Create(CWnd* pParent, LPCTSTR lpszTitle, UINT nID = 1,
|
||
DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM,
|
||
const RECT& rect = CFrameWnd::rectDefault);
|
||
|
||
|
||
// --- In : dwStyle : the new style(s) for the controlbar (See constructor for styles)
|
||
// --- Out :
|
||
// --- Returns :
|
||
// --- Effect : Sets the internal style flag for the control bar. Use this as an alternative
|
||
// to specifing a parameter on the constructor (except where specifying
|
||
// SZBARF_AUTOTIDY), and call it immediately after construction, but before Create().
|
||
void SetSizeDockStyle(DWORD dwStyle);
|
||
|
||
|
||
// --- In : dwDockStyle : See CControlBar::EnableDocking
|
||
// --- Out :
|
||
// --- Returns :
|
||
// --- Effect : This function is equivalent to CControlBar::EnableDocking(), but applies to sizeable
|
||
// control bars. Note that this function is NOT virtual, so you must take care that you
|
||
// do not inadvertently call CControlBar::EnableDocking() on a COXSizeControlBar object.
|
||
void EnableDocking(DWORD dwDockStyle);
|
||
|
||
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns : TRUE if the control bar is floating (inside a floating frame window).
|
||
// Unlike CControlBar::IsFloating(), it returns TRUE if the bar is in
|
||
// transition between floating and non-floating. This function proves more
|
||
// useful inside the OnSizedOrDocked() overridable.
|
||
// --- Effect : Indicates if control bar is floating
|
||
BOOL IsProbablyFloating();
|
||
|
||
|
||
// command handlers for standard menus
|
||
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns :
|
||
// --- Effect : Called when controlbar is to be hidden
|
||
void OnHide();
|
||
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns :
|
||
// --- Effect : called when docking state is switched
|
||
void OnToggleAllowDocking();
|
||
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns :
|
||
// --- Effect : called when controlbar is floated in an MDI frame
|
||
void OnFloatAsMDI();
|
||
|
||
|
||
inline BOOL IsGripper() const { return (m_Style & SZBARF_NOGRIPPER)==0; }
|
||
inline BOOL IsCloseBtn() const { return (m_Style & SZBARF_NOCLOSEBTN)==0; }
|
||
inline BOOL IsResizeBtn() const { return (m_Style & SZBARF_NORESIZEBTN)==0; }
|
||
inline BOOL IsCaption() const { return (m_Style & SZBARF_NOCAPTION)==0; }
|
||
inline BOOL IsSolidGripper() const { return (m_Style & SZBARF_SOLIDGRIPPER)!=0; }
|
||
inline void SetClientBorder(BOOL bDrawBorder) { m_bClientBorder = bDrawBorder; }
|
||
|
||
|
||
inline BOOL IsMaximized() const { return m_bMaximized; }
|
||
inline void SetMaximized(BOOL bMaximized)
|
||
{
|
||
if(m_bMaximized!=bMaximized)
|
||
{
|
||
m_bMaximized=bMaximized;
|
||
RedrawResizeBtn();
|
||
}
|
||
}
|
||
|
||
|
||
void SetActive(BOOL bActive, BOOL bResetAllCtrlBars=FALSE);
|
||
inline BOOL IsActive() const { return m_bActive; }
|
||
|
||
|
||
virtual BOOL CanResize() const;
|
||
|
||
virtual void EraseNonClient();
|
||
|
||
// Overrides
|
||
// ClassWizard generated virtual function overrides
|
||
//{{AFX_VIRTUAL(COXSizeControlBar)
|
||
//}}AFX_VIRTUAL
|
||
|
||
virtual CSize CalcFixedLayout(BOOL bStretch, BOOL bHorz);
|
||
virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler);
|
||
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns :
|
||
// --- Effect : Destructor of object
|
||
virtual ~COXSizeControlBar();
|
||
|
||
protected:
|
||
// Overridable functions
|
||
|
||
// --- In : cx : New width of the control bar.
|
||
// cy : New height of the control bar.
|
||
// bFloating : TRUE if the bar is now floating.
|
||
// flags : Reserved.
|
||
// --- Out :
|
||
// --- Returns :
|
||
// --- Effect : This overridable is called whenever the control bar is sized or docked/undocked.
|
||
// It is probably the easiest place to respond to resizing the control.
|
||
virtual void OnSizedOrDocked(int cx, int cy, BOOL bFloating, int flags);
|
||
|
||
virtual void DrawGripper(CDC* pDC);
|
||
virtual void DrawCloseBtn(CDC* pDC);
|
||
virtual void DrawResizeBtn(CDC* pDC);
|
||
|
||
void RecalcLayout();
|
||
void SaveMouseOffset(CPoint point);
|
||
void RedrawCloseBtn();
|
||
void RedrawResizeBtn();
|
||
|
||
//{{AFX_MSG(COXSizeControlBar)
|
||
afx_msg void OnWindowPosChanged(WINDOWPOS* lpwndpos);
|
||
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
|
||
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
|
||
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
|
||
afx_msg void OnNcCalcSize(BOOL, NCCALCSIZE_PARAMS*);
|
||
afx_msg void OnNcPaint();
|
||
afx_msg void OnPaint();
|
||
#if _MSC_VER >= 1400
|
||
afx_msg LRESULT OnNcHitTest(CPoint point);
|
||
#else
|
||
afx_msg UINT OnNcHitTest(CPoint point);
|
||
#endif
|
||
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 int OnCreate(LPCREATESTRUCT lpCreateStruct);
|
||
afx_msg void OnDestroy();
|
||
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
|
||
//}}AFX_MSG
|
||
|
||
virtual LRESULT WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam);
|
||
afx_msg LONG OnAddContextMenuItems(UINT wParam, LPARAM lParam);
|
||
afx_msg LONG OnAfterFloatMessage(UINT, LONG);
|
||
|
||
DECLARE_MESSAGE_MAP()
|
||
|
||
private:
|
||
void RedrawButtons();
|
||
};
|
||
|
||
#endif // __SIZECTRLBAR_H__
|