我最近开始学习MFC,到目前为止,让我真正感到困惑的第一件事是增强型元文件,特别是这两个函数中矩形的目的和区别

BOOL CreateEnhanced(
   CDC* pDCRef,
   LPCTSTR lpszFileName,
   LPCRECT lpBounds,
   LPCTSTR lpszDescription
);


BOOL PlayEnhMetaFile(
  _In_  HDC hdc,
  _In_  HENHMETAFILE hemf,
  _In_  const RECT *lpRect
);

我已经编写了一个函数DrawLogo来创建增强型图元文件,如下所示:
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范围。

谁能提供解释?谢谢。

编辑:

按照要求:

最佳答案

传递给RECTPlayEnhMetaFile仅用于缩放基于创建图元文件时提供的边界框绘制的图像。如果图元文件在边界框之外绘制,那么它也将在RECT外部绘制。如果要将图像剪切为RECT,则在播放图元文件之前在DC上设置剪切区域。如果要缩放图像以使其适合RECT,则在创建图元文件时需要提供正确的边界框。

关于c++ - 关于增强型图元文件的说明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25087880/

10-10 06:27