362 lines
9.5 KiB
C++
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
|
||
|
|
||
|
/***************************************************************************/
|