Practical Learning Logo

MFC Library: CMetaFileDC

 

Introduction

A metafile is a series of instructions used to draw one or a group of graphics on a device context. Unlike drawing on a regular device context, a metafile includes its instructions in a normal windows file. The instructions are then used to draw what is necessary. One of the strengths of a metafile is that, because it is a Windows file, it can be accessed by any application that can read it. This means that you can create a metafile in your Visual C++ application and be able to open it in a graphics application like Paint Shop Pro.

Creating a Metafile

In Visual C++, a metafile can be created using the CMetaFileDC class. This class is based on CDC. For this reason, it inherits any type of drawing you can perform on a device context. This significantly reduces the amount of learning.

To start, you can declare a CMetaFileDC variable using its default constructor. Using this variable, call the Create() method to formally initiate the file. The syntax of the CMetaFileDC::Create() method is:

BOOL Create(LPCTSTR lpszFilename = NULL);

This methods takes an optional argument as the name of the file that will hold the instructions. If you don't supply the argument, a default file would be created. After calling the Create() method, you can perform any necessary drawing on the CMetaFileDC variable as you would proceed with a CDC object.

After using the CMetaFileDC variable, you should close it. This is done by calling the Close() method. Its syntax is:

HMETAFILE Close();

Here is an example:

void CMFCMetaFile1View::OnDraw(CDC* /*pDC*/)
{
	CMFCMetaFile1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: add draw code for native data here
	CMetaFileDC mfDC;

	mfDC.Create("Meta1.wmf");

	CBrush BrushGreen(RGB(0, 125, 5));
	CBrush BrushRed(RGB(255, 2, 5));
	CBrush BrushYellow(RGB(250, 255, 5));
	CBrush BrushBlue(RGB(0, 2, 255));
	CBrush *pBrush;
	
	CPoint Pt[3];

	// Top Triangle
	Pt[0] = CPoint(125,  10);
	Pt[1] = CPoint( 95,  70);
	Pt[2] = CPoint(155,  70);

	pBrush = mfDC.SelectObject(&BrushGreen);
	mfDC.Polygon(Pt, 3);

	// Left Triangle
	Pt[0] = CPoint( 80,  80);
	Pt[1] = CPoint( 20, 110);
	Pt[2] = CPoint( 80, 140);

	pBrush = mfDC.SelectObject(&BrushRed);
	mfDC.Polygon(Pt, 3);

	// Bottom Triangle
	Pt[0] = CPoint( 95, 155);
	Pt[1] = CPoint(125, 215);
	Pt[2] = CPoint(155, 155);
	
	pBrush = mfDC.SelectObject(&BrushYellow);
	mfDC.Polygon(Pt, 3);

	// Right Triangle
	Pt[0] = CPoint(170,  80);
	Pt[1] = CPoint(170, 140);
	Pt[2] = CPoint(230, 110);

	pBrush = mfDC.SelectObject(&BrushBlue);
	mfDC.Polygon(Pt, 3);

	mfDC.SelectObject(pBrush);
}

After creating a metafile, it becomes a regular Windows file:

You can open it in your application when necessary. Here is an example that opens the above metafile when the user clicks the view area of the application:

void CMFCMetaFile1View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	CClientDC client(this);
	HMETAFILE hMF = GetMetaFile("Meta1.wmf");
	client.PlayMetaFile(hMF);

	CView::OnLButtonDown(nFlags, point);
}

Of course, you can also provides the user with the ability to select a metafile to open using the File Dialog box. As mentioned already, a metafile can also be opened by any application that can read it. For example, here is the above metafile opened in Paint Shop Pro: 

 

Home Copyright © 2002-2007 FunctionX, Inc.