最近,我开始学习MFC,到目前为止,我真正感到困惑的第一件事是增强的MetaFiles,特别是这两个函数中边界矩形的用途和区别。
BOOL CreateEnhanced(
CDC* pDCRef,
LPCTSTR lpszFileName,
LPCRECT lpBounds,
LPCTSTR lpszDescription
);
BOOL PlayEnhMetaFile(
_In_ HDC hdc,
_In_ HENHMETAFILE hemf,
_In_ const RECT *lpRect
);我编写了一个函数DrawLogo,它创建了如下所示的增强MetaFile:
CMetaFileDC mf;
CString mf_name = CString("name.emf");
CRect bnds = CRect(0,0, 8000, 8000);
mf.CreateEnhanced(pDC, mf_name, &bnds, mf_name);
//some drawing...
mf.CloseEnhanced();然后,我从另一个功能中“演奏”它:
CString mf_name = CString("name.emf");
DrawLogo(pDC);
HENHMETAFILE hmf;
hmf = GetEnhMetaFile(mf_name);
ENHMETAHEADER mfh;
GetEnhMetaFileHeader(hmf, sizeof(ENHMETAHEADER), &mfh);
int width = mfh.rclBounds.right - mfh.rclBounds.left;
int height = mfh.rclBounds.bottom - mfh.rclBounds.top;
TRACE("WIDTH = %d", width);
TRACE("HEIGHT = %d", height);
PlayEnhMetaFile(pDC->m_hDC, hmf, CRect(0, 0, width, height));
//and I draw a rect using same bounds
CRect frame = CRect(0, 0, width, height);
pDC->Rectangle(&frame);因此,我的预期是图元文件将在frame CRect中,但事实并非如此--图像超出了rect边界。
有人能解释一下吗?谢谢。
编辑:
应要求:

发布于 2014-08-01 20:59:00
传递给PlayEnhMetaFile的PlayEnhMetaFile仅用于缩放根据创建图元文件时提供的边界框绘制的图像。如果图元文件在边界框之外绘制,那么它也将在RECT之外绘制。如果您希望将图像裁剪为RECT,那么在播放图元文件之前,在DC上设置一个裁剪区域。如果要缩放图像以使其适合RECT,则在创建图元文件时需要提供正确的边界框。
https://stackoverflow.com/questions/25087880
复制相似问题