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.
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:
|
|