Files
core/ASCImageStudio3/ASCGraphics/Objects/Image/EmfFile.h
Elen.Subbotina 70e623d70b восстановление
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@62634 954022d7-b5bf-4e40-9824-e11837661b57
2016-05-21 00:05:02 +03:00

101 lines
1.9 KiB
C++

#pragma once
#include "EMFInterpreter.h"
#include "..\..\Objects\ASCFontManager.h"
#include "TemporaryCS.h"
class CEMFFile
{
public:
CRITICAL_SECTION m_oCS;
CEMFInterpreter m_oEMF;
HENHMETAFILE m_hEmf;
HDC m_memDC;
LONG m_lObjects;
public:
CEMFFile()
{
m_hEmf = NULL;
m_memDC = NULL;
m_lObjects = 0;
InitializeCriticalSection(&m_oCS);
}
~CEMFFile()
{
DeleteCriticalSection(&m_oCS);
}
inline void SetFontManager(IASCFontManager* pManager)
{
m_oEMF.SetFontManager(pManager);
}
void Open(BSTR bsFileName)
{
HDC hDC = GetDC(NULL);
m_memDC = CreateCompatibleDC(hDC);
ReleaseDC(NULL, hDC);
m_hEmf = GetEnhMetaFile(bsFileName);
ENHMETAHEADER EmfHeader;
if (::GetEnhMetaFileHeader(m_hEmf, sizeof(ENHMETAHEADER), &EmfHeader))
{
m_lObjects = EmfHeader.nHandles;
}
m_oEMF.Init(m_memDC, (UINT)m_lObjects);
}
void Close()
{
m_oEMF.SetRenderer(NULL);
if (NULL != m_hEmf)
{
DeleteEnhMetaFile(m_hEmf);
m_hEmf = NULL;
}
if (NULL != m_memDC)
{
DeleteDC(m_memDC);
}
}
void DrawOnRenderer(IASCRenderer* pRenderer, double x, double y, double width, double height)
{
CTemporaryCS oCS (&m_oCS);
if (NULL == pRenderer)
return;
m_oEMF.SetRenderer(pRenderer);
m_oEMF.SetRectDst(x, y, width, height);
RECT oRect;
oRect.left = 0;
oRect.top = 0;
oRect.right = 100;
oRect.bottom = 100;
int nEmumRes = ::EnumEnhMetaFile(m_memDC, m_hEmf, (ENHMFENUMPROC)EnumEMFCallbak, (void*)this, &oRect);
}
protected:
static int CALLBACK EnumEMFCallbak(HDC hDC, HANDLETABLE FAR *lpHandleTable, ENHMETARECORD FAR *lpEnhMetaRecord,
int nObj, LPARAM lpData)
{
CEMFFile* pFile = (CEMFFile*)lpData;
pFile->m_oEMF.SetRecord(lpEnhMetaRecord);
pFile->m_oEMF.SetTable(lpHandleTable);
pFile->m_oEMF.ProduceRecord();
return 1;
}
};