// 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 /***************************************************************************/