Code/Resource
Windows Develop
Linux-Unix program
Internet-Socket-Network
Web Server
Browser Client
Ftp Server
Ftp Client
Browser Plugins
Proxy Server
Email Server
Email Client
WEB Mail
Firewall-Security
Telnet Server
Telnet Client
ICQ-IM-Chat
Search Engine
Sniffer Package capture
Remote Control
xml-soap-webservice
P2P
WEB(ASP,PHP,...)
TCP/IP Stack
SNMP
Grid Computing
SilverLight
DNS
Cluster Service
Network Security
Communication-Mobile
Game Program
Editor
Multimedia program
Graph program
Compiler program
Compress-Decompress algrithms
Crypt_Decrypt algrithms
Mathimatics-Numerical algorithms
MultiLanguage
Disk/Storage
Java Develop
assembly language
Applications
Other systems
Database system
Embeded-SCM Develop
FlashMX/Flex
source in ebook
Delphi VCL
OS Develop
MiddleWare
MPI
MacOS develop
LabView
ELanguage
Software/Tools
E-Books
Artical/Document
EGDockingPane.cpp
Package: solidgraph_sources.zip [view]
Upload User: kairuinn
Upload Date: 2009-02-07
Package Size: 2922k
Code Size: 65k
Category:
Graph program
Development Platform:
Visual C++
- #include "stdafx.h"
- #include "EGDocking.h"
- #include "NewTheme.h"
- #include "EGMenu.h"
- #include <algorithm>
- #include <functional>
- #define SPLITTER_SIZE 4
- #define TABS_BKGND RGB(247,243,233)
- #define DM_PANESTATE_CHANGED WM_USER + 1
- #define _AfxGetDlgCtrlID(hWnd) ((UINT)(WORD)::GetDlgCtrlID(hWnd))
- /////////////////////////////////////////////////////////////////////////
- // functors
- class HotPaneButton {
- int m_nX;
- public:
- HotPaneButton( int x ) {
- m_nX = x;
- }
- bool operator() ( CEGDockingTabBtn btn ) {
- return ( btn.m_nLeft <= m_nX && m_nX <= btn.m_nLeft + btn.m_nWidth );
- }
- };
- class MatchPaneButton {
- CEGDockingPane * m_pPane;
- public:
- MatchPaneButton( CEGDockingPane * pPane ) {
- m_pPane = pPane;
- }
- bool operator() ( CEGDockingTabBtn btn ) {
- return btn.m_pPane == m_pPane;
- }
- };
- // stub
- int CALLBACK EnumFontFamProc(ENUMLOGFONT FAR *lpelf,
- NEWTEXTMETRIC FAR *lpntm,
- int FontType,
- LPARAM lParam)
- {
- UNUSED_ALWAYS(lpelf);
- UNUSED_ALWAYS(lpntm);
- UNUSED_ALWAYS(FontType);
- UNUSED_ALWAYS(lParam);
- return 0;
- }
- /////////////////////////////////////////////////////////////////////////
- // CEGDockingPane
- CEGDockingPane::CEGDockingPane() {
- m_pDockingBar = NULL;
- m_pszTitle = NULL;
- m_bHidden = FALSE;
- m_clrColor = themeData.GetNewColor();
- // Caption height
- m_cyCaption = ::GetSystemMetrics(SM_CYSMCAPTION);
- m_pRemovedFromBar = NULL;
- }
- CEGDockingPane::~CEGDockingPane() {
- if ( m_pDockingBar != NULL ) {
- m_pDockingBar->RemovePane( this );
- if ( m_pDockingBar->IsEmpty() )
- delete m_pDockingBar;
- m_pDockingBar = NULL;
- }
- if( m_pszTitle != NULL )
- free( m_pszTitle );
- }
- BEGIN_MESSAGE_MAP(CEGDockingPane, CStatic)
- ON_NOTIFY( NM_KILLFOCUS, 0, OnKillFocus )
- ON_NOTIFY( NM_SETFOCUS, 0, OnSetFocus )
- END_MESSAGE_MAP()
- BOOL CEGDockingPane::baseCreate( TCHAR* lpszTitle, CSize size, CFrameWnd* pFrame ) {
- m_pszTitle = _tcsdup( lpszTitle );
- if( !Create( NULL, WS_CHILD /*| WS_BORDER */| WS_CLIPCHILDREN | WS_CLIPSIBLINGS , CRect( CPoint(0,0), size ), pFrame, 0 /* nID */ ) )
- return FALSE;
- return TRUE;
- }
- void CEGDockingPane::CreateBar( TCHAR* lpszTitle, CSize size, CFrameWnd* pFrame ) {
- m_pDockingBar = new CEGDockingBar( size );
- ::SendMessage( pFrame->m_hWnd, DM_DOCKING_BAR, (WPARAM) m_pDockingBar, 0 );
- m_pDockingBar->Create( lpszTitle, 0, pFrame, 0 /*nID*/);
- m_pDockingBar->AddPane( this );
- }
- BOOL CEGDockingPane::CreatePane( TCHAR* lpszTitle, CSize size, CFrameWnd* pFrame, CEGDockingPane *pPane, DockType nDockType, CPoint ptFloat ) {
- // Create pane
- if( !baseCreate( lpszTitle, size, pFrame ) ) {
- TRACE1("FAILED to CEGDockingPane::baseCreate("%s",...)", lpszTitle );
- return FALSE;
- }
- if ( !pPane ) {
- // dock to client area side
- CreateBar( lpszTitle, size, pFrame );
- int nSide = 0;
- switch( nDockType ) {
- case dctBottom:
- nSide = AFX_IDW_DOCKBAR_BOTTOM;
- break;
- case dctLeft:
- nSide = AFX_IDW_DOCKBAR_LEFT;
- break;
- case dctRight:
- nSide = AFX_IDW_DOCKBAR_RIGHT;
- break;
- case dctTop:
- nSide = AFX_IDW_DOCKBAR_TOP;
- break;
- };
- if ( 0 == nSide ) {
- pFrame->FloatControlBar( (CControlBar*)m_pDockingBar, ptFloat );
- } else {
- pFrame->DockControlBar( (CControlBar*)m_pDockingBar, nSide );
- m_pDockingBar->m_pDockContext->m_uMRUDockID = nSide;
- }
- pFrame->RecalcLayout();
- } else if ( pPane && dctTab == nDockType ) {
- // append tab to another pane
- pPane->AppendTab( this );
- m_pDockingBar = pPane->m_pDockingBar;
- } else {
- // dock to border of another pane
- CreateBar( lpszTitle, size, pFrame );
- CRect rc;
- pPane->m_pDockingBar->GetWindowRect( &rc );
- switch( nDockType ) {
- case dctBottom:
- rc.OffsetRect( 0, 20 );
- break;
- case dctLeft:
- rc.OffsetRect( -20, 0 );
- break;
- case dctRight:
- rc.OffsetRect( 20, 0 );
- break;
- case dctTop:
- rc.OffsetRect( 0, -20 );
- break;
- };
- CDockBar * pDockBar = (CDockBar*)pFrame->GetControlBar(pPane->m_pDockingBar->GetDockBarID());
- pDockBar->DockControlBar( m_pDockingBar, &rc);
- pFrame->RecalcLayout();
- m_pDockingBar->m_pDockContext->m_uMRUDockID = _AfxGetDlgCtrlID(pDockBar->m_hWnd);
- }
- return TRUE;
- }
- DockType GetDropTarget( CPoint pt, CRect rcClient ) {
- CRect rcArea;
- // trying dock on top
- rcArea = rcClient;
- rcArea.bottom = rcArea.top + min( rcClient.Height(), DROP_AREA_SIZE );
- if ( rcArea.PtInRect( pt ) )
- return dctTop; // can dock on top
- // trying dock on bottom
- rcArea = rcClient;
- rcArea.top = rcArea.bottom - min( rcClient.Height(), DROP_AREA_SIZE );
- if ( rcArea.PtInRect( pt ) )
- return dctBottom; // can dock on bottom
- // trying dock on left
- rcArea = rcClient;
- rcArea.right = rcArea.left + min( rcClient.Width(), DROP_AREA_SIZE );
- if ( rcArea.PtInRect( pt ) )
- return dctLeft; // can dock on bottom
- // trying dock on right
- rcArea = rcClient;
- rcArea.left = rcArea.right - min( rcClient.Width(), DROP_AREA_SIZE );
- if ( rcArea.PtInRect( pt ) )
- return dctRight; // can dock on bottom
- return dctFloat;
- }
- CRect GetDropRect( DockType dt, CRect rcWindow, int nSize ) {
- CRect rcResult = rcWindow; // default for dctTab;
- switch( dt ) {
- case dctBottom:
- rcResult.top = rcResult.bottom - min( rcWindow.Height(), nSize );
- break;
- case dctLeft:
- rcResult.right = rcResult.left + min( rcWindow.Width(), nSize );
- break;
- case dctRight:
- rcResult.left = rcResult.right - min( rcWindow.Width(), nSize );
- break;
- case dctTop:
- rcResult.bottom = rcResult.top + min( rcWindow.Height(), nSize );
- break;
- };
- return rcResult;
- }
- DockType CEGDockingPane::GetDropTarget( CPoint pt /* client coordinates */ ) {
- CRect rcClient;
- GetWindowRect( &rcClient );
- rcClient.OffsetRect( -rcClient.TopLeft() );
- return ::GetDropTarget( pt, rcClient );
- }
- CRect CEGDockingPane::GetDropRect( DockType dt ) {
- CRect rcWindow;
- GetParent()->GetWindowRect( &rcWindow );
- return ::GetDropRect( dt, rcWindow, DOCK_AREA_SIZE );
- }
- void CEGDockingPane::CreateDragBar( CPoint pt, CSize size, double xScale ) {
- CFrameWnd * pFrame = GetTopLevelFrame();
- CreateBar( GetTitle(), size, pFrame );
- pFrame->FloatControlBar( m_pDockingBar, pt );
- m_pDockingBar->ShowBar( FALSE );
- reinterpret_cast<CEGDockingContext*>( m_pDockingBar->m_pDockContext )->StartDrag( pt, xScale, 0 );
- }
- void CEGDockingPane::AppendTab( CEGDockingPane* pPane ) {
- ASSERT( m_pDockingBar != NULL );
- m_pDockingBar->AddPane( pPane );
- }
- int CEGDockingPane::Width() {
- return m_pDockingBar->Width();
- }
- int CEGDockingPane::Height() {
- return m_pDockingBar->Height();
- }
- void CEGDockingPane::RestoreParent() {
- SetParent( m_pDockingBar );
- }
- void CEGDockingPane::RemoveFromBorder( CEGDockBorder * pBorder, BOOL bShow ) {
- ASSERT( pBorder != NULL );
- SetParent( m_pDockingBar );
- m_pDockingBar->ActivatePane( this );
- m_pDockingBar->RemoveFromBorder( pBorder, bShow );
- }
- void CEGDockingPane::OnKillFocus( NMHDR* pNMHDR, LRESULT* pResult ) {
- HWND hFocus = ::GetFocus();
- if ( hFocus && !::IsChild( hFocus, GetSafeHwnd() ) )
- GetParent()->PostMessage( WM_KILLFOCUS, (WPARAM)hFocus, 0 );
- }
- void CEGDockingPane::OnSetFocus( NMHDR* pNMHDR, LRESULT* pResult ) {
- GetParent()->PostMessage( WM_FOCUS_CHANGED, 0, 0 );
- }
- void CEGDockingPane::Show() {
- if ( m_pDockingBar->IsFlyOutMode() && m_bHidden ) {
- m_pDockingBar->m_pBorder->AddButton( DRAWBTNSTYLE_GROUP, this );
- m_bHidden = FALSE;
- //m_pDockingBar->m_pBorder->FlyOutPane( this );
- m_pDockingBar->GetTopLevelFrame()->RecalcLayout();
- } else if ( m_bHidden ) {
- m_bHidden = FALSE;
- m_pDockingBar->PostMessage( DM_PANESTATE_CHANGED, (WPARAM)this, 1 );
- }
- }
- void CEGDockingPane::Hide( BOOL bNotifyContainer ) {
- if ( m_pDockingBar->IsFlyOutMode() && !m_bHidden ) {
- m_pDockingBar->m_pBorder->FlyDownPane( this );
- m_pDockingBar->m_pBorder->RemoveButton( this );
- m_bHidden = TRUE;
- m_pDockingBar->GetTopLevelFrame()->DelayRecalcLayout();
- } else if ( !m_bHidden ) {
- m_bHidden = TRUE;
- if ( bNotifyContainer )
- m_pDockingBar->PostMessage( DM_PANESTATE_CHANGED, (WPARAM)this, 0 );
- }
- }
- void CEGDockingPane::ToggleVisible() {
- if ( !m_bHidden ) {
- Hide();
- } else {
- Show();
- }
- }
- BOOL CEGDockingPane::SetIcon( UINT nIDResource, HINSTANCE hInst ) {
- return m_bmpIcon.LoadBitmap( nIDResource, hInst );
- }
- BOOL CEGDockingPane::SetIcon( LPCTSTR lpszResourceName, HINSTANCE hInst ) {
- return m_bmpIcon.LoadBitmap( lpszResourceName, hInst );
- }
- /////////////////////////////////////////////////////////////////////////
- // CEGDockingControlPane
- CEGDockingControlPane::CEGDockingControlPane(void)
- {
- m_hWndControl = NULL;
- m_nID = 0;
- }
- CEGDockingControlPane::~CEGDockingControlPane(void)
- {
- }
- HWND CEGDockingControlPane::CreateControl() {
- return NULL;
- }
- BOOL CEGDockingControlPane::InitControl() {
- return TRUE;
- }
- BEGIN_MESSAGE_MAP(CEGDockingControlPane, CEGDockingPane)
- ON_WM_CREATE()
- ON_WM_SIZE()
- // ON_MESSAGE(WM_USER,OnKickIdle)
- END_MESSAGE_MAP()
- int CEGDockingControlPane::OnCreate( LPCREATESTRUCT lpCreateStruct ) {
- if( CEGDockingPane::OnCreate( lpCreateStruct) ) {
- TRACE0("Cannot create docking pane");
- return -1;
- }
- m_hWndControl = CreateControl();
- if ( !m_hWndControl ) {
- TRACE0("Cannot create docking control");
- return -1;
- }
- if ( !InitControl() ) {
- TRACE0("Cannot initialize docking control");
- return -1;
- }
- if ( 0 == m_nID )
- return 0;
- if (!m_wndToolBar.CreateEx(this, TBSTYLE_AUTOSIZE|TBSTYLE_FLAT|TBSTYLE_LIST, WS_CHILD | WS_VISIBLE | CBRS_TOP
- |CBRS_TOOLTIPS | CBRS_SIZE_DYNAMIC,CRect(1,1,1,1),AFX_IDW_TOOLBAR) ||
- !m_wndToolBar.LoadToolBar(m_nID))
- {
- TRACE0("Failed to create toolbarn");
- return -1; // fail to create
- }
- // Prevent the toolbarbutton to be too big after resizing TaskBar!
- for (int n=0;n<m_wndToolBar.GetCount();n++)
- {
- DWORD dwStyle = m_wndToolBar.GetButtonStyle(n);
- if( !(dwStyle&TBBS_SEPARATOR) )
- {
- m_wndToolBar.SetButtonStyle(n,dwStyle|TBBS_AUTOSIZE);
- }
- }
- // adjust border
- switch (CEGMenu::GetMenuDrawMode())
- {
- case CEGMenu::STYLE_COLORFUL_NOBORDER:
- case CEGMenu::STYLE_COLORFUL:
- case CEGMenu::STYLE_XP_2003_NOBORDER:
- case CEGMenu::STYLE_XP_2003:
- case CEGMenu::STYLE_ICY:
- case CEGMenu::STYLE_ICY_NOBORDER:
- m_wndToolBar.SetBorders(0,0,0,4);
- break;
- default:
- m_wndToolBar.SetBorders(0,0,0,0);
- break;
- }
- CRect rcClientStart;
- CRect rcClientNow;
- GetClientRect(rcClientStart);
- RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rcClientNow);
- // Set the icon for this dialog. The framework does this automatically
- CPoint ptoffset(rcClientNow.left - rcClientStart.left, rcClientNow.top - rcClientStart.top);
- CRect rcchild;
- CWnd* pwndchild = GetWindow(GW_CHILD);
- while (pwndchild)
- {
- pwndchild->GetWindowRect(rcchild);
- ScreenToClient(rcchild);
- rcchild.OffsetRect(ptoffset);
- pwndchild->MoveWindow(rcchild, FALSE);
- pwndchild = pwndchild->GetNextWindow();
- }
- // adjust the dialog window dimensions
- CRect rcwindow;
- GetWindowRect(rcwindow);
- rcwindow.right += rcClientStart.Width() - rcClientNow.Width();
- rcwindow.bottom += rcClientStart.Height() - rcClientNow.Height();
- MoveWindow(rcwindow, FALSE); // and position the control bars
- RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
- return 0;
- }
- void CEGDockingControlPane::OnSize( UINT nType, int cx, int cy ) {
- CEGDockingPane::OnSize( nType, cx, cy );
- if ( 0 != m_nID )
- RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
- if ( m_hWndControl ) {
- int nDelta = 0;
- if ( 0 != m_nID ) {
- CRect rc;
- m_wndToolBar.GetWindowRect( &rc );
- nDelta = rc.Height();
- }
- ::MoveWindow( m_hWndControl, 0, 0 + nDelta , cx, cy - nDelta, TRUE );
- }
- }
- void CEGDockingControlPane::SetResourceID( int nID ) {
- m_nID = nID;
- }
- class CToolCmdUI : public CCmdUI
- {
- virtual void Enable(BOOL bEnable)
- {
- ::SendMessage(m_pOther->GetSafeHwnd(), TB_ENABLEBUTTON, m_nID , MAKELPARAM(bEnable, 0));
- }
- virtual void SetCheck(int nCheck = 1)
- {
- ::SendMessage(m_pOther->GetSafeHwnd(), TB_CHECKBUTTON, m_nID, MAKELPARAM(nCheck, 0));
- }
- };
- /*LRESULT CEGDockingControlPane::OnKickIdle(WPARAM wp, LPARAM lp)
- {
- UNREFERENCED_PARAMETER(wp);
- UNREFERENCED_PARAMETER(lp);
- if ( 0 == m_nID ) return false;
- CToolCmdUI cmdUI;
- cmdUI.m_pOther = &m_wndToolBar;
- UINT indexMax = m_wndToolBar.GetToolBarCtrl().GetButtonCount();
- cmdUI.m_nIndexMax = indexMax;
- for (UINT i = 0; i < indexMax; i++)
- {
- if (m_wndToolBar.GetButtonStyle(i) & TBSTYLE_SEP)
- continue;
- cmdUI.m_nIndex = i;
- cmdUI.m_nID = m_wndToolBar.GetItemID(i);
- cmdUI.m_pMenu = NULL;
- cmdUI.DoUpdate(this,FALSE);
- }
- return false;
- //UpdateDialogControls(this,FALSE);
- //AfxCallWndProc(this, m_hWnd,WM_IDLEUPDATECMDUI, (WPARAM)TRUE, 0);
- //SendMessageToDescendants(WM_IDLEUPDATECMDUI,(WPARAM)TRUE, 0, TRUE, TRUE);
- //return 0;
- }
- */
- /////////////////////////////////////////////////////////////////////////
- // CEGToolBaredPane
- /*
- BEGIN_MESSAGE_MAP(CEGToolBaredPane, CEGDockingPane)
- ON_WM_CREATE()
- ON_WM_SIZE()
- ON_MESSAGE(WM_USER,OnKickIdle)
- END_MESSAGE_MAP()
- int CEGToolBaredPane::OnCreate( LPCREATESTRUCT lpCreateStruct ) {
- if( CEGDockingPane::OnCreate( lpCreateStruct) ) {
- TRACE0("Cannot create docking pane");
- return -1;
- }
- if ( 0 == m_nID )
- return 0;
- if (!m_wndToolBar.CreateEx(this, TBSTYLE_AUTOSIZE|TBSTYLE_FLAT|TBSTYLE_LIST, WS_CHILD | WS_VISIBLE | CBRS_TOP
- |CBRS_TOOLTIPS | CBRS_SIZE_DYNAMIC,CRect(1,1,1,1),AFX_IDW_TOOLBAR) ||
- !m_wndToolBar.LoadToolBar(m_nID))
- {
- TRACE0("Failed to create toolbarn");
- return -1; // fail to create
- }
- // Prevent the toolbarbutton to be too big after resizing TaskBar!
- for (int n=0;n<m_wndToolBar.GetCount();n++)
- {
- DWORD dwStyle = m_wndToolBar.GetButtonStyle(n);
- if( !(dwStyle&TBBS_SEPARATOR) )
- {
- m_wndToolBar.SetButtonStyle(n,dwStyle|TBBS_AUTOSIZE);
- }
- }
- // adjust border
- switch (CEGMenu::GetMenuDrawMode())
- {
- case CEGMenu::STYLE_COLORFUL_NOBORDER:
- case CEGMenu::STYLE_COLORFUL:
- case CEGMenu::STYLE_XP_2003_NOBORDER:
- case CEGMenu::STYLE_XP_2003:
- case CEGMenu::STYLE_ICY:
- case CEGMenu::STYLE_ICY_NOBORDER:
- m_wndToolBar.SetBorders(0,0,0,4);
- break;
- default:
- m_wndToolBar.SetBorders(0,0,0,0);
- break;
- }
- CRect rcClientStart;
- CRect rcClientNow;
- GetClientRect(rcClientStart);
- RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rcClientNow);
- // Set the icon for this dialog. The framework does this automatically
- CPoint ptoffset(rcClientNow.left - rcClientStart.left, rcClientNow.top - rcClientStart.top);
- CRect rcchild;
- CWnd* pwndchild = GetWindow(GW_CHILD);
- while (pwndchild)
- {
- pwndchild->GetWindowRect(rcchild);
- ScreenToClient(rcchild);
- rcchild.OffsetRect(ptoffset);
- pwndchild->MoveWindow(rcchild, FALSE);
- pwndchild = pwndchild->GetNextWindow();
- }
- // adjust the dialog window dimensions
- CRect rcwindow;
- GetWindowRect(rcwindow);
- rcwindow.right += rcClientStart.Width() - rcClientNow.Width();
- rcwindow.bottom += rcClientStart.Height() - rcClientNow.Height();
- MoveWindow(rcwindow, FALSE); // and position the control bars
- RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
- return 0;
- }
- void CEGToolBaredPane::OnSize( UINT nType, int cx, int cy ) {
- CEGDockingPane::OnSize( nType, cx, cy );
- if ( 0 != m_nID )
- RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
- }
- void CEGToolBaredPane::SetResourceID( int nID ) {
- m_nID = nID;
- }
- LRESULT CEGToolBaredPane::OnKickIdle(WPARAM wp, LPARAM lp)
- {
- UNREFERENCED_PARAMETER(wp);
- UNREFERENCED_PARAMETER(lp);
- if ( 0 == m_nID ) return false;
- CToolCmdUI cmdUI;
- cmdUI.m_pOther = &m_wndToolBar;
- UINT indexMax = m_wndToolBar.GetToolBarCtrl().GetButtonCount();
- cmdUI.m_nIndexMax = indexMax;
- for (UINT i = 0; i < indexMax; i++)
- {
- if (m_wndToolBar.GetButtonStyle(i) & TBSTYLE_SEP)
- continue;
- cmdUI.m_nIndex = i;
- cmdUI.m_nID = m_wndToolBar.GetItemID(i);
- cmdUI.m_pMenu = NULL;
- cmdUI.DoUpdate(this,FALSE);
- }
- return false;
- //UpdateDialogControls(this,FALSE);
- //AfxCallWndProc(this, m_hWnd,WM_IDLEUPDATECMDUI, (WPARAM)TRUE, 0);
- //SendMessageToDescendants(WM_IDLEUPDATECMDUI,(WPARAM)TRUE, 0, TRUE, TRUE);
- //return 0;
- }
- */
- /////////////////////////////////////////////////////////////////////////
- // CEGDockingBar
- IMPLEMENT_DYNAMIC(CEGDockingBar, CControlBar);
- CEGDockingBar::CEGDockingBar( CSize size )
- {
- m_szMinHorz = CSize(33, 32);
- m_szMinVert = CSize(33, 32);
- m_szMinFloat = CSize(37, 32);
- m_szHorz = size;
- m_szVert = size;
- m_szFloat = CSize( size.cx, size.cx );
- m_bTracking = FALSE;
- m_bKeepSize = FALSE;
- m_bParentSizing = FALSE;
- m_cxEdge = 4;
- m_bDragShowContent = FALSE;
- m_nDockBarID = 0;
- m_dwPaneStyle = 0;
- m_cyCaption = 16;
- m_cyTabs = 25;
- m_bActive = FALSE;
- m_bAutoHidePinned = FALSE;
- m_bClosePressed = FALSE;
- m_bCloseHover = FALSE;
- m_bPinPressed = FALSE;
- m_bPinHover = FALSE;
- m_pActivePane = NULL;
- m_bFlyOutMode = FALSE;
- m_pFrameWnd = NULL;
- m_bTabDrag = FALSE;
- m_pBorder = NULL;
- }
- CEGDockingBar::~CEGDockingBar()
- {
- }
- BEGIN_MESSAGE_MAP(CEGDockingBar, CControlBar)
- ON_WM_CREATE()
- ON_WM_DESTROY()
- ON_WM_TIMER()
- //ON_WM_PAINT()
- ON_WM_NCPAINT()
- ON_WM_NCCALCSIZE()
- ON_WM_WINDOWPOSCHANGING()
- ON_WM_CAPTURECHANGED()
- ON_WM_CANCELMODE()
- ON_WM_SETTINGCHANGE()
- ON_WM_LBUTTONUP()
- ON_WM_MOUSEMOVE()
- ON_WM_NCLBUTTONDOWN()
- ON_WM_NCLBUTTONUP()
- ON_WM_NCMOUSEMOVE()
- ON_WM_LBUTTONDOWN()
- ON_WM_LBUTTONDBLCLK()
- ON_WM_RBUTTONDOWN()
- ON_WM_NCHITTEST()
- ON_WM_CLOSE()
- ON_WM_SIZE()
- ON_MESSAGE( WM_SETTEXT, OnSetText )
- ON_MESSAGE( WM_NCMOUSELEAVE, OnNcMouseLeave )
- ON_MESSAGE( DM_PANESTATE_CHANGED, OnPaneStateChanged )
- END_MESSAGE_MAP()
- BOOL CEGDockingBar::Create(LPCTSTR lpszWindowName, UINT nIconID,
- CWnd* pParentWnd, UINT nID,
- DWORD dwStyle)
- {
- m_nIconID = nIconID;
- // must have a parent
- ASSERT_VALID(pParentWnd);
- // cannot be both fixed and dynamic
- // (CBRS_SIZE_DYNAMIC is used for resizng when floating)
- ASSERT (!((dwStyle & CBRS_SIZE_FIXED) &&
- (dwStyle & CBRS_SIZE_DYNAMIC)));
- m_dwStyle = dwStyle & CBRS_ALL; // save the control bar styles
- // register and create the window - skip CControlBar::Create()
- CString wndclass = ::AfxRegisterWndClass(CS_DBLCLKS,
- ::LoadCursor(NULL, IDC_ARROW),
- ::GetSysColorBrush(COLOR_BTNFACE), 0);
- dwStyle &= ~CBRS_ALL; // keep only the generic window styles
- dwStyle |= WS_CLIPCHILDREN; // prevents flashing
- if (!CWnd::Create(wndclass, lpszWindowName, dwStyle,
- CRect(0, 0, 0, 0), pParentWnd, nID))
- return FALSE;
- EnableDocking(CBRS_ALIGN_ANY);
- return TRUE;
- }
- /////////////////////////////////////////////////////////////////////////
- // CEGDockingBar attributes
- DockType CEGDockingBar::GetDropTarget( CPoint ptScreen, CEGDockingPane ** ppPane ) {
- *ppPane = NULL;
- CRect rcWindow;
- GetWindowRect( &rcWindow );
- if ( !rcWindow.PtInRect( ptScreen ) )
- return dctOutOfBorders;
- if ( IsFloating() ) {
- *ppPane = m_pActivePane;
- return dctTab;
- }
- CPoint pt = ptScreen;
- ScreenToClient( &pt );
- CRect rcActivePane;
- m_pActivePane->GetWindowRect( &rcActivePane );
- ScreenToClient( rcActivePane );
- *ppPane = m_pActivePane;
- if ( !rcActivePane.PtInRect( pt ) )
- return dctTab;
- return (*ppPane)->GetDropTarget( pt );
- }
- CRect CEGDockingBar::GetDropRect( DockType nDockType ) {
- CRect rc;
- GetWindowRect( &rc ); // default for dctTab
- switch ( nDockType ) {
- case dctTop:
- rc.bottom = rc.top + min( rc.Height(), m_cyCaption * 2 );
- break;
- case dctBottom:
- rc.top = rc.bottom - min( rc.Height(), m_cyCaption * 2 );
- break;
- case dctLeft:
- rc.right = rc.left + min( rc.Width(), m_cyCaption * 2 );
- break;
- case dctRight:
- rc.left = rc.right - min( rc.Width(), m_cyCaption * 2 );
- break;
- }
- return rc;
- }
- /////////////////////////////////////////////////////////////////////////
- // CEGDockingBar operations
- void CEGDockingBar::EnableDocking(DWORD dwDockStyle)
- {
- // must be CBRS_ALIGN_XXX or CBRS_FLOAT_MULTI only
- ASSERT((dwDockStyle & ~(CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI)) == 0);
- // cannot have the CBRS_FLOAT_MULTI style
- ASSERT((dwDockStyle & CBRS_FLOAT_MULTI) == 0);
- // the bar must have CBRS_SIZE_DYNAMIC style
- ASSERT((m_dwStyle & CBRS_SIZE_DYNAMIC) != 0);
- m_dwDockStyle = dwDockStyle;
- if (m_pDockContext == NULL)
- m_pDockContext = new CEGDockingContext(this);
- // permanently wire the bar's owner to its current parent
- if (m_hWndOwner == NULL)
- m_hWndOwner = ::GetParent(m_hWnd);
- }
- /////////////////////////////////////////////////////////////////////////
- // CEGDockingBar message handlers
- int CEGDockingBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CControlBar::OnCreate(lpCreateStruct) == -1)
- return -1;
- // query SPI_GETDRAGFULLWINDOWS system parameter
- // OnSettingChange() will update m_bDragShowContent
- m_bDragShowContent = FALSE;
- ::SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0,
- &m_bDragShowContent, 0);
- // Caption height
- m_cyCaption = ::GetSystemMetrics(SM_CYSMCAPTION);
- // uncomment this line if you want raised borders
- //m_dwPaneStyle |= DPS_SHOWEDGES;
- SetPaneStyle(m_dwPaneStyle|DPS_SIZECHILD);
- // m_tabs.Create( NULL, NULL, WS_CHILD | FTS_ALIGN_BOTTOM, CRect(0,0,0,0), this, 0, NULL );
- m_nTimer = (UINT)SetTimer( 1, 250, NULL );
- return 0;
- }
- void CEGDockingBar::OnDestroy() {
- KillTimer( m_nTimer );
- }
- LRESULT CEGDockingBar::OnSetText(WPARAM wParam, LPARAM lParam)
- {
- UNUSED_ALWAYS(wParam);
- LRESULT lResult = CWnd::Default();
- CFrameWnd * pFrame = GetParentFrame();
- if (IsFloating() && pFrame && pFrame->IsKindOf(RUNTIME_CLASS(CMiniDockFrameWnd)))
- {
- pFrame->SetWindowText( (LPCTSTR) lParam); // update dockbar
- pFrame->DelayRecalcLayout(); // refresh miniframe
- }
- return lResult;
- }
- const BOOL CEGDockingBar::IsFloating() const
- {
- return !IsHorzDocked() && !IsVertDocked();
- }
- const BOOL CEGDockingBar::IsHorzDocked() const
- {
- return (m_nDockBarID == AFX_IDW_DOCKBAR_TOP ||
- m_nDockBarID == AFX_IDW_DOCKBAR_BOTTOM);
- }
- const BOOL CEGDockingBar::IsVertDocked() const
- {
- return (m_nDockBarID == AFX_IDW_DOCKBAR_LEFT ||
- m_nDockBarID == AFX_IDW_DOCKBAR_RIGHT);
- }
- const BOOL CEGDockingBar::IsSideTracking() const
- {
- // don't call this when not tracking
- ASSERT(m_bTracking && !IsFloating());
- return (m_htEdge == HTLEFT || m_htEdge == HTRIGHT) ?
- IsHorzDocked() : IsVertDocked();
- }
- CSize CEGDockingBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
- {
- if (bStretch) // the bar is stretched (is not the child of a dockbar)
- if (bHorz)
- return CSize(32767, m_szHorz.cy);
- else
- return CSize(m_szVert.cx, 32767);
- // dirty cast - we need access to protected CDockBar members
- CEGDockSite* pDockBar = reinterpret_cast<CEGDockSite*>( m_pDockBar );
- // force imediate RecalcDelayShow() for all sizing bars on the row
- // with delayShow/delayHide flags set to avoid IsVisible() problems
- CDPArray arrSCBars;
- GetRowSizingBars(arrSCBars);
- AFX_SIZEPARENTPARAMS layout;
- layout.hDWP = pDockBar->m_bLayoutQuery ?
- NULL : ::BeginDeferWindowPos(int(arrSCBars.GetSize()));
- for (INT_PTR i = 0; i < arrSCBars.GetSize(); i++)
- if (arrSCBars[i]->m_nStateFlags & (delayHide|delayShow))
- arrSCBars[i]->RecalcDelayShow(&layout);
- if (layout.hDWP != NULL)
- ::EndDeferWindowPos(layout.hDWP);
- // get available length
- CRect rc = pDockBar->m_rectLayout;
- if (rc.IsRectEmpty())
- m_pDockSite->GetClientRect(&rc);
- int nLengthTotal = bHorz ? rc.Width() + 2 : rc.Height() - 2;
- if (IsVisible() && !IsFloating() &&
- m_bParentSizing && arrSCBars[0] == this)
- if (NegotiateSpace(nLengthTotal, (bHorz != FALSE)))
- AlignControlBars();
- m_bParentSizing = FALSE;
- if (bHorz)
- return CSize(max(m_szMinHorz.cx, m_szHorz.cx),
- max(m_szMinHorz.cy, m_szHorz.cy));
- return CSize(max(m_szMinVert.cx, m_szVert.cx),
- max(m_szMinVert.cy, m_szVert.cy));
- }
- CSize CEGDockingBar::CalcDynamicLayout(int nLength, DWORD dwMode)
- {
- if (dwMode & (LM_HORZDOCK | LM_VERTDOCK)) // docked ?
- {
- if (nLength == -1)
- m_bParentSizing = TRUE;
- return CControlBar::CalcDynamicLayout(nLength, dwMode);
- }
- if (dwMode & LM_MRUWIDTH) return m_szFloat;
- if (dwMode & LM_COMMIT) return m_szFloat; // already committed
- // check for dialgonal resizing hit test
- int nHitTest = m_pDockContext->m_nHitTest;
- if (IsFloating() &&
- (nHitTest == HTTOPLEFT || nHitTest == HTBOTTOMLEFT ||
- nHitTest == HTTOPRIGHT || nHitTest == HTBOTTOMRIGHT))
- {
- CPoint ptCursor;
- ::GetCursorPos(&ptCursor);
- CRect rFrame, rBar;
- GetParentFrame()->GetWindowRect(&rFrame);
- GetWindowRect(&rBar);
- if (nHitTest == HTTOPLEFT || nHitTest == HTBOTTOMLEFT)
- {
- m_szFloat.cx = rFrame.left + rBar.Width() - ptCursor.x;
- m_pDockContext->m_rectFrameDragHorz.left =
- min(ptCursor.x, rFrame.left + rBar.Width() - m_szMinFloat.cx);
- }
- if (nHitTest == HTTOPLEFT || nHitTest == HTTOPRIGHT)
- {
- m_szFloat.cy = rFrame.top + rBar.Height() - ptCursor.y;
- m_pDockContext->m_rectFrameDragHorz.top =
- min(ptCursor.y, rFrame.top + rBar.Height() - m_szMinFloat.cy);
- }
- if (nHitTest == HTTOPRIGHT || nHitTest == HTBOTTOMRIGHT)
- m_szFloat.cx = rBar.Width() + ptCursor.x - rFrame.right;
- if (nHitTest == HTBOTTOMLEFT || nHitTest == HTBOTTOMRIGHT)
- m_szFloat.cy = rBar.Height() + ptCursor.y - rFrame.bottom;
- }
- else
- ((dwMode & LM_LENGTHY) ? m_szFloat.cy : m_szFloat.cx) = nLength;
- m_szFloat.cx = max(m_szFloat.cx, m_szMinFloat.cx);
- m_szFloat.cy = max(m_szFloat.cy, m_szMinFloat.cy);
- return m_szFloat;
- }
- void CEGDockingBar::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
- {
- // force non-client recalc if moved or resized
- lpwndpos->flags |= SWP_FRAMECHANGED;
- CControlBar::OnWindowPosChanging(lpwndpos);
- // find on which side are we docked
- m_nDockBarID = GetParent()->GetDlgCtrlID();
- if (!IsFloating())
- if (lpwndpos->flags & SWP_SHOWWINDOW)
- m_bKeepSize = TRUE;
- }
- /////////////////////////////////////////////////////////////////////////
- // Mouse Handling
- //
- void CEGDockingBar::OnLButtonDown(UINT nFlags, CPoint point)
- {
- HWND hActiveWnd = ::GetFocus();
- if ( hActiveWnd && hActiveWnd != m_hWnd && !::IsChild( m_hWnd, hActiveWnd ) ) {
- if ( !m_pActivePane ) {
- ::SetFocus( m_hWnd );
- } else {
- HWND hChild = ::GetWindow( m_pActivePane->GetSafeHwnd(), GW_CHILD );
- ::SetFocus( hChild != NULL ? hChild : m_hWnd );
- }
- }
- if ( point.y < 0 && -point.y < m_cyCaption ) {
- if ( m_rcClose.PtInRect( point ) ) {
- SetCapture();
- m_bClosePressed = TRUE;
- RePaint();
- } else if ( m_rcPin.PtInRect( point ) ) {
- SetCapture();
- m_bPinPressed = TRUE;
- RePaint();
- }
- }
- CWnd::OnLButtonDown(nFlags, point);
- }
- void CEGDockingBar::OnLButtonDblClk(UINT nFlags, CPoint point)
- {
- if (m_pDockBar != NULL)
- {
- // not a buttons?
- if ( !m_rcClose.PtInRect( point ) && !m_rcPin.PtInRect( point ) ) {
- // toggle docking
- ASSERT(m_pDockContext != NULL);
- m_pDockContext->ToggleDocking();
- TRACE0("CEGDockingBar::OnLButtonDblClkrn");
- }
- }
- else {
- TRACE0("CEGDockingBar::OnLButtonDblClk - CWnd::OnLButtonDblClkrn");
- CWnd::OnLButtonDblClk(nFlags, point);
- }
- }
- void CEGDockingBar::OnNcLButtonDown(UINT nHitTest, CPoint point)
- {
- UNUSED_ALWAYS(point);
- if (m_bTracking /* || IsFloating() */ )
- return;
- CPoint ptScreen( point );
- ScreenToClient( &point );
- point.y -= m_cxEdge;
- if ((nHitTest >= HTSIZEFIRST) && (nHitTest <= HTSIZELAST)) {
- StartTracking(nHitTest, ptScreen); // sizing edge hit
- } else if ( point.y >= m_rcClient.Height() && point.y <= m_rcClient.Height() + m_cyTabs ) {
- CEGDockingTabBtnsIt it = find_if( m_lstTabButtons.begin(), m_lstTabButtons.end(), HotPaneButton( point.x ) );
- if ( it != m_lstTabButtons.end() && !it->m_pPane->IsHidden() ) {
- ActivatePane( it->m_pPane );
- m_bTabDrag = TRUE;
- m_nTabDragStart = point.x;
- // 狸蜩忤痼屐 蝠