/*
* RENDER.CPP
* Data Object Chapter 10
*
* CDataObject::Render* functions to create text, bitmaps, and
* metafiles in a variety of sizes.
*
* Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
*
* Kraig Brockschmidt, Microsoft
* Internet : kraigb@microsoft.com
* Compuserve: >INTERNET:kraigb@microsoft.com
*/
#include "dataobj.h"
#include <string.h>
/*
* CDataObject::RenderText
*
* Purpose:
* Creates a global memory block containing the letter 'k' of sizes
* of 64 bytes, 1024 bytes, and 16384 bytes, into a caller-supplied
* STGMEDIUM.
*
* Parameters:
* pSTM LPSTGMEDIUM in which to render.
*
* Return Value:
* HRESULT Return value for GetData
*/
HRESULT CDataObject::RenderText(LPSTGMEDIUM pSTM)
{
DWORD cch;
HGLOBAL hMem;
LPTSTR psz;
UINT i;
//Get the size of data we're dealing with
switch (m_iSize)
{
case DOSIZE_SMALL:
cch=CCHTEXTSMALL;
break;
case DOSIZE_MEDIUM:
cch=CCHTEXTMEDIUM;
break;
case DOSIZE_LARGE:
cch=CCHTEXTLARGE;
break;
default:
return ResultFromScode(E_FAIL);
}
hMem=GlobalAlloc(GMEM_SHARE | GMEM_MOVEABLE, cch*sizeof(TCHAR));
if (NULL==hMem)
return ResultFromScode(STG_E_MEDIUMFULL);
psz=(LPTSTR)GlobalLock(hMem);
for (i=0; i < cch-1; i++)
*(psz+i)=TEXT(' ') + (i % 32);
*(psz+i)=0;
GlobalUnlock(hMem);
pSTM->hGlobal=hMem;
pSTM->tymed=TYMED_HGLOBAL;
pSTM->pUnkForRelease=NULL;
return NOERROR;
}
/*
* CDataObject::RenderBitmap
*
* Purpose:
* Creates a new bitmap into which we copy a bitmap loaded
* from our resources.
*
* Parameters:
* pSTM LPSTGMEDIUM in which to render.
*
* Return Value:
* HRESULT Return value for GetData
*/
HRESULT CDataObject::RenderBitmap(LPSTGMEDIUM pSTM)
{
HBITMAP hBmp, hBmpT;
UINT cxy;
HDC hDC, hDCSrc, hDCDst;
//Get the size of bitmap we're dealing with
switch (m_iSize)
{
case DOSIZE_SMALL:
cxy=CXYBITMAPSMALL;
break;
case DOSIZE_MEDIUM:
cxy=CXYBITMAPMEDIUM;
break;
case DOSIZE_LARGE:
cxy=CXYBITMAPLARGE;
break;
default:
return ResultFromScode(E_FAIL);
}
//Get two memory DCs between which to BitBlt.
hDC=GetDC(NULL);
hDCSrc=CreateCompatibleDC(hDC);
hDCDst=CreateCompatibleDC(hDC);
ReleaseDC(NULL, hDC);
if (NULL==hDCSrc || NULL==hDCDst)
{
if (NULL!=hDCDst)
DeleteDC(hDCDst);
if (NULL!=hDCSrc)
DeleteDC(hDCSrc);
return ResultFromScode(STG_E_MEDIUMFULL);
}
SelectObject(hDCSrc, m_rghBmp[m_iSize-DOSIZE_SMALL]);
hBmp=CreateCompatibleBitmap(hDCSrc, cxy, cxy);
if (NULL==hBmp)
{
DeleteDC(hDCDst);
DeleteDC(hDCSrc);
return ResultFromScode(STG_E_MEDIUMFULL);
}
//Copy from the source to destination
hBmpT=(HBITMAP)SelectObject(hDCDst, hBmp);
BitBlt(hDCDst, 0, 0, cxy, cxy, hDCSrc, 0, 0, SRCCOPY);
SelectObject(hDCDst, hBmpT);
DeleteDC(hDCDst);
DeleteDC(hDCSrc);
pSTM->hGlobal=(HGLOBAL)hBmp;
pSTM->tymed=TYMED_GDI;
pSTM->pUnkForRelease=NULL;
return NOERROR;
}
/*
* CDataObject::RenderMetafilePict
*
* Purpose:
* Creates a metafile containing blue shaded bands.
*
* Parameters:
* pSTM LPSTGMEDIUM in which to render.
*
* Return Value:
* HRESULT Return value for GetData
*/
HRESULT CDataObject::RenderMetafilePict(LPSTGMEDIUM pSTM)
{
HDC hDC;
HGLOBAL hMem;
HMETAFILE hMF;
LPMETAFILEPICT pMF;
HBRUSH hBrush;
HGDIOBJ hBrT;
UINT cRec;
int x, y, dxy;
RECT rc;
switch (m_iSize)
{
case DOSIZE_SMALL:
cRec=CRECMETAFILESMALL;
break;
case DOSIZE_MEDIUM:
cRec=CRECMETAFILEMEDIUM;
break;
case DOSIZE_LARGE:
cRec=CRECMETAFILELARGE;
break;
default:
return ResultFromScode(E_FAIL);
}
hDC=(HDC)CreateMetaFile(NULL);
if (NULL!=hDC)
{
/*
* Draw something into the metafile. For this object we
* draw some number of rectangles equal to the number of
* records we want. So take the square root of the number
* of records and iterate over that number in both x & y.
*/
dxy=(int)1024/cRec;
//This creates a blue shading from light to dark
for (y=1024; y >=0; y-=dxy)
{
hBrush=CreateSolidBrush(RGB(0, 0, (1024-y)/4));
hBrT=SelectObject(hDC, (HGDIOBJ)hBrush);
for (x=0; x < 1024; x+=dxy)
{
SetRect(&rc, x, y, x+dxy, y+dxy);
FillRect(hDC, &rc, hBrush);
}
SelectObject(hDC, hBrT);
DeleteObject(hBrush);
}
hMF=CloseMetaFile(hDC);
}
if (NULL==hMF)
return ResultFromScode(STG_E_MEDIUMFULL);
//Allocate the METAFILEPICT structure.
hMem=GlobalAlloc(GMEM_SHARE | GMEM_MOVEABLE
, sizeof(METAFILEPICT));
if (NULL==hMem)
{
DeleteMetaFile(hMF);
return ResultFromScode(STG_E_MEDIUMFULL);
}
pMF=(LPMETAFILEPICT)GlobalLock(hMem);
pMF->hMF=hMF;
pMF->mm=MM_ANISOTROPIC;
pMF->xExt=1024;
pMF->yExt=1024;
GlobalUnlock(hMem);
pSTM->hGlobal=hMem;
pSTM->tymed=TYMED_MFPICT;
pSTM->pUnkForRelease=NULL;
return NOERROR;
}