在写一个程序,需要保存所绘制的图形为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);
}
正如代码注释中所提到的,我想设置最终保存出来的图片大小,不知道应该怎么办,还请知道的指点一下。
谢谢了……

解决方案 »

  1.   

    估计楼主最终也是贴图吧!
    在DrawItem中画的大小可能是不确定的,在画后,可以将结果贴图到dcm中,用StretchBlt函数!
      

  2.   

    fandh可否用代码表达一下你的意思,图形这块我懂得实在不多,谢谢了……
      

  3.   

    昨晚查了一下programming Windows,从上面学了一招,可以解决设置保存图片大小的问题:
    {
    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);
    }
      

  4.   

    哦  再补充一点,函数中使用的t_BmpRect(要保存的emf格式图片的矩形区域大小,当然不一定是bmp格式的),其单位是物理单位,像素之类的……