⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emfmeger.cpp

📁 EmfMerger幻灯片打印辅助工具,能将几张幻灯片合并后打印. 可以任意调节各幻灯片的间距
💻 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 + -