windows-nt/Source/XPSP1/NT/shell/osshell/accesory/mspaint/docking.cpp
2020-09-26 16:20:57 +08:00

187 lines
4.4 KiB
C++

// docking.cpp : implementation of the CDocking class
//
#include "stdafx.h"
#include "pbrush.h"
#include "pbrusfrm.h"
#include "pbrusvw.h"
#include "minifwnd.h"
#include "imgwell.h"
#include "toolbox.h"
#include "imgcolor.h"
#include "docking.h"
#ifdef _DEBUG
#undef THIS_FILE
static CHAR BASED_CODE THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNAMIC( CDocking, CObject )
#include "memtrace.h"
/***************************************************************************/
// CDocking implementation
CDocking::CDocking()
{
m_bStarted = FALSE;
m_bDocking = FALSE;
m_iDockingX = ::GetSystemMetrics( SM_CXICON );
m_iDockingY = ::GetSystemMetrics( SM_CYICON );
m_iDockingX += m_iDockingX / 2;
m_iDockingY += m_iDockingY / 2;
}
/***************************************************************************/
BOOL CDocking::Create( CPoint ptDrop, CRect& rectCurrent, BOOL bDocked, CPBView::DOCKERS tool )
{
ASSERT( ! m_bStarted );
m_Tool = tool;
m_bDocked = bDocked;
m_ptLast = ptDrop;
m_bDocking = ! bDocked;
CRect rectTool;
CRect rect = rectCurrent;
CSize size = rectCurrent.Size();
if (bDocked)
{
switch (tool)
{
case CPBView::toolbox:
case CPBView::colorbox:
rect.InflateRect( theApp.m_cxBorder, theApp.m_cyBorder );
break;
}
rect.bottom += theApp.m_cyCaption;
m_rectDocked = rectCurrent;
m_rectFree = rect;
}
else
{
switch (tool)
{
case CPBView::toolbox:
g_pImgToolWnd->GetWindowRect( &rectTool );
rect.right = rect.left + rectTool.Width();
rect.bottom = rect.top + rectTool.Height();
break;
case CPBView::colorbox:
g_pImgColorsWnd->GetWindowRect( &rectTool );
rect.right = rect.left + rectTool.Width();
rect.bottom = rect.top + rectTool.Height();
break;
}
m_rectDocked = rect;
m_rectFree = rectCurrent;
}
CPBView* pView = (CPBView*)(((CFrameWnd*)AfxGetMainWnd())->GetActiveView());
ASSERT( pView != NULL );
if (pView != NULL && pView->IsKindOf( RUNTIME_CLASS( CPBView ) ))
{
m_ptDocking = pView->GetDockedPos( tool, size );
m_bStarted = DrawFocusRect();
m_rectDockingPort.SetRect( m_ptDocking.x - m_iDockingX,
m_ptDocking.y - m_iDockingY,
m_ptDocking.x + m_iDockingX,
m_ptDocking.y + m_iDockingY );
}
return m_bStarted;
}
/***************************************************************************/
BOOL CDocking::Move( CPoint ptNew, CRect& rectFrame )
{
Move( ptNew );
rectFrame = m_bDocked? m_rectDocked: m_rectFree;
return m_bDocked;
}
/***************************************************************************/
void CDocking::Move( CPoint ptNew )
{
ASSERT( m_bStarted );
if (DrawFocusRect())
{
CPoint pt = ptNew - m_ptLast;
m_rectDocked.OffsetRect( pt );
m_rectFree.OffsetRect( pt );
pt = m_bDocked? m_rectDocked.TopLeft(): m_rectFree.TopLeft();
m_bDocked = m_rectDockingPort.PtInRect( pt );
m_ptLast = ptNew;
DrawFocusRect();
}
}
/***************************************************************************/
BOOL CDocking::Clear( CRect* prectLast )
{
ASSERT( m_bStarted );
DrawFocusRect();
m_bStarted = FALSE;
if (prectLast)
*prectLast = m_bDocked? m_rectDocked: m_rectFree;
if (!m_bDocked)
{
CPBView* pView = (CPBView*)(((CFrameWnd*)AfxGetMainWnd())->GetActiveView());
if (pView != NULL && pView->IsKindOf( RUNTIME_CLASS( CPBView ) ))
pView->SetFloatPos( m_Tool, m_rectFree );
}
return m_bDocked;
}
/***************************************************************************/
BOOL CDocking::DrawFocusRect()
{
if (m_bDocking)
return TRUE;
BOOL bReturn = FALSE;
HDC hdc = ::GetDC( NULL );
if (hdc)
{
::DrawFocusRect( hdc, (m_bDocked? &m_rectDocked: &m_rectFree) );
::ReleaseDC( NULL, hdc );
bReturn = TRUE;
}
return bReturn;
}
/***************************************************************************/