在写一个程序,需要保存所绘制的图形为emf/wmf格式的图片。这是我的图片保存代码:
void CMyUnit::SaveAsPic(CDC* pDC, CString t_FileName, CRect t_BmpRect)
{
CMetaFileDC dcm;
VERIFY(dcm.CreateEnhanced(NULL, t_FileName, NULL, NULL));
HENHMETAFILE t_EmfMeta; dcm.SetAttribDC(pDC->GetSafeHdc());
dcm.SetMapMode(MM_LOMETRIC);
dcm.DPtoLP(&t_BmpRect);
dcm.FillSolidRect(m_CanvasLogicalRect, RGB(255, 255, 255));
dcm.SetWindowExt(t_BmpRect.Width(), -1*t_BmpRect.Height());//设置大小,不过好像不起作用,疑惑 DrawItem(&dcm); //注解:这是本类中绘制图形的函数,其原型就是接受一个CDC指针 t_EmfMeta = dcm.CloseEnhanced();
::DeleteEnhMetaFile(t_EmfMeta);
}
正如代码注释中所提到的,我想设置最终保存出来的图片大小,不知道应该怎么办,还请知道的指点一下。
谢谢了……
void CMyUnit::SaveAsPic(CDC* pDC, CString t_FileName, CRect t_BmpRect)
{
CMetaFileDC dcm;
VERIFY(dcm.CreateEnhanced(NULL, t_FileName, NULL, NULL));
HENHMETAFILE t_EmfMeta; dcm.SetAttribDC(pDC->GetSafeHdc());
dcm.SetMapMode(MM_LOMETRIC);
dcm.DPtoLP(&t_BmpRect);
dcm.FillSolidRect(m_CanvasLogicalRect, RGB(255, 255, 255));
dcm.SetWindowExt(t_BmpRect.Width(), -1*t_BmpRect.Height());//设置大小,不过好像不起作用,疑惑 DrawItem(&dcm); //注解:这是本类中绘制图形的函数,其原型就是接受一个CDC指针 t_EmfMeta = dcm.CloseEnhanced();
::DeleteEnhMetaFile(t_EmfMeta);
}
正如代码注释中所提到的,我想设置最终保存出来的图片大小,不知道应该怎么办,还请知道的指点一下。
谢谢了……
在DrawItem中画的大小可能是不确定的,在画后,可以将结果贴图到dcm中,用StretchBlt函数!
{
CMetaFileDC dcm;
VERIFY(dcm.CreateEnhanced(NULL, NULL, NULL, NULL));//创建一个原始的在内存中的绘图图片
HENHMETAFILE t_EmfMeta; dcm.SetAttribDC(pDC->GetSafeHdc());
dcm.SetMapMode(MM_LOMETRIC);
dcm.FillSolidRect(m_CanvasLogicalRect, RGB(255, 255, 255));
dcm.SetWindowExt(t_BmpRect.Width(), -1*t_BmpRect.Height()); DrawItem(&dcm);//当然,大小还是程序之前已经设定好的逻辑大小,其调用信息存储在了metafile中
t_EmfMeta = dcm.CloseEnhanced(); CMetaFileDC des_dcm;
VERIFY(des_dcm.CreateEnhanced(NULL, t_FileName,NULL,NULL));//创建一个可以保存在硬盘上的metafile //des_dcm.SetMapMode(MM_LOMETRIC); //发现加上这句,整个图像就绘制反了(上下,左右皆反)
//在新的metafile中重放绘图操 作,并且限于指定的矩形范围内
PlayEnhMetaFile(des_dcm.GetSafeHdc(), t_EmfMeta, &t_BmpRect);
HENHMETAFILE des_EmfMeta = des_dcm.CloseEnhanced();
::DeleteEnhMetaFile(t_EmfMeta);
::DeleteEnhMetaFile(des_EmfMeta);
}