📄 emfmeger.cpp
字号:
#include "StdAfx.h"
#include "EmfMeger.h"
CEmfMerger::CEmfMerger(void)
{
m_enmuCountPrePage = COUNT_9;
m_strInputPath = _T("");
m_strOutputPath = _T("");
m_strCopyRight = _T("Emf Merger Made By ioernt(C)");
m_waterMark.strWaterMark = _T("This is Made By EmfMerger.");
m_waterMark.bLayerTop = true;
m_waterMark.cColor = RGB(0xcc, 0xcc, 0xcc);
m_waterMark.iHorizonPos = 30;
m_waterMark.iVerticalPos = 30;
m_waterMark.iAngle = 90;
m_waterMark.iTran = 75;
m_waterMark.oFont = NULL;
m_waterMark.bPreView = false;
m_waterMark.pEmfMerger = this;
m_strInputFileName = _T("幻灯片%d.emf");
m_outputFileName.strOutputFileName = _T("EmfMerger%03d.emf");
m_outputFileName.bCaseSence = true;
m_outputFileName.bUp = false;
m_iHSpace = 20;
m_iVSpace = 20;
m_iCurPageIdx = -1;
m_iMaxPageIdx = 1;
m_iPPTCount = 0;
m_bShowPageNum = true;
m_bContinueNum = true;
m_hCurEMF = NULL;
m_iPPT_Width = 0;
m_iPPT_Height = 0;
}
CEmfMerger::~CEmfMerger(void)
{
}
// 转换函数
int CEmfMerger::operator =(const enumCountPrePage& src)
{
return (int)src;
}
// 输入文件位置
CString CEmfMerger::GetInputPath()
{
return m_strInputPath;
}
void CEmfMerger::SetInputPath(CString strInputPath)
{
// 检查是否为目录
CFileFind fileFind;
fileFind.FindFile(strInputPath);
fileFind.FindNextFile();
if (fileFind.IsDirectory())
{
m_strInputPath = strInputPath+_T("\\");
}
int i=1;
CString strTemp;
strTemp.Format(m_strInputFileName, i);
while (TRUE == fileFind.FindFile(m_strInputPath+strTemp))
{
strTemp.Format(m_strInputFileName, ++i);
}
m_iPPTCount = i-1;
m_iMaxPageIdx = m_iPPTCount/m_enmuCountPrePage;
}
// 输出文件位置
CString CEmfMerger::GetOututPath()
{
return m_strOutputPath;
}
void CEmfMerger::SetOutputPath(CString strOutputPath)
{
CFileFind fileFind;
fileFind.FindFile(strOutputPath);
fileFind.FindNextFile();
if (fileFind.IsDirectory())
{
m_strOutputPath = strOutputPath;
}
}
// 每页幻灯片数
int CEmfMerger::GetCountPrePage()
{
return m_enmuCountPrePage;
}
void CEmfMerger::SetCountPrePage(enumCountPrePage eCount)
{
m_enmuCountPrePage = eCount;
m_iMaxPageIdx = m_iPPTCount/m_enmuCountPrePage+1;
}
// 幻灯片间距
int CEmfMerger::GetHSpace()
{
return m_iHSpace;
}
int CEmfMerger::GetVSpace()
{
return m_iVSpace;
}
void CEmfMerger::SetSpace(int iPixH, int iPixV)
{
if (iPixH >1 && iPixH < 200)
{
m_iHSpace = iPixH;
}
if (iPixV >1 && iPixV < 200)
{
m_iVSpace = iPixV;
}
}
// 版权信息
CString CEmfMerger::GetCopyRight()
{
return m_strCopyRight;
}
void CEmfMerger::SetCopyRight(CString strCopyRight)
{
if (strCopyRight.GetLength() < 30)
{
m_strCopyRight = strCopyRight;
}
}
// 水印信息
WaterMark CEmfMerger::GetWaterMark()
{
return m_waterMark;
}
void CEmfMerger::SetWaterMark(WaterMark waterMark)
{
m_waterMark = waterMark;
}
// 显示页码
bool CEmfMerger::GetShowPageNumStatus()
{
return m_bShowPageNum;
}
void CEmfMerger::SetShowPageNumStatus(bool bShow/* = true*/)
{
m_bShowPageNum = bShow;
}
// 页码连续显示
bool CEmfMerger::GetShowPageNumContinue()
{
return m_bContinueNum;
}
void CEmfMerger::SetShowPageNumContinue(bool bContinue /* = true */)
{
m_bContinueNum = bContinue;
}
// 输入文件名
CString CEmfMerger::GetInputFileName()
{
return m_strInputFileName;
}
void CEmfMerger::SetInputFileName(CString strInputFileName)
{
if (strInputFileName.Find(_T("%d")) != 0)
{
m_strInputFileName = strInputFileName;
}
}
// 输出文件名
OutputFileName CEmfMerger::GetOutputFileName()
{
return m_outputFileName;
}
void CEmfMerger::SetOutputFileName(OutputFileName outputFileName)
{
if (outputFileName.strOutputFileName.Find(_T("%")) != 0)
{
m_outputFileName = outputFileName;
}
}
// 当前显示 返回当前页编号
int CEmfMerger::GetCurPage() // 返回当前页编号
{
return m_iCurPageIdx;
}
int CEmfMerger::SetCurLastPage() // 设置当前页为最后一页
{
m_iCurPageIdx = m_iMaxPageIdx;
return m_iCurPageIdx;
}
int CEmfMerger::SetCurFirstPage() // ...
{
m_iCurPageIdx = 0;
return m_iCurPageIdx;
}
int CEmfMerger::SetCurPrePage() // ...
{
m_iCurPageIdx -= 1;
if (m_iCurPageIdx <0)
{
m_iCurPageIdx = 0;
}
return m_iCurPageIdx;
}
int CEmfMerger::SetCurNextPage() // ...
{
m_iCurPageIdx += 1;
if (m_iCurPageIdx > m_iMaxPageIdx)
{
m_iCurPageIdx = m_iMaxPageIdx;
}
return m_iCurPageIdx;
}
// 幻灯片数目
int CEmfMerger::GetPPT_Count()
{
return m_iPPTCount;
}
int CEmfMerger::GetMaxPageIdx()
{
return m_iMaxPageIdx;
}
// 获取当前Emf句柄
HENHMETAFILE CEmfMerger::GetCurEmfHandle()
{
// 更新当前Emf句柄
if (m_hCurEMF != NULL)
{
DeleteEnhMetaFile(m_hCurEMF);
m_hCurEMF = NULL;
}
// ...
CString strFileName;
CFileFind fileFind;
HDC hDrawDc = CreateEnhMetaFile(NULL, NULL, NULL, NULL);
for (int i=1;i<=m_enmuCountPrePage;i++)
{
CRect mRect = GetPosRect(i);
strFileName.Format(m_strInputFileName, m_iCurPageIdx*m_enmuCountPrePage+i);
strFileName = m_strInputPath+strFileName;
if (fileFind.FindFile(strFileName))
{
HENHMETAFILE hEMF = GetEnhMetaFile(strFileName);
if (i==1)
{
ENHMETAHEADER header;
if (sizeof(ENHMETAHEADER) == GetEnhMetaFileHeader(hEMF, sizeof(ENHMETAHEADER), &header))
{
m_iPPT_Width = header.rclBounds.right - header.rclBounds.left;
m_iPPT_Height = header.rclBounds.bottom - header.rclBounds.top;
m_iPPT_Height /= 4;
m_iPPT_Width /= 4;
}
}
if (hEMF != NULL)
{
PlayEnhMetaFile(hDrawDc, hEMF, GetPosRect(i));
HBRUSH hOldBush = (HBRUSH)SelectObject(hDrawDc, GetStockObject(NULL_BRUSH));
Rectangle(hDrawDc, mRect.left, mRect.top, mRect.right, mRect.bottom);
if (m_bShowPageNum)
{
CString strNum;
if (m_bContinueNum)
{
strNum.Format(_T("%d"), i+m_iCurPageIdx*(int)m_enmuCountPrePage);
}
else
{
strNum.Format(_T("%d"), i);
}
TEXTMETRIC tm;
HDC hTempDc = CreateEnhMetaFile(NULL, NULL, NULL, NULL);
HBRUSH hTempOldBrush = (HBRUSH)SelectObject(hDrawDc, GetStockObject(NULL_BRUSH));
GetTextMetrics(hDrawDc, &tm);
DrawText(hTempDc, strNum, strNum.GetLength(),
CRect(
1,
1,
tm.tmMaxCharWidth*strNum.GetLength(),
tm.tmHeight
), DT_CENTER);
SelectObject(hTempDc, hTempOldBrush);
HENHMETAFILE hTempEmf = CloseEnhMetaFile(hTempDc);
PlayEnhMetaFile(hDrawDc, hTempEmf,
CRect(mRect.right - (int)(mRect.Width()*0.15),
mRect.bottom - (int)(mRect.Height()*0.15),
mRect.right - (int)(mRect.Width()*0.08),
mRect.bottom - (int)(mRect.Height()*0.05)
)
);
DeleteEnhMetaFile(hTempEmf);
}
if (i == m_enmuCountPrePage)
{
DrawCopyRight(hDrawDc);
}
SelectObject(hDrawDc, hOldBush);
}
}
else
{
HDC hNullDc = CreateEnhMetaFile(NULL, NULL, NULL, NULL);
HPEN hNullPen = (HPEN)SelectObject(hNullDc, GetStockObject(NULL_PEN));
Rectangle(hNullDc, mRect.left, mRect.top, mRect.right, mRect.bottom);
SelectObject(hNullDc, hNullPen);
if (i == m_enmuCountPrePage)
{
DrawCopyRight(hNullDc);
}
HENHMETAFILE hNullEmf = CloseEnhMetaFile(hNullDc);
PlayEnhMetaFile(hDrawDc, hNullEmf, mRect);
DeleteEnhMetaFile(hNullEmf);
}
}
m_hCurEMF = CloseEnhMetaFile(hDrawDc);
return m_hCurEMF;
}
void CEmfMerger::DrawCopyRight(HDC hDrawDc)
{
TEXTMETRIC tm;
CRect mRect = GetPosRect(m_enmuCountPrePage);
GetTextMetrics(hDrawDc, &tm);
HDC hTempDc = CreateEnhMetaFile(NULL, NULL, NULL, NULL);
HBRUSH hTempOldBrush = (HBRUSH)SelectObject(hTempDc, GetStockObject(NULL_BRUSH));
DrawText(hTempDc, m_strCopyRight, m_strCopyRight.GetLength(),
CRect(
1,
1,
tm.tmMaxCharWidth*m_strCopyRight.GetLength(),
tm.tmHeight
), DT_CENTER);
SelectObject(hTempDc, hTempOldBrush);
HENHMETAFILE hTempEmf = CloseEnhMetaFile(hTempDc);
ENHMETAHEADER header;
float wBYh = 0.0f;
if (sizeof(ENHMETAHEADER) == GetEnhMetaFileHeader(hTempEmf, sizeof(ENHMETAHEADER), &header))
{
wBYh = (header.rclBounds.right - header.rclBounds.left) / (float)(header.rclBounds.bottom - header.rclBounds.top);
}
CRect tempRect;
int height = mRect.Height();
int width = mRect.Width();
tempRect.left = mRect.right - (int)(width*0.92);
tempRect.top = mRect.bottom - (int)(height*0.22);
tempRect.bottom = mRect.bottom - (int)(height*0.15);
tempRect.right = mRect.left + (int)(50*wBYh);
if (tempRect.right > mRect.right)
{
tempRect.right = mRect.right - 30;
}
PlayEnhMetaFile(hDrawDc, hTempEmf, tempRect);
DeleteEnhMetaFile(hTempEmf);
}
CRect CEmfMerger::GetPosRect(int i)
{
CRect mRect;
i -= 1;
switch(m_enmuCountPrePage)
{
case CEmfMerger::COUNT_2:
{
mRect.top = 1+(m_iPPT_Height+m_iVSpace)*(i%2);
mRect.left = 1+m_iHSpace;
mRect.right = mRect.left+m_iPPT_Width;
mRect.bottom = mRect.top+m_iPPT_Height;
}
break;
case CEmfMerger::COUNT_4:
{
mRect.top = 1+(m_iPPT_Height+m_iVSpace)*(i/2);
mRect.left = 1+(m_iPPT_Width+m_iHSpace)*(i%2);
mRect.right = mRect.left+m_iPPT_Width;
mRect.bottom = mRect.top+m_iPPT_Height;
}
break;
case CEmfMerger::COUNT_6:
{
mRect.top = 1+(m_iPPT_Height+m_iVSpace)*(i/2);
mRect.left = 1+(m_iPPT_Width+m_iHSpace)*(i%2);
mRect.right = mRect.left+m_iPPT_Width;
mRect.bottom = mRect.top+m_iPPT_Height;
}
break;
case CEmfMerger::COUNT_8:
{
mRect.top = 1+(m_iPPT_Height+m_iVSpace)*(i/2);
mRect.left = 1+(m_iPPT_Width+m_iHSpace)*(i%2);
mRect.right = mRect.left+m_iPPT_Width;
mRect.bottom = mRect.top+m_iPPT_Height;
}
break;
case CEmfMerger::COUNT_9:
{
mRect.top = 1+(m_iPPT_Height+m_iVSpace)*(i/3);
mRect.left = 1+(m_iPPT_Width+m_iHSpace)*(i%3);
mRect.right = mRect.left+m_iPPT_Width;
mRect.bottom = mRect.top+m_iPPT_Height;
}
break;
case CEmfMerger::COUNT_12:
{
mRect.top = 1+(m_iPPT_Height+m_iVSpace)*(i/3);
mRect.left = 1+(m_iPPT_Width+m_iHSpace)*(i%3);
mRect.right = mRect.left+m_iPPT_Width;
mRect.bottom = mRect.top+m_iPPT_Height;
}
break;
case CEmfMerger::COUNT_16:
{
mRect.top = 1+(m_iPPT_Height+m_iVSpace)*(i/4);
mRect.left = 1+(m_iPPT_Width+m_iHSpace)*(i%4);
mRect.right = mRect.left+m_iPPT_Width;
mRect.bottom = mRect.top+m_iPPT_Height;
}
break;
case CEmfMerger::COUNT_25:
{
mRect.top = 1+(m_iPPT_Height+m_iVSpace)*(i/5);
mRect.left = 1+(m_iPPT_Width+m_iHSpace)*(i%5);
mRect.right = mRect.left+m_iPPT_Width;
mRect.bottom = mRect.top+m_iPPT_Height;
}
break;
}
return mRect;
}
// 保存文件
void CEmfMerger::SaveAll()
{
if (m_iMaxPageIdx == 0)
{
SaveCur();
return ;
}
for (int i=0; i< m_iMaxPageIdx; i++)
{
m_iCurPageIdx = i;
SaveCur();
}
}
void CEmfMerger::SaveCur()
{
CString strFileName;
strFileName.Format(m_outputFileName.strOutputFileName, m_iCurPageIdx+1);
strFileName = m_strInputPath+strFileName;
CopyEnhMetaFile(GetCurEmfHandle(), strFileName);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -