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

362 lines
9.5 KiB
C++

// srvritem.cpp : implementation of the CPBSrvrItem class
//
#include "stdafx.h"
#include "pbrush.h"
#include "pbrusdoc.h"
#include "pbrusfrm.h"
#include "pbrusvw.h"
#include "srvritem.h"
#include "bmobject.h"
#include "docking.h"
#include "minifwnd.h"
#include "imgwnd.h"
#include "imgsuprt.h"
#include "imgcolor.h"
#include "tracker.h"
#ifdef _DEBUG
#undef THIS_FILE
static CHAR BASED_CODE THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNAMIC(CPBSrvrItem, COleServerItem)
#include "memtrace.h"
/***************************************************************************/
// CPBSrvrItem implementation
CPBSrvrItem::CPBSrvrItem( CPBDoc* pContainerDoc, CBitmapObj* pBM )
: COleServerItem( pContainerDoc, TRUE )
{
if (pBM)
{
m_pBitmapObj = pBM;
}
else
{
pBM = pContainerDoc->m_pBitmapObj;
m_pBitmapObj = NULL;
}
if (pBM && pBM->m_pImg)
{
COleDataSource* oleDataSrc = GetDataSource();
// support CF_DIB format
oleDataSrc->DelayRenderFileData( CF_DIB );
oleDataSrc->DelayRenderData( CF_BITMAP );
if (pBM->m_pImg->m_pPalette != NULL)
{
oleDataSrc->DelayRenderData( CF_PALETTE );
}
}
}
/***************************************************************************/
CPBSrvrItem::~CPBSrvrItem()
{
// TODO: add cleanup code here
if (m_pBitmapObj)
{
delete m_pBitmapObj;
}
}
/***************************************************************************/
void CPBSrvrItem::Serialize(CArchive& ar)
{
// CPBSrvrItem::Serialize will be called by the framework if
// the item is copied to the clipboard. This can happen automatically
// through the OLE callback OnGetClipboardData. A good default for
// the embedded item is simply to delegate to the document's Serialize
// function. If you support links, then you will want to serialize
// just a portion of the document.
// IsLinkedItem always returns TRUE even though we don't support links,
// so I am just removing the check
// if (! IsLinkedItem())
{
CPBDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CBitmapObj* pBMCur = m_pBitmapObj ? m_pBitmapObj : pDoc->m_pBitmapObj;
CBitmapObj* pBMNew = m_pBitmapObj ? m_pBitmapObj : pDoc->m_pBitmapObjNew;
pDoc->SerializeBitmap( ar, pBMCur, pBMNew, TRUE );
}
}
/***************************************************************************/
BOOL CPBSrvrItem::OnGetExtent(DVASPECT dwDrawAspect, CSize& rSize)
{
// Most applications, like this one, only handle drawing the content
// aspect of the item. If you wish to support other aspects, such
// as DVASPECT_THUMBNAIL (by overriding OnDrawEx), then this
// implementation of OnGetExtent should be modified to handle the
// additional aspect(s).
if (dwDrawAspect != DVASPECT_CONTENT)
return COleServerItem::OnGetExtent(dwDrawAspect, rSize);
// CPBSrvrItem::OnGetExtent is called to get the extent in
// HIMETRIC units of the entire item. The default implementation
// here simply returns a hard-coded number of units.
CPBDoc* pDoc = GetDocument();
ASSERT_VALID( pDoc );
CBitmapObj* pBM = m_pBitmapObj ? m_pBitmapObj : pDoc->m_pBitmapObj;
if (pBM != NULL
&& pBM->m_pImg != NULL)
{
//
// What was the padding for?
//
rSize.cx = pBM->m_pImg->cxWidth ;// + GetSystemMetrics( SM_CXBORDER ) + CTracker::HANDLE_SIZE * 2;
rSize.cy = pBM->m_pImg->cyHeight;// + GetSystemMetrics( SM_CYBORDER ) + CTracker::HANDLE_SIZE * 2;
CDC* pDC = CDC::FromHandle( pBM->m_pImg->hDC );
if (pDC != NULL)
{
pDC->DPtoHIMETRIC( &rSize );
}
else /* punt */
{
rSize.cx = (int)(((long)rSize.cx * 10000L) / (long)theApp.ScreenDeviceInfo.ixPelsPerDM);
rSize.cy = (int)(((long)rSize.cy * 10000L) / (long)theApp.ScreenDeviceInfo.iyPelsPerDM);
}
}
else
rSize = CSize( 3000, 3000 );
return TRUE;
}
/***************************************************************************/
BOOL CPBSrvrItem::OnSetExtent( DVASPECT nDrawAspect, const CSize& size )
{
TRACE( TEXT("MSPaint OnSetExtent %d %d\n"), size.cx, size.cy );
return COleServerItem::OnSetExtent( nDrawAspect, size );
}
/***************************************************************************/
void CPBSrvrItem::OnOpen()
{
CPBDoc* pDoc = (CPBDoc*)GetDocument();
if (theApp.m_bLinked)
{
theApp.m_bHidden = FALSE;
if (g_pDragBrushWnd != NULL)
HideBrush();
g_pDragBrushWnd = NULL;
g_pMouseImgWnd = NULL;
fDraggingBrush = FALSE;
POSITION pos = pDoc->GetFirstViewPosition();
CPBView* pView = (CPBView*)(pDoc->GetNextView( pos ));
if (pView != NULL)
{
pView->SetTools();
}
}
COleServerItem::OnOpen();
}
/***************************************************************************/
void CPBSrvrItem::OnShow()
{
theApp.m_bHidden = FALSE;
COleServerItem::OnShow();
}
/***************************************************************************/
void CPBSrvrItem::OnHide()
{
theApp.m_bHidden = TRUE;
g_pMouseImgWnd = NULL;
if (g_pDragBrushWnd != NULL)
HideBrush();
COleServerItem::OnHide();
}
/***************************************************************************/
BOOL CPBSrvrItem::OnDraw(CDC* pDC, CSize& rSize)
{
CPBDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CBitmapObj* pBM = m_pBitmapObj ? m_pBitmapObj : pDoc->m_pBitmapObj;
if (pBM != NULL)
{
CDC* pDCBitmap = CDC::FromHandle( pBM->m_pImg->hDC );
if (pDCBitmap != NULL)
{
CSize size( pBM->m_pImg->cxWidth,
pBM->m_pImg->cyHeight );
size.cy = -size.cy;
pDC->SetMapMode ( MM_ANISOTROPIC );
pDC->SetWindowExt( size );
pDC->SetWindowOrg( 0, 0 );
CPalette* ppalOld = NULL;
if (pBM->m_pImg->m_pPalette != NULL)
{
ppalOld = pDC->SelectPalette( pBM->m_pImg->m_pPalette, FALSE ); // Background ??
pDC->RealizePalette();
}
pDC->StretchBlt( 0, 0, size.cx, size.cy, pDCBitmap,
0, 0, pBM->m_pImg->cxWidth,
pBM->m_pImg->cyHeight, SRCCOPY );
if (pBM->m_pImg->m_pPalette != NULL)
pDC->SelectPalette( ppalOld, FALSE ); // Background ??
}
}
return TRUE;
}
/***************************************************************************/
COleDataSource* CPBSrvrItem::OnGetClipboardData( BOOL bIncludeLink,
CPoint* pptOffset,
CSize *pSize )
{
ASSERT_VALID( this );
COleDataSource* pDataSource = new COleDataSource;
TRY
{
GetClipboardData( pDataSource, bIncludeLink, pptOffset, pSize );
}
CATCH_ALL( e )
{
delete pDataSource;
THROW_LAST();
}
END_CATCH_ALL
ASSERT_VALID( pDataSource );
return pDataSource;
}
/***************************************************************************/
BOOL CPBSrvrItem::OnRenderGlobalData( LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal )
{
ASSERT( lpFormatEtc != NULL );
BOOL bResult = FALSE;
CPBDoc* pDoc = GetDocument();
ASSERT_VALID( pDoc );
CBitmapObj* pBM = m_pBitmapObj ? m_pBitmapObj : pDoc->m_pBitmapObj;
if ((lpFormatEtc->cfFormat == CF_BITMAP
|| lpFormatEtc->cfFormat == CF_PALETTE)
&& pBM != NULL)
{
if (lpFormatEtc->cfFormat == CF_BITMAP)
{
}
else // CF_PALETTE
{
}
}
else
bResult = COleServerItem::OnRenderGlobalData( lpFormatEtc, phGlobal );
return bResult;
}
/***************************************************************************/
BOOL CPBSrvrItem::OnRenderFileData( LPFORMATETC lpFormatEtc, CFile* pFile )
{
ASSERT( lpFormatEtc != NULL );
BOOL bResult = FALSE;
CPBDoc* pDoc = GetDocument();
ASSERT_VALID( pDoc );
CBitmapObj* pBM = m_pBitmapObj ? m_pBitmapObj : pDoc->m_pBitmapObj;
if (lpFormatEtc->cfFormat == CF_DIB && pBM != NULL)
{
TRY
{
// save as dib
pBM->SaveResource( FALSE );
pBM->WriteResource( pFile, CBitmapObj::rtDIB );
bResult = TRUE;
}
CATCH( CFileException, ex )
{
theApp.SetFileError( IDS_ERROR_SAVE, ex->m_cause );
return FALSE;
}
END_CATCH
}
else
bResult = COleServerItem::OnRenderFileData( lpFormatEtc, pFile );
return bResult;
}
/***************************************************************************/
// CPBSrvrItem diagnostics
#ifdef _DEBUG
void CPBSrvrItem::AssertValid() const
{
COleServerItem::AssertValid();
}
/***************************************************************************/
void CPBSrvrItem::Dump(CDumpContext& dc) const
{
COleServerItem::Dump(dc);
}
#endif
/***************************************************************************/